From 799c2bf8e8dccbafa88917237dac763725174982 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Sun, 3 Jul 2022 10:04:07 +0200 Subject: [PATCH] tests: add armor tests --- internal/testkit/testkit.go | 37 +++++++++++++++- testdata/testkit/armor | Bin 0 -> 577 bytes testdata/testkit/armor_crlf | Bin 0 -> 644 bytes testdata/testkit/armor_empty_line_begin | Bin 0 -> 510 bytes testdata/testkit/armor_empty_line_end | Bin 0 -> 510 bytes testdata/testkit/armor_eol_between_padding | Bin 0 -> 514 bytes testdata/testkit/armor_full_last_line | Bin 0 -> 625 bytes testdata/testkit/armor_garbage_encoded | Bin 0 -> 89419 bytes testdata/testkit/armor_garbage_leading | Bin 0 -> 517 bytes testdata/testkit/armor_garbage_trailing | Bin 0 -> 517 bytes testdata/testkit/armor_header_crlf | Bin 0 -> 571 bytes testdata/testkit/armor_headers | Bin 0 -> 536 bytes .../testkit/armor_invalid_character_header | Bin 0 -> 509 bytes .../testkit/armor_invalid_character_payload | Bin 0 -> 509 bytes testdata/testkit/armor_long_line | Bin 0 -> 505 bytes testdata/testkit/armor_lowercase | Bin 0 -> 509 bytes testdata/testkit/armor_no_end_line | Bin 0 -> 476 bytes testdata/testkit/armor_no_eol | Bin 0 -> 632 bytes testdata/testkit/armor_no_match | Bin 0 -> 504 bytes testdata/testkit/armor_no_padding | Bin 0 -> 540 bytes testdata/testkit/armor_not_canonical | Bin 0 -> 542 bytes testdata/testkit/armor_pgp_checksum | Bin 0 -> 516 bytes testdata/testkit/armor_short_line | Bin 0 -> 509 bytes testdata/testkit/armor_whitespace_begin | Bin 0 -> 511 bytes testdata/testkit/armor_whitespace_end | Bin 0 -> 511 bytes testdata/testkit/armor_whitespace_eol | Bin 0 -> 510 bytes testdata/testkit/armor_whitespace_last_line | Bin 0 -> 510 bytes testdata/testkit/armor_whitespace_line_start | Bin 0 -> 510 bytes testdata/testkit/armor_whitespace_outside | Bin 0 -> 653 bytes testdata/testkit/armor_wrong_type | Bin 0 -> 515 bytes testkit_test.go | 41 +++++++++++++----- tests/armor.go | 25 +++++++++++ tests/armor_crlf.go | 33 ++++++++++++++ tests/armor_empty_line_begin.go | 27 ++++++++++++ tests/armor_empty_line_end.go | 27 ++++++++++++ tests/armor_eol_between_padding.go | 39 +++++++++++++++++ tests/armor_full_last_line.go | 29 +++++++++++++ tests/armor_garbage_encoded.go | 30 +++++++++++++ tests/armor_garbage_leading.go | 27 ++++++++++++ tests/armor_garbage_trailing.go | 27 ++++++++++++ tests/armor_header_crlf.go | 35 +++++++++++++++ tests/armor_headers.go | 29 +++++++++++++ tests/armor_invalid_character_header.go | 34 +++++++++++++++ tests/armor_invalid_character_payload.go | 28 ++++++++++++ tests/armor_long_line.go | 30 +++++++++++++ tests/armor_lowercase.go | 26 +++++++++++ tests/armor_no_end_line.go | 25 +++++++++++ tests/armor_no_eol.go | 26 +++++++++++ tests/armor_no_match.go | 28 ++++++++++++ tests/armor_no_padding.go | 29 +++++++++++++ tests/armor_not_canonical.go | 28 ++++++++++++ tests/armor_pgp_checksum.go | 29 +++++++++++++ tests/armor_short_line.go | 27 ++++++++++++ tests/armor_whitespace_begin.go | 26 +++++++++++ tests/armor_whitespace_end.go | 26 +++++++++++ tests/armor_whitespace_eol.go | 29 +++++++++++++ tests/armor_whitespace_last_line.go | 27 ++++++++++++ tests/armor_whitespace_line_start.go | 29 +++++++++++++ tests/armor_whitespace_outside.go | 28 ++++++++++++ tests/armor_wrong_type.go | 26 +++++++++++ 60 files changed, 896 insertions(+), 11 deletions(-) create mode 100644 testdata/testkit/armor create mode 100644 testdata/testkit/armor_crlf create mode 100644 testdata/testkit/armor_empty_line_begin create mode 100644 testdata/testkit/armor_empty_line_end create mode 100644 testdata/testkit/armor_eol_between_padding create mode 100644 testdata/testkit/armor_full_last_line create mode 100644 testdata/testkit/armor_garbage_encoded create mode 100644 testdata/testkit/armor_garbage_leading create mode 100644 testdata/testkit/armor_garbage_trailing create mode 100644 testdata/testkit/armor_header_crlf create mode 100644 testdata/testkit/armor_headers create mode 100644 testdata/testkit/armor_invalid_character_header create mode 100644 testdata/testkit/armor_invalid_character_payload create mode 100644 testdata/testkit/armor_long_line create mode 100644 testdata/testkit/armor_lowercase create mode 100644 testdata/testkit/armor_no_end_line create mode 100644 testdata/testkit/armor_no_eol create mode 100644 testdata/testkit/armor_no_match create mode 100644 testdata/testkit/armor_no_padding create mode 100644 testdata/testkit/armor_not_canonical create mode 100644 testdata/testkit/armor_pgp_checksum create mode 100644 testdata/testkit/armor_short_line create mode 100644 testdata/testkit/armor_whitespace_begin create mode 100644 testdata/testkit/armor_whitespace_end create mode 100644 testdata/testkit/armor_whitespace_eol create mode 100644 testdata/testkit/armor_whitespace_last_line create mode 100644 testdata/testkit/armor_whitespace_line_start create mode 100644 testdata/testkit/armor_whitespace_outside create mode 100644 testdata/testkit/armor_wrong_type create mode 100644 tests/armor.go create mode 100644 tests/armor_crlf.go create mode 100644 tests/armor_empty_line_begin.go create mode 100644 tests/armor_empty_line_end.go create mode 100644 tests/armor_eol_between_padding.go create mode 100644 tests/armor_full_last_line.go create mode 100644 tests/armor_garbage_encoded.go create mode 100644 tests/armor_garbage_leading.go create mode 100644 tests/armor_garbage_trailing.go create mode 100644 tests/armor_header_crlf.go create mode 100644 tests/armor_headers.go create mode 100644 tests/armor_invalid_character_header.go create mode 100644 tests/armor_invalid_character_payload.go create mode 100644 tests/armor_long_line.go create mode 100644 tests/armor_lowercase.go create mode 100644 tests/armor_no_end_line.go create mode 100644 tests/armor_no_eol.go create mode 100644 tests/armor_no_match.go create mode 100644 tests/armor_no_padding.go create mode 100644 tests/armor_not_canonical.go create mode 100644 tests/armor_pgp_checksum.go create mode 100644 tests/armor_short_line.go create mode 100644 tests/armor_whitespace_begin.go create mode 100644 tests/armor_whitespace_end.go create mode 100644 tests/armor_whitespace_eol.go create mode 100644 tests/armor_whitespace_last_line.go create mode 100644 tests/armor_whitespace_line_start.go create mode 100644 tests/armor_whitespace_outside.go create mode 100644 tests/armor_wrong_type.go diff --git a/internal/testkit/testkit.go b/internal/testkit/testkit.go index ad7fc43..f6bb52b 100644 --- a/internal/testkit/testkit.go +++ b/internal/testkit/testkit.go @@ -63,6 +63,7 @@ type TestFile struct { comment string identities []string passphrases []string + armor bool } func NewTestFile() *TestFile { @@ -87,7 +88,7 @@ func (f *TestFile) TextLine(s string) { func (f *TestFile) UnreadLine() string { buf := bytes.TrimSuffix(f.Buf.Bytes(), []byte("\n")) - idx := bytes.LastIndex(buf[:len(buf)-1], []byte("\n")) + 1 + idx := bytes.LastIndex(buf, []byte("\n")) + 1 f.Buf.Reset() f.Buf.Write(buf[:idx]) return string(buf[idx:]) @@ -122,6 +123,16 @@ func (f *TestFile) Body(body []byte) { } } +func (f *TestFile) Base64Padding() { + line := f.UnreadLine() + paddingLen := 4 - len(line)%4 + if paddingLen == 4 { + paddingLen = 0 + } + padding := strings.Repeat("=", paddingLen) + f.TextLine(line + padding) +} + func (f *TestFile) AEADBody(key, body []byte) { aead, _ := chacha20poly1305.New(key) f.Body(aead.Seal(nil, make([]byte, chacha20poly1305.NonceSize), body, nil)) @@ -231,6 +242,11 @@ func (f *TestFile) ExpectHeaderFailure() { f.expect = "header failure" } +func (f *TestFile) ExpectArmorFailure() { + f.armor = true + f.expect = "armor failure" +} + func (f *TestFile) ExpectPayloadFailure() { f.expect = "payload failure" f.payload.Reset() @@ -255,6 +271,22 @@ func (f *TestFile) Comment(c string) { f.comment = c } +func (f *TestFile) BeginArmor(t string) { + f.armor = true + f.TextLine("-----BEGIN " + t + "-----") +} + +func (f *TestFile) EndArmor(t string) { + f.armor = true + f.TextLine("-----END " + t + "-----") +} + +func (f *TestFile) Bytes() []byte { + out := make([]byte, f.Buf.Len()) + copy(out, f.Buf.Bytes()) + return out +} + func (f *TestFile) Generate() { fmt.Printf("expect: %s\n", f.expect) if f.expect == "success" || f.expect == "payload failure" { @@ -267,6 +299,9 @@ func (f *TestFile) Generate() { for _, p := range f.passphrases { fmt.Printf("passphrase: %s\n", p) } + if f.armor { + fmt.Printf("armored: yes\n") + } if f.comment != "" { fmt.Printf("comment: %s\n", f.comment) } diff --git a/testdata/testkit/armor b/testdata/testkit/armor new file mode 100644 index 0000000000000000000000000000000000000000..7ebd0dbf84cfac21151f70c97b0b67cc7f02f930 GIT binary patch literal 577 zcmZ{g$&#W#07UP61@{hPidtBVn1e!<8_){HQrv(lM+B8tT))2Une${GGb1wcsYkEs zVXR-Sb*(NJtuLS5sgz?K7-&l{2B5Z~EP)M>Wf7;8r30+eu51%4$CAo6YGB)?VMAcT z8dt=Ga4TV1Y1^h#daIseoj91_`t2>TARvek46(!pf!M(c6RnZzI5fk%I+@W?Ox=j` z(Ta+Zkq24k0@D|WQW6QC2Ts8JNdXgLE|*JW#vl-DFUsQ7Pkhr1QoPAgY%xNiq7R&rCtqIk%&L&(yueQCv>z3OE5Rn3!|+OuF|&|B(BQE~Z*`DA5XoaSMh(clF~ pe%L4Wt>xU8LH5f+x350do@>|k`t~wE1&KYGb_RoiF?jv@*h#K=@A9OoQoSm9 z>t#94z;G^0ISfjl-2l{iLlM+3?6UbJ8ZV#HOm0;hUz&|N?MHm!i`kFcW zSbDGj0P`$A-Gs~reCe=1;6zCi(KtzbPVtJC3%@TAITv`+io9Hp426D4dLJFfd{Xp4>5iEYL+9I-17RL;{nVQrjjEhVrTjC;$JvCZ80UVb+JFg!R%v;{) zacuj+xJ!;6kDK~2QL+Pnl+o9Bv4}46z}>CNF0n1rA{4hEd|&H>S=|iHA8oe{kB7*( m)M4ldH~FFC%Xc44l>5dq?7kiroqKyj>CegE_Lyh?zq{XCkHNtJ literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_empty_line_begin b/testdata/testkit/armor_empty_line_begin new file mode 100644 index 0000000000000000000000000000000000000000..5900cc5c39f6c647eb83505c208507785736ceea GIT binary patch literal 510 zcmZ{g&61)p0EF*(3hq>1bd_Y6jMi3#-^|a?8*Bg7rL!i{A>B{b_ zI-TPI!$FGqV1?Dd$*Giq?Z*mYj8esOI;JF^7Op`4a=C;)v#DB#sbpC!V&A8kx5*(J z5+D4$F?wP>%@u&bw`O=ACEptsPJ&deISwrn#rP)#KuKN4GP^0bMEgbB?p*J-gUcp{ zst-#0Eh2xO2^al4n~7A`bGoP>`#id+X67nL6yQxAW>x#(pHmu(u6qw^_>ju rg|y-4lNjAA&SOpGuOYmDwhTPi!6*9mnBqeStXjTxcS!V}0}E|iaB%n;fJ= z;#)s&jGov}bG59&w`O=A#orq?j)O$4ISy?SQT!8HO6r=*?54mH?H5VA^Wbd6kFUEWnVmY#NDuidbkpvi{Sn`}sD2Zl;lOlJuS^+n)sNDFmNU|u6T$g5Wn}cLb zT;unRR#Wq(zYJsaqd8s#>}SKo%!}oQW8Wk}gnvUr3ROoUdq}WChh==*JMggwt0n@n z_e$$eKu#~l(|(=I(^%9Cx~#iH9^7R!cO)Rv;7#pk)ve>c+NfM@3sQg-cObC|kyU}Y z#V%fzwQNvof46XZbz<&SIR+9m=BK^rP)Asc#7Lu52c_hU2uROd@PrPxm~ zn}%3StwWsWzUf2)V2o114zU-LXkOSHIh)M}IMj^AE=Y5lMLcqxID`8Gpe}KY@_hO{ z>z^l2eKCybuNHW@PJTBgIPp`lV>p)V?4E;P?)xMTlq%%*^EI zx7nETWRd1c#G3IMS;cFcB~4~`xe=NlR=irDQ}#iVm%;^6h0gadwh>4y9!At0*QB_H zFK(7S8OkgRQaT>;Q$n(?eHq1(yd?kls#g4_k0jn(_?87qR7^c6n}_bjYaTNv9fP=M zrz4-;TE-$3=b$>mW literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_garbage_encoded b/testdata/testkit/armor_garbage_encoded new file mode 100644 index 0000000000000000000000000000000000000000..8f95ca345b643ad32824650314f12e77bdc1ca26 GIT binary patch literal 89419 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 LbkouP|0CjmukaKn literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_garbage_leading b/testdata/testkit/armor_garbage_leading new file mode 100644 index 0000000000000000000000000000000000000000..f65c11aad705eda951105dc19cc5e81ec7fb040e GIT binary patch literal 517 zcmZ{gOOv870EF-S3hq2PX8`|#}}99sqi5Zab4Z4+Ad)K)gs3aRR@=)SA- zB^puWMu?3zNQ}&sB#CP{fdB}>NU)Sl2@d9&6+>seUIT|3L~Ok%p*)BK$06L_rGSpH zqy4^7a;87kP1805Q0Q@#f>xGi34bP8V^MR7e4O>0S8U`pZgS4Oh<0gm4Kc6EmzG`d>kywm_pA7>E|~00bmyKFdnO0U=9}?t wS_~5>>O4}j>m{DtOU438l0Rc`|7@uC+`1F5DQ~L}GQ3&h?>}xR^!`ij3kZLmv;Y7A literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_garbage_trailing b/testdata/testkit/armor_garbage_trailing new file mode 100644 index 0000000000000000000000000000000000000000..67715accf8ad3a134d7b20581a909438ecca2b53 GIT binary patch literal 517 zcmZ{gOOv870EF-S3hq2PX8`|#}}99sqi5Zab4Z4+Ad)K)gs3aRR@=)SA- zB^puWMu?3zNQ}&sB#CP{fdB}>NU)Sl2@d9&6+>seUIT|3L~Ok%p*)BK$06L_rGSpH zqy4^7a;87kP18m{TA-yL{%q(dbR)54$kVYOpx;mviL8Qz_X4cpVHGud%kKAJT?ar6 zZehIn`1A}}JiOCI93|C~tg6Q$^;=OdECI04SY3I%Y#z*$TbasThBFYO2cRa#qRbF8 z!i!t-E{elNl!O5*x;`+o*EvVVS99XA=v8(2O?$H98+> z{pJ-Ld5xQ#b1$M@np{K7tMa8~7yLTJ=g<8rzN-r+I}_cxC&ix0fwK8#e47@-#ECkO w)a-hRC-;)EK$7Io7~DS_sy(;v#B0ji>Vph#miYUR8w$PuQak1CK0hh#3z5a0v;Y7A literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_header_crlf b/testdata/testkit/armor_header_crlf new file mode 100644 index 0000000000000000000000000000000000000000..ce52d31c3c4876d6964701b0a70c7a116a898e8c GIT binary patch literal 571 zcmZ`#%aWon0KD@Rxo=q&0@2Z%N!yog z0nYlU^c|GPs(IYCQC5uxwSF%Ep4-?iMwWPnAhs~Jk*#bKBYSRZ8yl6<-B1mqb?K4G zo~$`ZCIOKXlXyukTvs6YVPTd@F-0>N9;6762-pEp>I9h#Lh5n*BVA?(8^$O?A%({A z-d^uoEx=p%MsaQ1F=GLms?$BFIxw8|zs9;#;8_i4u;!sVYW*-S0oM|Qu3=2Ru_E4< zeU}4-t+|X6;sAFWl0Tv$Gu4Edcu32~#fINb$bOtGzY8t-a^mX{RVzs^sY#Riry%0S zFRRh#z60bxRm)yRMlg=eJSfQ1N-SZe9?z7yq6`k4XTHbD+>uWh9KG9F)=Daq(KKl; z)TAic6mR3W9}?PdleYOyneKMKVZE&V9jmvHra9#?48lDewvHd}Q&lmmY3P^FgvEtQ zMP>*zL=>7a>s*JE*EF&6bazl5b@D#XUh5RrZ2g!;vM+b_DgN>yzM4^p34B|L`}xC| c&!)f9{_^}>PV;azb!a)Xf4?Kl`R{YT0f|Jc!T;f5xz2qJ^1=-2N!d*1G2cU3>s(5ihu z(~9nV>9j*p*0)Z9Ls=`WQqP%&rWUgH-#nnPsUwJxWm?iQkZDaVWg$>X)%0cmZJjUi zD8f#N`Dl&B$jE4#I=USQh%pKU&*+qrV4j;XvRA7Wv?HC0jT@#>62yUR)5O|lFd7pZ z{IpSWrajdafYBQZy!6>SL&MAo#fD>7BYuE?MBu4Hs_y#Up#ZzQ2i5iEp(Fqzm35FN zHvv~@?}hEov~D}NY62(*r_?`u^5@BTJbXrrI85s$_3Fny^E=TjOaX}iys6!!Y9HK{ z8=1*%PI4II2aF6tM3rN%vy)RLeHgPvn6iME{Vg!^*Jr}Y#H>@W){h4D{4V6jh`l7v ziOf~HwWx_8Gvaj+>Ag?#+xivjMMK&mN!&2%v-HeJQdcjKpU7(;AHQ~9d{-wzw+6l^ zt`s{ihltPDCU)4nwBhGdJh@k#2a=}0#_;~tM&P+|CT?3@y$c;aO!52QrI@+@ GJ@hZvwxhrR literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_invalid_character_header b/testdata/testkit/armor_invalid_character_header new file mode 100644 index 0000000000000000000000000000000000000000..599d1cd323925530503d9f59dbf490e91e49c2b2 GIT binary patch literal 509 zcmZ{gOOv870EF-S3eG!aEf9i_sy!$qiV{ZiB;3^CiXg){sOYbs$DX(Q*j?3KU(vV4 zzMI(F%lYkMAGT$Ey%g4=tP8s;9upgmedzDMe1JpGfdE3^^NsI9&ma4R53SM^O;>hb z)#)4!7z!!kgB8*PHzP`gPLODT5Tu%CWK3`}%{>8w<#GuE<`BJ(sA4h^Ne~d}Z!*A! zIIw=+6lP*SiVw>gd~1g0ar(Vsqco&?%~53II6*(5rIo3FDS6dk3HJ-y?mYjx1Is1> zx(`d|CB}arDHr`Kn+dAwIa$>AeHLGIGxIdS+Tu+e$*R5c$gE9fHaX6LKzG1gjCGYG z?xd%%k{uQ4jH)!@Wp_>7{P`-=QhK$rR?g8Si}*tMk)=2#jZYYiZOYIYb%$mOd literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_invalid_character_payload b/testdata/testkit/armor_invalid_character_payload new file mode 100644 index 0000000000000000000000000000000000000000..634b922fea9914f35420ca43027cbe50ddbf3629 GIT binary patch literal 509 zcmZ{gOOv870EF-S3eG!aEsz8sReMlK6iqT3!Xw<%n?aZu4;KaV|c_p!UGyFSym zX5UTh?dAM-u@Bp_zFv%VC~IR^<}tC+7$Ug;@&OG!2LXhj2Q_q&2glGrWR==9UDnBBcWu@#*ENu;U&mlE|~s++ zuB&I_Y#Y*U(=-%umuF{A(z<$D#fd!k$?<)+NN(mt*v7@TG}LM*bsx*=YWOiO`;jlY rkTvprN=COzN~&4*dkAjtZEXEo2cxj9J{E7RfAQ3xf7~z+|4Z!?odTMY literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_long_line b/testdata/testkit/armor_long_line new file mode 100644 index 0000000000000000000000000000000000000000..7bafc0e0e740569eedbc85bec3d72c6f4cf62fc4 GIT binary patch literal 505 zcmZ{gOOv870EF-S3hquwFiYn(S*@FfN)cTD}oH8sOYcXnc4GpAG@o%>nr-U z*mo0qdpUnx?8COKZB{b_ zI-TQzzyZf{u)=!aW-Ltu$EO-#jJTE=8#6+uxu=l7TrPnx9H!SHPeno%^?jDWO$Nk} z_}0&x!c6REakZ?$w`O=A#orq?jsvdO5{EX4DE1g0Kz3iS2>nW zdXo0!Yp;%o(0T=pZMcOh%! n`J_hoN=j;2`fCX8pRIVVgHhO4*To0x-#q>MA2S?>|0VVp-^rS} literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_lowercase b/testdata/testkit/armor_lowercase new file mode 100644 index 0000000000000000000000000000000000000000..3ab173d77fd46fd0f651fdc1a7e2b8985f69763b GIT binary patch literal 509 zcmZ{g%aWon07dtF1^X^*fF$^+nuS85Xp&YE9$}{@wg}R+qM~0vJw5BWcX`j^)-io+ z_T9wZUe2Ev`>-wR+r?OivNm>Qo)a65A%gqw9?;Np5I_ieP(v4aa10GZR;f+XmEAWw zo#TPPL5$^Kh1I~#S(XKkPZhuz#Y*OE%m|$pUV{APatVClFtrZjOr$iSzRyy)$$=OW z-}-rD^u&Iet7Q%TW`^exx3?e0#yp7CTH??q5yd~Fr7~U9EWIhPMEgbD?mT$gfn`I1 z>VwjGi^#{5%cOr7vn0;yIa}0^eI8v@GxHQ6%92eTrd9ipp$o`zcOr0#{Bu7=lf*^m6V r3t1!2r(|@mq@HT^FCMfAiGuf8H<;|7-0JG5?#P literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_no_end_line b/testdata/testkit/armor_no_end_line new file mode 100644 index 0000000000000000000000000000000000000000..d4a2bce39373eb8f2046c2740c6112482ca70eb2 GIT binary patch literal 476 zcmW-b&2q9Z07dtC3ichRKob0!`4$R^q6yU`{DhqvtO!!7sOZywZSP&4J9BQ)x5d7j zSli3_>tY?YWqrF8;850uRTa;Pg~te^{Z9{g=-L=!j9g@pgIzR61;U^-Mbnkt&vZH` z14(>A)L=#Qz{z-;`nJb3Bm@hsGCt;%O>;NK-g3Ewp0v4M2O^aTi<#%~1Z^@Xhtvaq zZwfQ9p2Zb_!Ea_{9!9?oi$uQAYefQ!hK&3{pi@(`G`VTG#QTM4cP_f^;Id&*_kL-= zh4k|oskr};vsk3{oG~BZ!^nwOOxj&Y^V{kb z+uMe=+aw8u?6UM6(WI_kAV1O9K0bc$7V*6}QND4=Jqe87Dbq_eT@A0}vLAV(3wWc> hr+9R)lwyXb??ZV1ZY6lG{ZY_X*Tom_-(39<{0A&QlS2Ri literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_no_eol b/testdata/testkit/armor_no_eol new file mode 100644 index 0000000000000000000000000000000000000000..49630cb495b31d04cba1ab827579af5c38bcb803 GIT binary patch literal 632 zcmZ`#$&#W#6uk2l+&hdZYGE;A4k}gc0<=N_7B`^E5kaH{*RLO)i8)TbOGf64c==M@ zJ5>&2y}y*D>U*urAI&M3V;vZ1M=%DUw4uy_4UlCKCzrVctlTba6D!A($~H=1+qq#w zV8Rj?#Ds7sVP0svs!@8a9%G$2nBej?J7PgV5Fr?1i46j=gB2!PB~?3A!)tZ&NkK+D!c;y$au$AbNO1U$ZfMbkJ;n@@k< z+{*3ZEZQj)hzX6ijhocnjk|I!w{nxQ48`<@B7-qeXOx5BFsqXxjDu;I1|F}5i)Uod zuOz4v*reJD>61y4ycCNq_8un!3ejCkcmU|6v1vUHyXJAYwb4(oWJY< literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_no_match b/testdata/testkit/armor_no_match new file mode 100644 index 0000000000000000000000000000000000000000..f694a4585cbd77c7151d78ce7c8fecb929558701 GIT binary patch literal 504 zcmZ{gO^=%}07UQn3hq%VbewAcO@Q8@x9MoG%iRX1x{cukUVq?#ywXG}6=K zL$_vS4|n^fOnb5p=c~4RJ*{lyLj>Ee9?*;DAb=3`U0psT*xS|z@}kY&5A8pgb`oh#@ z&(16%$0@J)_{!ENHPEqa-Y~6AT@A@pUb=-PxbL)8YDz&QC3(2VXc9efE9UpiOWf8i zov=R%2Iyi(l1W`exQ|l8FI}QAQC52uOw}f$!}`JM$E&Q?nd(m$bxYUO<=c!oCfTG@ zOXz#o8^S=E?Hn;&SC^A)(uv>1BLD16=ZPo3?Y5xvCnugQf4PT4 nQ95IqDwD|1=0`mXboLusM+T(kt!SRwZ|=vR|GeQm`meP=;O3XL literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_no_padding b/testdata/testkit/armor_no_padding new file mode 100644 index 0000000000000000000000000000000000000000..737ed670bfa5bb5fc2378c93faa9fe17eafd0c42 GIT binary patch literal 540 zcmZ`#%aWon0KD@R+^4JslHlW}kSIzRh42VBBymI@GJ=YH{W`Pf?LKvNS9Mp*p_O^R zP_tWoy{V_HsO~qZoQg`SrF<<^G=~W0Z=TT9&=5cf8c;wT8E_6IL`orK(--|ax?JN) zfGr=h$qw_0p3pe9G}Gk(W8`y|&^aaUGBrYEZns-t1{&pi+mD0D4PDcu5j-Rym=aU@ zT_eRpeaTMAuXX+ISg3W;bw%@~9w&#6k&|2^$5Ibfy{ literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_not_canonical b/testdata/testkit/armor_not_canonical new file mode 100644 index 0000000000000000000000000000000000000000..a6c6f561efbac0a8d38d63525a8c5aa9d1ee1ea5 GIT binary patch literal 542 zcmZ{gOOv870EF-S3hquwFiYnQIb&zk8nd0R|Jt!ROHvMGkf0dV|P`5)v9k* z(arSydcIusLtfVRtI`f-t@KL0W;&We1dF#1Xlxk>AOtNap@}Rwg$g3Al&a~WP z@hHSjfca>H#mG!)k~oI#3xF{S1W)Od5`Ugq5wh3oHLyd2ime+YVeCh~ZPOU;QV@=b zt^Lp_In!V2rWKd-`MojI_xVlPP%m$KbLsRVZ!S$)d{7g3PZOS-C`Me1Eev#B_qX{1~!9;*7{lB|Ath1eh6Z{Ltt;lHE5$WaJHL^Eh^cuuGFOBXL~~T6Q8s5gotw ztLULlgzilIh+Qf6T=pTKZ^pN2*-z}Cb7{lRr)cu1IQJz@evQH7s|~f+)|t3%bz5C% Q|6ygn|NVxU``_380z?(2a{vGU literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_pgp_checksum b/testdata/testkit/armor_pgp_checksum new file mode 100644 index 0000000000000000000000000000000000000000..c245ba2dffec714f223e2f029bdbc3e17cf65af7 GIT binary patch literal 516 zcmZ{gOOv870EF-P72Kz+1w!yqH3x-6LBc2rgm6<6R|FZx0Y!iPJodcZ$L^}``t;E1 zLpL*a*US6WIPS{2ziMzSYi(5eF*DHALC)dZM>Mug1QBv!U?N3w)>w|LoC@KYZX_YbD3Ls;Q%a(FVW-Fq!w|a6q;lgYf@M(}xh~C|Z4TL( zxZwAVRx{(FKLHs1Xn~hO{Ig-;*h}PwW8WY_gnvT-q)>GvvR=Xv9ac%Zx1D|u!zO}q z@JjO~Ab%e*Plq?QNE1;n>8idT^580)g)JeGfH$?DRqdVoYNK+sEl2@Ve22^;L{%5o8z#75(~kX3yJw?5^&vF8a3E zcN2SiIe%R2!?vuim%=)fbzxVRVr}&SObg^(;}l|O5$nmrO00{m%!%^)$5QcF5@)zeJbH51AIt) z>t{`2CibKFvaG>3W_TVY-yJqi0;bmjhc<~~{3BXgnL1YTs=*TN7p%2*9=z_rvWbE2 zgVK46$e%|d(*B*#Ql{!TUDWq|7F~2R^E4n@G<7Je_AWxRHksL2Imtna?|{36=qks; zNlrl}JC-Ihrjl5c-8FXe=etZw>D6lG99_DIE=(MG@-+ArVDdt3AoUPP+;kOlr;A8_ zT|HB0+mLoEWypA!sdGYPT|M&?dG6EW=WdbSiW8yM#>F=o8od*y=VH1VevQk1uwFiYn(S*?u62eUlt_U)WgNpw8d0n^r*j?3KU(vV4 zzMI(F%lYkMAGT$Ey%g4=tP8s;9upglA%goaAJEWq5I_ie&_EY?a10BGtkM)sS9V|3 z=^PId9B?cKE35}@#*_*ipK5?H;#y>E%m|(4UW)wXatZvzVR{{Ml}MUW-)9nTGLQ_3 zZ~eR}%*1{aAC@)vmOaDsDE=O?aU5{H7C5v?M6vx7TUwc#DtXmliS`TL?mT$ifn`I1 z?t{{KiO9c4EYkipnWbFSbGE4O`z*TXX69)?v?ZE4lvR5dp;?>EY;ux=6yHJO5~8ad z3nxAWmF##L&$x=ID7!0l^XIFKOX=0hS~*9TEusq-$0U9loD-85Y6F>vKE73E`#&R|FYGQIV$~XXd)y$L^}``tq*H z_wB^oUd|sE^RO+d+a)&+MU|Un{+yU_>_T_{@&OJV3jzpT$JMS49e3>JE;I_A*KN_h zs?#|dFyzOG4^~JG?37CBTOLsWAs8#3(lNzknmGydmdhpZm_^k(h$RywA)ZHtyGa2X zV$b+_lk183%&&$q_|^=~!{~d%M3En>HAjJoLxO%nLrGl`DQ*fZ;eHV}JIB54z_KPl zb$(&Jh4|ky;z{?;W=SloIbBqbeHva=J#!Sm%HVYsh_ZR`K(BSGHyO@Af*yd`7^^Zv z+=@WiqtgNF=7vUx5M;7%OWmspq+_=<%AhMGcVOAUB z?6&F?Yg^-HD?|{pHkIcHi>mC6?1cM$a{Syal6!u_bYr8t2(;R9-7!904X@*(8+maX u(3+o5$>?5kPBfK&hT#6$Fyp!QM?q6w7az2HbJX8oZZBNHf3TUq+`a(cIh!E> literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_whitespace_eol b/testdata/testkit/armor_whitespace_eol new file mode 100644 index 0000000000000000000000000000000000000000..d0a590428f333a687513d7ce7d5cf330dd18a4a5 GIT binary patch literal 510 zcmZ{g&61)p0EF*61@|dyfe`$u+Ji!(D9LCN62eUlt_U)WqM}c~GqdOIK6Y1i*H`py zvF|4K_HzEX*oSRd-!6r9DC@$mis!_JV;}naFCXC0b0C1w_k82K(DTQB;X|u5Mbnkt zS9Ll^1CBz5#9)Q=z|DwKp%Ww;AOx8f85t9tOmi=V!E(6-0e6UAM@(^2ET? zhd8i)-V|nHKZ~nn4Zbx)^O$~b*ocNquLX*194F`}w6rpHqU243CEPDqyYu|p4lJ7l z=sql+w;2CDv7V(9NBd0Hea%}QKZG7TEK;3keaHorL zep|g#XWQU*D`muZm#H(wvaViMe!{PPdi>li(tB~jWaFZ{jEvq1({nLh4X@*}9|f$7 rNF&atbabzTNDNWGhT#6$a@%^Y!%@^$*To0v-#q>MA2>v#|6=2ET? zhd8i)-V|nHKZ~nn4Zbx)^O$~b*ocNquLX*194F`}w6rpHqU243CEPDqyYu|p4lJ7l z=sql+w;2CDv7V(9NBd0Hea%}QKZG7TEK;3keaHorL zep|g#XWQU*D`muZm#H(wvaViMe!{PPdi>li(tB~jWaFZ{jEvq1({nLh4X@*}9|f$7 rNF&atbabzTNDNWGhT#6$a_hMcM^Rf{7ayd5^Ym}~A2>v#|6=QX^ literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_whitespace_line_start b/testdata/testkit/armor_whitespace_line_start new file mode 100644 index 0000000000000000000000000000000000000000..6093e9745e9afcf6615f6b51543245330ceb8480 GIT binary patch literal 510 zcmZ{g&61)p0EF*61@|dyfe`$u+Ji!(D9LCN62eUlt_U)WqM}c~GqdOIK6Y1i*H`py zvF|4K_HzEX*oSRd-!6r9DC@$mis!_JV;}naFCXC0b0C1w_k82K(DTQB;X|u5Mbnkt zS9Ll^1CBz5#9)Q=z|DwKp%Ww;AOx8f85t9tOmi=V!E(6-0e6UAM@(^2ET? zhd8i)-V|nHKZ~nn4Zbx)^O$~b*ocNquLX*194F`}w6rpHqU243CEPDqyYu|p4lJ7l z=sql+w;2CDv7V(9NBd0Hea%}QKZG7TEK;3keaHorL zep|g#XWQU*D`muZm#H(wvaVj1ouBY)pB_JVi}YTcFxj~1E+eCN!t`8BSHtVL>_-9X rBGQQSDIMJ_AreE>uOYa9w%mHI!%@^$*To0v-#q>MA2>v#|6=eIJKx`0TxCtb$F&GnrpT9oNZm!#N?4FwG zPu)6I4rAD#%To0{=)}D_3OR;I)3=lmgh~rbfh?q(CbfkWHZp}(SO!tHDV3#_$g+fH zVPxQv6x6_YE3qiRwrUit)qM=9O(-d!v!y0RRHu|+B8f&Zv56uSR8qA=H9VuQZ)_B? zX~_6!$+D5Q@zZpQ3@_6eqhZE3zU{l-YmQ@TEEWshh>)MHoG^_NFZK+>Psne=M3dQct@hv$tkyzZ(&^_?gcta>P#=6F>S7Ha#)g%tm|gWqbKR`Y8Ari> zS|>vo2a_-jJYEfFPs<5BG=DZfg?twU56N;@<|} sTYlKb)}`j$lYaWk)Gr@h1n#S;<#csFJNma5oc;dCjRnqsseSYP1ZS4Sr~m)} literal 0 HcmV?d00001 diff --git a/testdata/testkit/armor_wrong_type b/testdata/testkit/armor_wrong_type new file mode 100644 index 0000000000000000000000000000000000000000..28f6d169318fc830e28193ec9dc5eecfbd74d957 GIT binary patch literal 515 zcmaKo%aWon07dtF1^X^*fF$^+nuS8*i=>r2AnerOh#*ZXD*E-^PVf8P?X5buPTn>7 zt{vH%^XcPk?>9wtJ?GZGsB*i^A0rzLA%eT_?or=!5I_ie&_EY?a0qjVtit4VTeRQP z@f7zs4q_~NORRftN|PjT{73_gQLIHuhm=I)%#+ApEEd4$4%MqLPPmF>lZ2+hi*W}T4?NPGv}B}A7Q z77jZGrD|izCUL?dQMA{{&7SXy70Rm;Yv~+ZI-8$kap3G}a7Ij)Cu>MO1ehzA5qH`- z$*#+%bT&0 = is not good, but is valid + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age12") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line := f.UnreadLine() + if !strings.Contains(line, "==") { + panic("need two padding characters") + } + line = strings.Replace(line, "==", "=\n=", 1) + f.TextLine(line) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_full_last_line.go b/tests/armor_full_last_line.go new file mode 100644 index 0000000..be76f87 --- /dev/null +++ b/tests/armor_full_last_line.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age age age age age age age age age age ") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + if len(file)%48 != 0 { + println(len(file) % 48) + panic("last line is not full") + } + f.Body(file) + f.UnreadLine() // Body leaves an empty line, PEM doesn't. + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_garbage_encoded.go b/tests/armor_garbage_encoded.go new file mode 100644 index 0000000..1898582 --- /dev/null +++ b/tests/armor_garbage_encoded.go @@ -0,0 +1,30 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.FileKey(testkit.LargeTestFileKey) + f.VersionLine("v1") + f.X25519(testkit.TestX25519Identity) + f.HMAC() + f.Nonce(testkit.LargeTestNonce) + f.PayloadChunkFinal(testkit.LargeTestFirstChunk) + f.Buf.Write(f.Rand(20)) + f.ExpectPartialPayload(64 * 1024) + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Comment("there is trailing garbage encoded after the final chunk") + f.Generate() +} diff --git a/tests/armor_garbage_leading.go b/tests/armor_garbage_leading.go new file mode 100644 index 0000000..a700abc --- /dev/null +++ b/tests/armor_garbage_leading.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.TextLine("garbage") + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_garbage_trailing.go b/tests/armor_garbage_trailing.go new file mode 100644 index 0000000..5126143 --- /dev/null +++ b/tests/armor_garbage_trailing.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.TextLine("garbage") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_header_crlf.go b/tests/armor_header_crlf.go new file mode 100644 index 0000000..5a90246 --- /dev/null +++ b/tests/armor_header_crlf.go @@ -0,0 +1,35 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "bytes" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Identity) + hdr := f.Buf.Bytes() + f.Buf.Reset() + f.Buf.Write(bytes.Replace(hdr, []byte("\n"), []byte("\r\n"), -1)) + f.HMAC() + f.Buf.WriteString(f.UnreadLine() + "\r\n") + f.Payload("age") + f.ExpectHeaderFailure() + f.Comment("lines in the header end with CRLF instead of LF") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_headers.go b/tests/armor_headers.go new file mode 100644 index 0000000..7cfd549 --- /dev/null +++ b/tests/armor_headers.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.TextLine("Headers: are") + f.TextLine("Not: allowed") + f.TextLine("") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_invalid_character_header.go b/tests/armor_invalid_character_header.go new file mode 100644 index 0000000..cfc7d72 --- /dev/null +++ b/tests/armor_invalid_character_header.go @@ -0,0 +1,34 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "strings" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + begin, rest, _ := strings.Cut(string(f.Bytes()), "\n") + f.Buf.Reset() + f.TextLine(begin) + f.Buf.WriteString(rest[:4] + "*" + rest[5:]) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_invalid_character_payload.go b/tests/armor_invalid_character_payload.go new file mode 100644 index 0000000..0738b5f --- /dev/null +++ b/tests/armor_invalid_character_payload.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line := f.UnreadLine() + f.TextLine("*" + line[1:]) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_long_line.go b/tests/armor_long_line.go new file mode 100644 index 0000000..aae9f94 --- /dev/null +++ b/tests/armor_long_line.go @@ -0,0 +1,30 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "encoding/base64" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.TextLine(base64.StdEncoding.EncodeToString(file)) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_lowercase.go b/tests/armor_lowercase.go new file mode 100644 index 0000000..cb823b4 --- /dev/null +++ b/tests/armor_lowercase.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("age ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("age ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_no_end_line.go b/tests/armor_no_end_line.go new file mode 100644 index 0000000..46b8f03 --- /dev/null +++ b/tests/armor_no_end_line.go @@ -0,0 +1,25 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_no_eol.go b/tests/armor_no_eol.go new file mode 100644 index 0000000..e9b673d --- /dev/null +++ b/tests/armor_no_eol.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.Buf.WriteString("-----END AGE ENCRYPTED FILE-----") + f.Comment("there is no end of line at the end of the file") + f.Generate() +} diff --git a/tests/armor_no_match.go b/tests/armor_no_match.go new file mode 100644 index 0000000..130956d --- /dev/null +++ b/tests/armor_no_match.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + identity := f.Rand(32) + f.X25519RecordIdentity(identity) + f.X25519NoRecordIdentity(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + f.ExpectNoMatch() + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_no_padding.go b/tests/armor_no_padding.go new file mode 100644 index 0000000..789efb9 --- /dev/null +++ b/tests/armor_no_padding.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + if len(file)%3 == 0 { + panic("no need for padding") + } + f.Body(file) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Comment("missing base64 padding") + f.Generate() +} diff --git a/tests/armor_not_canonical.go b/tests/armor_not_canonical.go new file mode 100644 index 0000000..92efb83 --- /dev/null +++ b/tests/armor_not_canonical.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.TextLine(testkit.NotCanonicalBase64(f.UnreadLine())) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Comment("base64 is not canonical") + f.Generate() +} diff --git a/tests/armor_pgp_checksum.go b/tests/armor_pgp_checksum.go new file mode 100644 index 0000000..4172f09 --- /dev/null +++ b/tests/armor_pgp_checksum.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "filippo.io/age/internal/testkit" + "golang.org/x/crypto/openpgp/armor" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + w, _ := armor.Encode(&f.Buf, "AGE ENCRYPTED FILE", nil) + w.Write(file) + w.Close() + f.Buf.WriteString("\n") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_short_line.go b/tests/armor_short_line.go new file mode 100644 index 0000000..7a4df09 --- /dev/null +++ b/tests/armor_short_line.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file[:12]) + f.Body(file[12:]) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_begin.go b/tests/armor_whitespace_begin.go new file mode 100644 index 0000000..bf34a9a --- /dev/null +++ b/tests/armor_whitespace_begin.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.TextLine("----- BEGIN AGE ENCRYPTED FILE -----") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_end.go b/tests/armor_whitespace_end.go new file mode 100644 index 0000000..c85bac1 --- /dev/null +++ b/tests/armor_whitespace_end.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.TextLine("----- END AGE ENCRYPTED FILE -----") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_eol.go b/tests/armor_whitespace_eol.go new file mode 100644 index 0000000..32419d8 --- /dev/null +++ b/tests/armor_whitespace_eol.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line2, line1 := f.UnreadLine(), f.UnreadLine() + f.TextLine(line1 + " ") + f.TextLine(line2) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_last_line.go b/tests/armor_whitespace_last_line.go new file mode 100644 index 0000000..e287f0a --- /dev/null +++ b/tests/armor_whitespace_last_line.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.TextLine(f.UnreadLine() + " ") + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_line_start.go b/tests/armor_whitespace_line_start.go new file mode 100644 index 0000000..cb17c9e --- /dev/null +++ b/tests/armor_whitespace_line_start.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line2, line1 := f.UnreadLine(), f.UnreadLine() + f.TextLine(" " + line1) + f.TextLine(line2) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_outside.go b/tests/armor_whitespace_outside.go new file mode 100644 index 0000000..516c5fa --- /dev/null +++ b/tests/armor_whitespace_outside.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.Buf.Write([]byte("\n\r \t\n")) + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Buf.Write([]byte("\n\r \t\n")) + f.Comment("whitespace is allowed before and after armored files") + f.Generate() +} diff --git a/tests/armor_wrong_type.go b/tests/armor_wrong_type.go new file mode 100644 index 0000000..de8521d --- /dev/null +++ b/tests/armor_wrong_type.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED MESSAGE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED MESSAGE") + f.ExpectArmorFailure() + f.Generate() +}