diff --git a/TODO b/TODO index 6b440f3..f43d284 100644 --- a/TODO +++ b/TODO @@ -17,6 +17,8 @@ vault checksum: add keysigs as well enable formats for secret key exports as well +Add newlines to headers in define.h, so strlen() later catches the whole length. + Z85 headers: - currently I use "----- BEGIN ... -----" and "----- END ... -----" as header and footer for various z85 encoded outputs. The problem is, that @@ -42,10 +44,6 @@ Z85 headers: is marked as to be ignored which could be saved as a state when using blockmode. -PCPSTREAM changes: - - enable determine armor mode of input, parse headers, comments - and newlines away, decode and return the binary result with ps_read() - as before. Python binding, e.g.: py % cdll.LoadLibrary("libsodium.so.8") diff --git a/libpcp/ed.c b/libpcp/ed.c index de021e1..12055c9 100644 --- a/libpcp/ed.c +++ b/libpcp/ed.c @@ -81,13 +81,14 @@ size_t pcp_ed_sign_buffered(Pcpstream *in, Pcpstream* out, pcp_key_t *s, int z85 crypto_generichash_init(st, NULL, 0, 0); if(z85) - ps_print(out, "%s\nHash: Blake2\n\n", PCP_SIG_HEADER); + ps_print(out, "%s\r\n Hash: Blake2\r\n\r\n", PCP_SIG_HEADER); while(!ps_end(in)) { cur_bufsize = ps_read(in, &in_buf, PCP_BLOCK_SIZE); /* fread(&in_buf, 1, PCP_BLOCK_SIZE, in); */ if(cur_bufsize <= 0) break; outsize += cur_bufsize; + crypto_generichash_update(st, in_buf, cur_bufsize); ps_write(out, in_buf, cur_bufsize); /* fwrite(in_buf, cur_bufsize, 1, out); */ } @@ -104,10 +105,10 @@ size_t pcp_ed_sign_buffered(Pcpstream *in, Pcpstream* out, pcp_key_t *s, int z85 size_t mlen = + crypto_sign_BYTES + crypto_generichash_BYTES_MAX; if(z85) { - ps_print(out, "\n%s\n Version: PCP v%d.%d.%d\n\n", PCP_SIG_START, PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH); + ps_print(out, "\r\n%s\r\n~ Version: PCP v%d.%d.%d ~\r\n\r\n", PCP_SIG_START, PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH); size_t zlen; char *z85encoded = pcp_z85_encode((unsigned char*)signature, mlen, &zlen); - ps_print(out, "%s\n%s\n", z85encoded, PCP_SIG_END); + ps_print(out, "%s\r\n%s\r\n", z85encoded, PCP_SIG_END); } else { ps_print(out, "%s", PCP_SIGPREFIX); @@ -134,12 +135,12 @@ pcp_pubkey_t *pcp_ed_verify_buffered(Pcpstream *in, pcp_pubkey_t *p) { unsigned char hash[crypto_generichash_BYTES_MAX]; char zhead[] = PCP_SIG_HEADER; size_t hlen = strlen(PCP_SIG_HEADER); - size_t hlen2 = 15; /* hash: blake2\n\n */ + size_t hlen2 = 17; /* " hash: blake2\r\n\r\n" FIXME: parse and calculate */ size_t mlen = + crypto_sign_BYTES + crypto_generichash_BYTES_MAX; size_t zlen = 262; /* FIXME: calculate */ unsigned char z85encoded[zlen]; unsigned char sighash[mlen]; - char z85sigstart[] = PCP_SIG_START; + char z85sigstart[] = "\n" PCP_SIG_START; /* FIXME: verifies, but it misses the \r! */ char binsigstart[] = PCP_SIGPREFIX; char sigstart[] = PCP_SIG_START; size_t siglen, startlen; @@ -154,8 +155,8 @@ pcp_pubkey_t *pcp_ed_verify_buffered(Pcpstream *in, pcp_pubkey_t *p) { /* look for z85 header and cut it out */ if(_findoffset(in_buf, cur_bufsize, zhead, hlen) == 0) { /* it is armored */ - next_bufsize = cur_bufsize - (hlen+hlen2); /* size - the header */ - memcpy(in_next, &in_buf[hlen+hlen2], next_bufsize); /* tmp save */ + next_bufsize = cur_bufsize - (hlen+hlen2+2); /* size - the header */ + memcpy(in_next, &in_buf[hlen+hlen2+2], next_bufsize); /* tmp save */ memcpy(in_buf, in_next, next_bufsize); /* put into inbuf without header */ if(cur_bufsize == PCP_BLOCK_SIZE/2) { /* more to come */ @@ -320,11 +321,11 @@ size_t pcp_ed_detachsign_buffered(Pcpstream *in, Pcpstream *out, pcp_key_t *s) { unsigned char *signature = pcp_ed_sign(hash, crypto_generichash_BYTES_MAX, s); size_t mlen = + crypto_sign_BYTES + crypto_generichash_BYTES_MAX; - ps_print(out, "\n%s\n Version: PCP v%d.%d.%d\n\n", + ps_print(out, "\r\n%s\r\n~ Version: PCP v%d.%d.%d ~\r\n\r\n", PCP_SIG_START, PCP_VERSION_MAJOR, PCP_VERSION_MINOR, PCP_VERSION_PATCH); size_t zlen; char *z85encoded = pcp_z85_encode((unsigned char*)signature, mlen, &zlen); - ps_print(out, "%s\n%s\n", z85encoded, PCP_SIG_END); + ps_print(out, "%s\r\n%s\r\n", z85encoded, PCP_SIG_END); free(st); diff --git a/libpcp/pcpstream.c b/libpcp/pcpstream.c index 20c2939..12b5567 100644 --- a/libpcp/pcpstream.c +++ b/libpcp/pcpstream.c @@ -156,7 +156,10 @@ size_t ps_read_next(Pcpstream *stream) { } size_t ps_read(Pcpstream *stream, void *buf, size_t readbytes) { - if(buffer_size(stream->cache) > 0) { + if(stream->cache == NULL) { + return ps_read_raw(stream, buf, readbytes); + } + else if(buffer_size(stream->cache) > 0) { /* use cache */ return ps_read_cached(stream, buf, readbytes); } diff --git a/tests/bart.pub b/tests/bart.pub index bde1e24..906d8bb 100644 --- a/tests/bart.pub +++ b/tests/bart.pub @@ -1,8 +1,8 @@ ------BEGIN ED25519-CURVE29915 PUBLIC KEY----- -22+xo&VP4UGh@KXT$:IpoIwo:$W75Q(sHH4yC*uSpj -6Q?pArQ2f#GNts*!K=dlz9tp{1>a!vrhbAbOY7SP-[!WPc6Y.Stywuw?#A-S -------END ED25519-CURVE29915 PUBLIC KEY------ +~~~~~BEGIN ED25519-CURVE29915 PUBLIC KEY~~~~~ +22+[E/=.$41#M]-p3Z*%mJukC}Az}B1oy^NZQodOb+b/vpHh6fA/A944@{IMelG{62mGJ +m9=#BHf}C+wnm]q@Ts>0&wN0UDH>Rm7+]8@<[fYHG>Em7026*4BOF5#qVZBr+RPvPrmFy:# +v5khdlw:Ym>>*%uPeej4FJk^>lj{byzcNiGCk#%?ht]4ni@+5PJxsHLFb/MH +~~~~~END ED25519-CURVE29915 PUBLIC KEY~~~~~ diff --git a/tests/key-alicia-pub b/tests/key-alicia-pub index 94f1936..2a4afe5 100644 --- a/tests/key-alicia-pub +++ b/tests/key-alicia-pub @@ -1,8 +1,8 @@ ------BEGIN ED25519-CURVE29915 PUBLIC KEY----- -22+xo&up=TJq/H8i=qIeA%U5iGbic3w$dC6kLc:p.fJ=&pdMw&ZqH#gQ=QFKRO?:=)r@XG7 -?kfpERt62d?W(20JO&n?B)Fwix0ppXm+VXP*52nl((un]KG@P?x{}nFm!)8bo^9)000040- -F%k&q-&T1oRSV{f^}300AQc?s+mS000Gy00SAaB7GxavqFyGHg*L!01P+z1PO:BCwZ#jl2p -mBx<*#w02caE1on.&yPsfgJj1n -1xc9hC8YWL[E]PV#0v{n-{LG0b6CaKdGehPuS$5@.yoIS!umb703sV)YsqUen6BDX(NNhog -2r/mj%gl*uGxA4BB1CET3iI!W2nf.w@H:D!/@w*&iQKShk6.fUC]=Y?L2eLTOb-J? -------END ED25519-CURVE29915 PUBLIC KEY------ +~~~~~BEGIN ED25519-CURVE29915 PUBLIC KEY~~~~~ +22+[E!fex*BR+=DXNjIW*d]B9yhJyNrMg0#a!%V*Xbws>g4J+ +iHwx}-&tG+bR-@GioqlzuJq[GE*3My.aX]SmgU:zaB%=y].Owpf1Al4i0FCA>lF<{mMi$2> +s=p/)jfQgIX:Qi:EGr6&^d)R2%a/@Th!*(Uhi>$WMI+l}oi%=1Yj[(RwQ{deEe{Hk[L8JxCJwcIciQ=OTOX65qmUv1p>^m=Of&W^4 -ozR-m9XQddU0[anustRmczs9{Qs{>TQ+^:^mw9L2>v.n6TAcb/0hYgq7.Dg?U[GcBBViJS4 -n}H=AZ(&[!T$ds31r3%0=]@jA!Yf*v8U5=[aCf?jVi}gEHkUo>A/]r -G()uc].p#=!/{2EwMNYKRjh@(WSWjE8EvuA!1HJ968n:NeZ7t}23ojc)ccZ[ZPY+=I>5$An -iUrok!Fdq7Oe3}B}K00>)phQWRurxUx:P&5[F44 -z7K.&-Ga%mko-AJ0spBbjrtESzoNTMMFOoK%mYEkfeB&ve:D@t>95TRk8Mw2M+@!6 -------END ED25519-CURVE29915 PRIVATE KEY------ +~~~~~BEGIN ED25519-CURVE29915 PRIVATE KEY~~~~~ +b)<0bbd}YplZUMB5il+5:yT5rzgMmfMGzVsol@fivj)]6gVuEx.rgTm.XgQcQmP&>bOo(6V +d5=Wl5FnFQ{.7iH(:rE?Yjnxx*H#Vx*qH5H1zGu-x9OgK.aqgH+k[aID6Qef^.98y=X(Umu +zUH0tlM6TJ/Egz./:3/^QtOu?CvSBC>6[gto2J&gQhxFhOir4qen:9QXK)y]q80zoP6L^eBLW^%Rk4T3ex% +M[UiZ6c:4)PaZfE+$QZWql}6F:AYon/KLanU?YRLhN7CUFhXbo^9)000040- -F%k&S5@U1oRSV{f[1400AQc?s+mS000Gy00SAaB7GxavqHLMTKWvK01GXy1POZACwZ#jlt{ -sxC(N*A6bgAH01iTLx(4l%vQ:QFy&r/(yYBCn0uh3+3WXH/aj@2g@U4h&A.[suZOrEcxt:S -pz/=LgpS9et:befV3/ZKE%2.em:}EQwd02=srn*U=[4^{my#U{V>3KS&T4*C2?HIf]k{wAb -eU^JLY2nqpr#d5QWCan$*)UCv8DDBLQiZ#.r-thxN2@:5nmY!{SRT1o2(Bb( -------END ED25519-CURVE29915 PUBLIC KEY------ +~~~~~BEGIN ED25519-CURVE29915 PUBLIC KEY~~~~~ +22+[E!/&)#+yclyjgq?Y9P}g0]H-5>PqR?^-neRWuv(BqUQ0q +wUX:VK[pL!I6viWj2ubRztI:1pwzz9!Kc*H53+pMJIjUfHMo@]qo%0yI:7]bo^9)000040- +GFA/8L^J1oRS&Qe}r{00AQc)4NIX000Gy00SAaB7GxavqE8AG8U/J01GXy1POZACwZ#jlt{ +sxC(N*A6bgAH01iTLx(4l%vQ:QFy&r/(yYBCn0uh2*MY}4Ts:6[Y!T3tzq-D:XF-Dq*srnDc^)ed+.9wMS76]gnTr+Chj!dz%]vUIqNK)IH+Y.}tzSp4dx +O9$ZdRB[0N5QD#hgeq:29t9${Mmoyhkd=1.vK6]iPGRk*enlj:zE=ZU:J +~~~~~END ED25519-CURVE29915 PUBLIC KEY~~~~~ diff --git a/tests/key-bobby-sec b/tests/key-bobby-sec index 98f5280..31f37cb 100644 --- a/tests/key-bobby-sec +++ b/tests/key-bobby-sec @@ -1,8 +1,8 @@ ------BEGIN ED25519-CURVE29915 PRIVATE KEY----- -Co7vyr/c(-D02qI>CpF/BlSfb7fVB/pCVA-VIUt!!^tf+ulAL*:9sEvXapLZjMHNxW.rjjG -s}XY1!8T.@w)[1PQc)4zLf94=tmpyQhg}C@h3q5F[H -/QA*(>XR6]!lZZ$f=Ax0#Tlu-K${>0*%sM!}-Gz2nC9f#+ZLUM5o[JafYtK3FNYc4!^@Tn] -V{WPck&bYgnK1qxn.i=nxd6*CxlarQgO]K@n@3)P8kXe2NzVYNq$]VfXT>D>FJOwfN@0yqF --Uc+3sIg.umqi:9!AQ!5RG6HWgM-4]bzQx}gO<5u@k&Fl)ZL5wo@VAq5U!RJDPtvV#4J}3$t2vLbh&#Xy$rkTK%6E1V.7F4T#D$nyI -------END ED25519-CURVE29915 PRIVATE KEY------ +~~~~~BEGIN ED25519-CURVE29915 PRIVATE KEY~~~~~ +s/Kxk/+qqBnP!erxq{]ai6+BkWc{nC=Xy+i9}+LSR)ZfN5Cm*4[N?Ra!JFm]*POClYeTcw) +q[juqJ-}Pi1ht!j8l$IM8nLKaIfY/JuITR:J5#j/#H3dFY=YWW%AhfyCm2@+nzd12SL(]i$ +#Za6b%^GyG[U.qS%tHb5YvVQg/4KvdEEoM!}Cxk[ci3sRA$aeSngGa6Slj5z&u7/^kNX2h* +(*yV15+HfdwcE&H/k<5*Ih2Iik+1F^WJJIK@7jE>jmQS0P5)sZi#ZaLOI>-q-ShW$%i(h>V +Th(wzVmBnjg2a32wZ5xyf?PkbNmh!oza-3PL2$itvb)ih/yK!%HP}*iaS@+CPSJdjb.q-iG ++MIh1CxgeRL*Scd+e&F%o.pMf2p>LMHYtBH0]SuWZJ3f:6(&%TgAW&05e1}3 +~~~~~END ED25519-CURVE29915 PRIVATE KEY~~~~~ diff --git a/tests/keys.cfg b/tests/keys.cfg index 1d74bcd..c587b1a 100644 --- a/tests/keys.cfg +++ b/tests/keys.cfg @@ -1,6 +1,6 @@ -bartid = 0xD6FBCA192A69BC19 -bartserial = 0xBE9710AB -idbobby = 0xA907B927849B39F9 -idalicia = 0x5F6F5F2B1FEFF482 +bartid = 0x81E0427F3EE40B39 +bartserial = 0xEDCCBD5B +idbobby = 0xEDF476444C8B5721 +idalicia = 0xD467BA4B3187236F mailbobby = bobby@local mailalicia = alicia@local diff --git a/tests/static.h b/tests/static.h index 0838bac..49e0013 100644 --- a/tests/static.h +++ b/tests/static.h @@ -1,33 +1,33 @@ size_t secret_a_len = 32; unsigned char secret_a[32] = { -0xb8, 0xb6, 0x65, 0x7e, 0x5b, 0x6b, 0x7b, 0x8d, -0x94, 0xc1, 0x8c, 0xef, 0x22, 0xbd, 0xbc, 0x16, -0xea, 0xf7, 0x62, 0x88, 0xd2, 0x87, 0x07, 0xb5, -0x95, 0x1c, 0x88, 0x3d, 0xde, 0x8d, 0xb9, 0x40 +0x48, 0x59, 0xdb, 0xdb, 0x16, 0xfe, 0xa0, 0x17, +0xc8, 0x34, 0x38, 0x32, 0x29, 0x41, 0x56, 0xf1, +0x35, 0x5d, 0x20, 0x52, 0xa2, 0x54, 0xeb, 0x67, +0xb2, 0xd9, 0x5d, 0xa2, 0x90, 0xbc, 0x19, 0x55 }; size_t public_a_len = 32; unsigned char public_a[32] = { -0x3a, 0xe2, 0xd2, 0x7d, 0xae, 0x30, 0xd0, 0x8f, -0x28, 0xa6, 0x8e, 0xb3, 0xec, 0xaf, 0x86, 0x66, -0x31, 0x13, 0xf6, 0xdb, 0xf0, 0xc5, 0xf8, 0xc0, -0xc1, 0xde, 0x4e, 0xf0, 0xb2, 0x54, 0xe8, 0x68 +0xfd, 0x9e, 0x3b, 0xe5, 0x99, 0x13, 0x22, 0xf6, +0xc8, 0x42, 0x10, 0x6e, 0x75, 0xd5, 0xe4, 0xcd, +0x1d, 0x69, 0xbf, 0x31, 0xbc, 0xfc, 0x2c, 0x27, +0xb7, 0xd2, 0x0f, 0xcc, 0xa6, 0x6e, 0x92, 0x38 }; size_t secret_b_len = 32; unsigned char secret_b[32] = { -0x68, 0xe2, 0xd6, 0x8a, 0x3d, 0xbd, 0x16, 0x13, -0x29, 0xcc, 0x8f, 0x8f, 0x32, 0x44, 0x78, 0x04, -0xcc, 0x50, 0xe4, 0x9e, 0x4c, 0x5a, 0x32, 0xb5, -0x97, 0xfa, 0x37, 0xaf, 0x59, 0x6f, 0xd7, 0x63 +0x88, 0x06, 0xfd, 0x5d, 0x6f, 0x45, 0xd0, 0x0e, +0xea, 0x66, 0xc9, 0xdc, 0xda, 0x38, 0xd4, 0xa8, +0x06, 0x81, 0xd9, 0x31, 0x9b, 0x22, 0x2d, 0xef, +0x4e, 0x69, 0x00, 0xc4, 0x8c, 0xdf, 0x4e, 0x44 }; size_t public_b_len = 32; unsigned char public_b[32] = { -0xfb, 0xbb, 0xaf, 0x50, 0x62, 0x94, 0xb0, 0x6d, -0x66, 0xd8, 0x3d, 0x2f, 0xf2, 0x9f, 0xad, 0xe2, -0xe4, 0x15, 0xfe, 0x72, 0x33, 0xee, 0x36, 0xca, -0xa1, 0xc9, 0x15, 0x76, 0x20, 0x10, 0x7d, 0x71 +0xdc, 0xc2, 0xcf, 0xe2, 0xc9, 0x3e, 0xe0, 0xf7, +0x33, 0x6f, 0xb8, 0xab, 0xe4, 0xb4, 0xe1, 0x6d, +0x82, 0xcb, 0xcc, 0xfa, 0x83, 0xc4, 0x8d, 0x09, +0x6f, 0x24, 0xec, 0xe0, 0xf3, 0x93, 0xce, 0x73 }; size_t message_len = 12; @@ -38,16 +38,16 @@ unsigned char message[12] = { size_t nonce_len = 24; unsigned char nonce[24] = { -0xbe, 0x81, 0x4b, 0xb0, 0x16, 0xcf, 0x3c, 0x70, -0xf2, 0x28, 0xc9, 0x26, 0xa2, 0x07, 0xa8, 0x29, -0x8d, 0x66, 0xb5, 0x91, 0x4b, 0x66, 0x17, 0xce +0x5e, 0xa0, 0xbd, 0x53, 0x16, 0xbf, 0x91, 0x2d, +0xfc, 0xe7, 0x1c, 0x0d, 0x4c, 0x9f, 0x79, 0xd1, +0x4d, 0x98, 0x3c, 0x2b, 0x1e, 0x47, 0x35, 0x0d }; size_t cipher_len = 28; unsigned char cipher[28] = { -0xb2, 0xfd, 0xe8, 0xc3, 0xd0, 0xe1, 0x40, 0x33, -0x28, 0xb4, 0x87, 0x6b, 0x70, 0x56, 0x7a, 0xe8, -0xcf, 0x7d, 0x1d, 0xd6, 0x93, 0x0e, 0x62, 0x0b, -0xe3, 0xb5, 0x8c, 0x13 +0xac, 0x06, 0x36, 0x4d, 0xd0, 0xa7, 0x58, 0x4e, +0x18, 0x35, 0x99, 0x29, 0x2b, 0x1e, 0x4a, 0x08, +0x1e, 0xcd, 0xd3, 0xc7, 0xce, 0x4a, 0xd1, 0xa7, +0x3e, 0x78, 0x94, 0xe9 }; diff --git a/tests/unittests.cfg b/tests/unittests.cfg index 9545418..c35e94c 100644 --- a/tests/unittests.cfg +++ b/tests/unittests.cfg @@ -63,7 +63,7 @@ dxmorg@florida.cops.gov cmd = $pcp -V $vault -l | tail -1 | cut -d ' ' -f 1 | xargs $pcp -V $vault -t -i - expect = /BEGIN PCP SECRET KEY/ + expect = /Serial Number/ diff --git a/tests/unknown1 b/tests/unknown1 index b52bd6d..6c04693 100644 --- a/tests/unknown1 +++ b/tests/unknown1 @@ -1,8 +1,8 @@ ------BEGIN ED25519-CURVE29915 PUBLIC KEY----- -22+xo&#]]jo8ntzJdf3QOkX-?]{jsn*T7)bkb!*E?l+0}597ZR.>zH3yC=>rmV%>x -{CE4Mmn!J)2xow-RnXP?P@Og2.+H>REO$:POku50jv&Rb3%wP{7ppH<-*!Fbo^9)000040- -F%k&@x5V1oRSV{g17500AQc?s+sU000Gy00SAaB7GxavqJ]JtFp7q01Y?A1PO^CCwZ#jpha -oRvqYPQ000-F00Aohzddc{zFrW0vqYQvy&r/(yYBCn0uh3+0SAsp.}Awq)aYXJM#kKi3d{Sp/Dc{g=HF#Iu4UBLkc[(ErCcm9)b=dbaYckZW(&NR(020)%g}mkfkJsr} -------END ED25519-CURVE29915 PUBLIC KEY------ +~~~~~BEGIN ED25519-CURVE29915 PUBLIC KEY~~~~~ +22+[E*94)L5kvZrVv&2kb@a+ka?%vr7IZ=d{$(<%-=#gX8ADWg*Hk+Am.OW&C&JDg]N*z:O +M:v9Sk$22F$*)4g3fMPo*O$G+1Wf>8TwQm[E)pySYiO(:W7k9Rj=R]njrL3bo^9)000040- +GFA*w?iN1oRS&QfvP$00AQc)4NU-000Gy00SAaB7GxavqI(09ThPA01Y?A1PO^CCwZ#jpha +oRvqYPQ000-F00Aohzddc{zFrW0vqYQvy&r/(yYBCn0uh4nIbbYsQi?(@98>0gb$OpjX0Fn-Yay2+>e#F[$p]x)/v9B9mF:1T9N>8lM/vf5y/rQ# -=)*(:hVYIMa]ju)xp@()t<&Igi2=@0FTn^u:xplZSr^r.Zl}Ebsq.x2@)Ww}5og>8Hs0mW3h4HQU.)6rBM:K)}YL[l -wiO:s+ZUZ(NY-P/9qV.C1TRQc<+vlfg{xfrMy -Wbw%^5]6jTZ:?b01aHWx:l//5lq&>NCMo}hVzisL]LO^MUW-+$zXF61=a$SR2Ut={ -------END ED25519-CURVE29915 PRIVATE KEY------ +~~~~~BEGIN ED25519-CURVE29915 PRIVATE KEY~~~~~ +4Bs0#CKTjpx5[Xz(V:e9CN(HNl}X%Q+#6u9qDaba=EpllyA!cI)k-(wM<2TB}y7Ze3zUjTG +/GH7NBGFP0d#084T-Nk8cnp&W:(@QUg/]4[ih&QAZ++!QtHC:dW{^tfMz@j&0^BYeHYzL)! +O/YRSn-)06FoVHt$Ef1i%rhMZAI4(%jc-:+FHPXB3qYZ{JIz^rcb+XE%WerZ6st{Uj5$.Zn +q@Yt-2NIM^]3)sc8VkaDWk60mV-{.iEy]7s:b15xt#0lE}ybXRKc8{FLv!bM*pPw^#a.GRe +1uh/pUocpnHaky66.LX?}:&VxW/.=N[6vnsJJhx*o5< +~~~~~END ED25519-CURVE29915 PRIVATE KEY~~~~~ diff --git a/tests/unknown4 b/tests/unknown4 index ca3d14d..e69de29 100644 --- a/tests/unknown4 +++ b/tests/unknown4 @@ -1 +0,0 @@ -5´‚b<±CµP}½<ÐY@BÕƒÕèðeï¼sâ2¾ó é4„QÊ”òx-c¬