From 5771017d06be0ba9d82203de0e5ff45b0c616d66 Mon Sep 17 00:00:00 2001 From: "Dr. David von Oheimb" Date: Wed, 19 May 2021 19:44:22 +0200 Subject: [PATCH] apps/cms.c: Correct -sign output and -verify input with -binary Also add related warnings on irrelevant use of -nodetach and -content options. Fixes #15347 Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/15358) --- apps/cms.c | 25 ++++++++++++++++++++----- doc/man1/openssl-cms.pod.in | 4 ++-- smcont.signed_ | Bin 0 -> 10486 bytes test/recipes/80-test_cms.t | 21 +++++++++++---------- test/smcont.bin | Bin 8000 -> 8000 bytes 5 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 smcont.signed_ diff --git a/apps/cms.c b/apps/cms.c index e9fe29ab8e..da00ece93b 100644 --- a/apps/cms.c +++ b/apps/cms.c @@ -287,10 +287,11 @@ static void warn_binary(const char *file) BIO_printf(bio_err, "Warning: input file '%s' contains %s" " character; better use -binary option\n", file, *cur == '\0' ? "NUL" : "8-bit"); - break; + goto end; } } } + end: BIO_free(bio); } @@ -320,7 +321,8 @@ int cms_main(int argc, char **argv) char *originatorfile = NULL, *recipfile = NULL, *ciphername = NULL; char *to = NULL, *from = NULL, *subject = NULL, *prog; cms_key_param *key_first = NULL, *key_param = NULL; - int flags = CMS_DETACHED, noout = 0, print = 0, keyidx = -1, vpmtouched = 0; + int flags = CMS_DETACHED, binary_files = 0; + int noout = 0, print = 0, keyidx = -1, vpmtouched = 0; int informat = FORMAT_SMIME, outformat = FORMAT_SMIME; int operation = 0, ret = 1, rr_print = 0, rr_allorfirst = -1; int verify_retcode = 0, rctformat = FORMAT_SMIME, keyform = FORMAT_UNDEF; @@ -811,14 +813,26 @@ int cms_main(int argc, char **argv) ret = 2; - if (!(operation & SMIME_SIGNERS)) + if ((operation & SMIME_SIGNERS) == 0) { + if ((flags & CMS_DETACHED) == 0) + BIO_printf(bio_err, + "Warning: -nodetach option is ignored for non-signing operation\n"); + flags &= ~CMS_DETACHED; + } + if ((operation & SMIME_IP) == 0 && contfile != NULL) + BIO_printf(bio_err, + "Warning: -contfile option is ignored for the given operation\n"); if ((flags & CMS_BINARY) != 0) { if (!(operation & SMIME_OP)) outformat = FORMAT_BINARY; if (!(operation & SMIME_IP)) informat = FORMAT_BINARY; + if ((operation & SMIME_SIGNERS) != 0 && (flags & CMS_DETACHED) != 0) + binary_files = 1; + if ((operation & SMIME_IP) != 0 && contfile == NULL) + binary_files = 1; } if (operation == SMIME_ENCRYPT) { @@ -902,7 +916,7 @@ int cms_main(int argc, char **argv) if ((flags & CMS_BINARY) == 0) warn_binary(infile); in = bio_open_default(infile, 'r', - (flags & CMS_BINARY) != 0 ? FORMAT_BINARY : informat); + binary_files ? FORMAT_BINARY : informat); if (in == NULL) goto end; @@ -945,7 +959,8 @@ int cms_main(int argc, char **argv) goto end; } - out = bio_open_default(outfile, 'w', outformat); + out = bio_open_default(outfile, 'w', + binary_files ? FORMAT_BINARY : outformat); if (out == NULL) goto end; diff --git a/doc/man1/openssl-cms.pod.in b/doc/man1/openssl-cms.pod.in index 6e0f86804a..c63a7f330b 100644 --- a/doc/man1/openssl-cms.pod.in +++ b/doc/man1/openssl-cms.pod.in @@ -507,8 +507,8 @@ will be written to this file if the verification was successful. =item B<-content> I -This specifies a file containing the detached content, this is only -useful with the B<-verify> command. This is only usable if the CMS +This specifies a file containing the detached content for operations taking +S/MIME input, such as the B<-verify> command. This is only usable if the CMS structure is using the detached signature form where the content is not included. This option will override any content if the input format is S/MIME and it uses the multipart/signed MIME content type. diff --git a/smcont.signed_ b/smcont.signed_ new file mode 100644 index 0000000000000000000000000000000000000000..59701f31d472e29dbd2cdb47f70a1c888a345b96 GIT binary patch literal 10486 zcmeHNXH-+|mPS+*Faj1(Y!rLIBqXE=s3$!@8tGAibP`fXBO!_vu^@I7D@ajM1QZ1Y z1;tMh0lOa}RutqD1W`c*{hWC3ow;-GtaWGB%%Az;S^06Y-@SMCdERF~IcvR}N}&=0 zxiW)Msnag>fh~Z7TyQ$ANv1UgvXc^I3w<fk6=8nHI8k6wFw$-j>&#lI$dDA~7ihmQ z0FH=+2B8Q50H9z*A`XW`!O+AYBnpKJMq}}QAQzAeJ5Fizv42Eb9~OjaFV^R;W%y`h zMx#g}`|0yD*?*r7eF5coeKV4k0HFxK+zH3m1~9VpXCZ#^|I=((-4Zw2f|KjS&De%UTJ;-luA<(KMC zSNNXt4Ou(=e4jS`{4G(jem&#**6sTn=20IHEA{ij4I3XlqctbG0llw1&!Mu}f7_&% z1J9n%4IK`>_a&f1yvTid>1y~gXBu4oRR6hS?LvgV)v#ej!mg-;m6+&VquPlZGLJ7P z07=oE%Qd6^jGA?M$!L7&@l~Mmy1m;E8=jnsgT~+dVVTvrWhI z@mBUXJryzk{IZ3$;Nz8yv>@?*din%>y} zkUGEV#E{t4=MLe}CnRqm=KjU_+NpPZOFqv&5q>SFIxGDis<(loRc z+%(1@o4?@Up5x5@j8}&i^VC=CeOAs*EyQ8hy5*4{3yOiKA8Ni;?$`<2(e=bONQSVG zIiKoejV`uPFS zcn{6n0H^S;RpISZJYV{A;zCBkw^Ov%(@6@IzfWoJi295!`r+P}&lyeZ(xu^*!8S-*`x2y$6_!p7SPa{0XdZeVSC zdd!^i6{*9v-_Clv;nuo=u!^h&4+`_BmmK%IoniWZKXgs%=?%wZ>U)4SZFk7}M*5Z6C4Y4g^BToR-ku7r>) zHebHMew@_FXqlmT?^?7%S-S6D91nlN1M#%Y?u*O6{kKP0v4Nmj4Dr@`pcX4HCTHn1ktSljkqra=9$JWTv7y;9$Tw zD_Q*J!@#Gkuerw>bLRCNEuBPPn^u4~)dhKs$$9wkOLpPYBVb9VKXUBL`JRz?f|4)N zCU1^jx9+KO#mMe4!B0%(UrX=o?RW%PP{liuy?5x;ZS2hFA2A{4q6SSmXHIr)`^;ea zjtfTGowOEq-52vnFU&ca!;+Oz6E_$0m2)OWehoNL9=4w1pR(|H!ux^PDW$H5Gk_lr zAbM3aYI!N5U*vq+hC4aX_#H;LsyNxj2=};r^^dI5={x-+cNGV>A16O88nHX|>YT=k znc477i@zo_8fGu3Z?Sq#PDmLaKlV1r<@}P0w=;nH-`{E4Ut)B?&6Pz9^M7P7V?OWA zM1Athe=#t<%55!h$kDWFvLS2YVe;gRMJeh-W4CQth^s#eC>SHRCEw+& z@UKKrlkc=%?0xo$GO%H|rxlKS9(PNYgI!caEI|Z{cg+j}_^-*!SNIHj;df1((!Q>Y zrfLGiR-#_wQ<U|amMrdQ7^aoH8nZ9=CpbruMDqG%aU;`%FvFahUK|eluI((rj;jVmE|A16+1RP zU`_pg2e>!poGnPNUetJeaiH_SlC@FAurafXo~_xnYhYQ#U2xAVyj#J5X2~&FhVlB+ z5v>DNIGbB{K~LdW$eNYjUr*=t+&T1o8hkY0_fplPt=;DWcaP7FG31Ziw)ch&vE$A9 zE8BKG4d=$DFTAv9%hTtbze_usPSTqncojL-hc&*qvNxg-9WQ^qW_#ituLEC4W(iCE zlR%#xr?tgAzHwgQ8KG4>56!F@ebB?`F?jvygwdHDO{<-ZZwE8lFqXX{pBMg-3t~1# z9T_~k|1oa3vk%f?%jt%O3(b#tm039@nxii&n_H{#$Fr+`^eZCM(!$SO!;_5b`&*w; zs(K}b4{hZ=v4VD|(*2w#Q_8_(Dy8wz4NEw)#EtGBIGjUkY@r&kM@WmNvMeG|^>Ea{ zA9){7b#+2-&mG`OgF@TO_s+P$?~w^h(mU7eeDTKc=>POq@GJNi0>2RWg}^Taej)G+ zf&Ui>ygyv$b+y_(G}Ij*<-$gCz$ijAA2~gs@<-0)iNVV`= z_W3QkZvpGl{IUb$*Gw9f@;K|vBzcLlB|$Va)sdHY_|fRHZ_DP6ES;IDuNm?C=XYZ+ zKk$8f$=9nN-ZNpEV5eG#?#T5X>^S!N7;!4$j!(;K(1~rntFqfS#0nPHY~2+4><>NL zRib+bMrV92(NFv$bG1!QZkKQ5d|W#nCyxknj4cxeXyC5LA7hue^si=upd;o9$eP9Wb(mDHDe;foGZ?>iwCM}H>I8KqfCzGIrlw$ zTi?z*aqEd<;)*fT22GgTL$iOQl`q&kO7BbQGjxv*UQxDk;;1^0j)8K+wDI3wpFbu? zCZ~Kma--taz3lS-ZgoPFVCw0|U8~_13(wtrk@ z$?bQ96^wbp8K9G?s-{wvvg*5%UN->)n|l{Dc8G7WdX-|Tzx>_8Z5 zeSgf&`{-J#x31&P#y#U!=R4GmJ-cdc?Npr4S+7~-HT-f}w3f7s}br^!|OK4$v$ zbxWhR4tGJm1PBrj4oG08N z)pO40jW)@#<_(0kH+07oaj_ADGyU5!#G~Il$yR@QN0~<^51@uFK8v<&m=|8dPq;9<^MM9Gv%FIjdnc?$OC-&Wx%)Cv1Q0;xxN1^#l z)tyNHbVfhrV$u1+jt0lJ;Ylyj^BWd(`ceuSUiD7wd9&QDpo}tZ-`bFS&Ky6|(-59; z?lOhrv{Of?FQ+%n(2OK60Eq+AO4EE+#x!!Aazce6<$U5ShKKY}edO7zjZI}Cn8N!%1)rU%b z;RWAP&>KcPL--6{b858ecgV31@;~{GznXO`6{>UtukPk2ocOTv>)f!z1>u)3+~>RI z<&Q0zeR##91RAF`Boxu#)9N&dMtf8;%i+?Vsew`-LEHPL>!?G1g->_ysUCg9A#H^7 z)nyg_p;nN~AHFG@qYKh!$3kNv)cP4!?Q=QPdz{prkE4?0)y%8XgEb#N`{gZumPlVdzkxSRU(xXdzos%4 z?|U}nozJ=lcz5TgT*aNMuQZzQM>)*LTtCN&7=l0)r_JCEM#;y`Y z_TL*lzXcLa?W&tNChqh~+2HPiilzgO=UUc7HlM}K{bMXRBF5Mo@a*mzWMe1nK>6Kk znfsBJMT6C&=GMoSUhFu)E?!d8d(U{n>uvpli1)=)zlIL$%sYZed6233_8>XLU-;Ye zk02My#F2W}=NU)DC#XNXAEJ(@B#J+cp4_suVf_F6@ckdB3jW39K!}f4q>kt9xI zpJoX0kt@}*|C$-(LZwiMI;J2zLMNoeB}!-jQ-agkZSg7`4l6+504BkTX9JN~g<268 zufPhKR05zNSa6oV#(-S@7KOD(;lu4wKoZ5GP*5Ut0M#B%!4U}%xj-HiVIlJY1Pu;n zq0L;9&LSr#%4JjlO0pNv(vw&eF&xh%U~v`>K*h#ei8g?XRnWLtfJ(({xavqgO)Vw~ zOp+kAR;=O1+jH~rY>I`7mn4B)=y(E@$`)AYM4bR{qgbgbz(TVDb{o@5QvnE`3J_AG zBo-o5fafxqcsvlS7P4SAALUJ{CFGzT-(L@NY>mk9A77l?`g1>;l#sZ66XBa}E4l9q%})09{amxjQT z_$Z`aN}z=c@InMhtBOF8EO9(OkHcUDiRc!UNC9#o$RPla&Bw5!Y*I3TV#8{cW-MNz z3YJM>LJXZ_;OY~YSg?^7g@@s(#CQY8K(MN~Y-6xcuZT0+&s>xkl28w3$;81dJv2eA z=0eQWcpfW)fn)NlCW(s@DY5v zl8Qy!83n*NQi_EspkhV9zw`#sq@TV73jqtUFo{$<_W(KCV&|mgFTcmY0!%!hkO4oL z`p-NC5ET0|R$(PU%|aYA0)c?yStgpED&SB-E=CNWXF;1xa065#RI3whVj+u304P{I z5s4Qu_y|1(g9DQzEod_>0z!w$5}{(ERIAgWNl|1p){dkI0CZX~3Jjq#2zZ^0h)^er zutq*1oXp0NNGuDCo5&=wElJ@xGds%0hmy1kDpN1AL~4V=q3lQu$b|;xMntmE76nHX zjEytJCq>ffVyH+CPS9YvVxbAohcM&BC^MOBg%A_t5}0gNlnKkED7cAA34(yMbCR8) zN5hdyjuk+{Q78z4turJN?ITK2GLb-K5h>&7V7)amm>4GY;FxTC@2Q|a^~geH|Lbo4OD_Wy4jW@kY;So^l{(1PbJ6yM?D}HyFP~FZA2s0E}uX3_wUsc^i;q| z!trn<7C=-37ABUc`X|k1Qhu^pA+QVc-;~}WvEcvVI|TPY8zfgH;vz{rD^exaVpKe_6ar=0SXM^7(XO=dK_V~< z#$|v>PJ~ zg&@erwD2Ih1OXo}73mY`N;OFaK*G&r1ew8%xA57PATlmdEJ+AvaI{h&Nvlv81vWKG z1&h=&s3MRH7_PxvkY>4trw*oaHGHhm7$g(Yz(klq!BSvllDK#dEj-BtW2)t3p&3fl zh%Gv^MvH{85J-qXY)2Aoi= sub { my $cert = srctop_file("test", "certs", "ee-self-signed.pem"); my $key = srctop_file("test", "certs", "ee-key.pem"); - plan skip_all => "Binary input tests currently disabled on Windows" if $^O =~ /^MSWin32$/; plan tests => 11; ok(run(app(["openssl", "cms", "-sign", "-md", "sha256", @@ -829,29 +828,31 @@ subtest "CMS binary input tests\n" => sub { "-binary", "-in", $signed, "-out", $verified])), "verify binary input with -binary"); is(compare($input, $verified), 0, "binary input retained with -binary"); + ok(run(app(["openssl", "cms", "-sign", "-md", "sha256", "-signer", $cert, "-inkey", $key, - "-in", $input, "-out", $signed])), + "-in", $input, "-out", $signed.".nobin"])), "sign binary input without -binary"); ok(run(app(["openssl", "cms", "-verify", "-CAfile", $cert, - "-in", $signed, "-out", $verified])), + "-in", $signed.".nobin", "-out", $verified.".nobin"])), "verify binary input without -binary"); - is(compare($input, $verified), 1, "binary input not retained without -binary"); + is(compare($input, $verified.".nobin"), 1, "binary input not retained without -binary"); ok(!run(app(["openssl", "cms", "-verify", "-CAfile", $cert, "-crlfeol", - "-binary", "-in", $signed, "-out", $verified])), + "-binary", "-in", $signed, "-out", $verified.".crlfeol"])), "verify binary input wrong crlfeol"); ok(run(app(["openssl", "cms", "-sign", "-md", "sha256", "-crlfeol", "-signer", $cert, "-inkey", $key, "-binary", "-in", $input, "-out", $signed.".crlf"])), - "sign binary input crlfeol"); + "sign binary input with -binary -crlfeol"); ok(run(app(["openssl", "cms", "-verify", "-CAfile", $cert, "-crlfeol", "-binary", "-in", $signed.".crlf", "-out", $verified.".crlf"])), - "verify binary input crlfeol"); - is(compare($input, $verified.".crlf"), 0); + "verify binary input with -binary -crlfeol"); + is(compare($input, $verified.".crlf"), 0, + "binary input retained with -binary -crlfeol"); ok(!run(app(["openssl", "cms", "-verify", "-CAfile", $cert, - "-binary", "-in", $signed.".crlf", "-out", $verified.".crlf"])), - "verify binary input missing crlfeol"); + "-binary", "-in", $signed.".crlf", "-out", $verified.".crlf2"])), + "verify binary input with -binary missing -crlfeol"); }; sub check_availability { diff --git a/test/smcont.bin b/test/smcont.bin index 2a5ce10224ce2b98b481273ef8a04cc4557a9e26..96e5c574857b8230987d0a82affbb14d7450af80 100644 GIT binary patch delta 49 wcmX?Lcfd|4H7`XsxhN;ike3U@%t_