<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>lib/rpmchecksig.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.17 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>lib/rpmchecksig.c</h1><a href="lib_2rpmchecksig_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 00006 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span> 00007 00008 <span class="preprocessor">#include <<a class="code" href="rpmcli_8h.html">rpmcli.h</a>></span> 00009 00010 <span class="preprocessor">#include "<a class="code" href="rpmlead_8h.html">rpmlead.h</a>"</span> 00011 <span class="preprocessor">#include "<a class="code" href="signature_8h.html">signature.h</a>"</span> 00012 <span class="preprocessor">#include "<a class="code" href="misc_8h.html">misc.h</a>"</span> <span class="comment">/* XXX for makeTempFile() */</span> 00013 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span> 00014 00015 <span class="comment">/*@access Header@*/</span> <span class="comment">/* XXX compared with NULL */</span> 00016 <span class="comment">/*@access FD_t@*/</span> <span class="comment">/* XXX compared with NULL */</span> 00017 <a name="l00018"></a><a class="code" href="lib_2rpmchecksig_8c.html#a0">00018</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(<a class="code" href="struct__FD__s.html">FD_t</a> *fdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **fnp, <span class="keywordtype">int</span> flags, 00019 <span class="comment">/*@unused@*/</span> <span class="keywordtype">int</span> rc) 00020 <span class="comment">/*@globals rpmGlobalMacroContext, fileSystem @*/</span> 00021 <span class="comment">/*@modifies *fdp, *fnp, rpmGlobalMacroContext, fileSystem @*/</span> 00022 { 00023 <span class="keyword">const</span> <span class="keywordtype">char</span> *fn; 00024 <a class="code" href="struct__FD__s.html">FD_t</a> fd; 00025 00026 <span class="keywordflow">if</span> (fdp == NULL) { <span class="comment">/* programmer error */</span> 00027 <span class="keywordflow">return</span> 1; 00028 } 00029 00030 <span class="comment">/* close and reset *fdp to NULL */</span> 00031 <span class="keywordflow">if</span> (*fdp && (fnp == NULL || *fnp == NULL)) { 00032 (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(*fdp); 00033 *fdp = NULL; 00034 <span class="keywordflow">return</span> 0; 00035 } 00036 00037 <span class="comment">/* open a file and set *fdp */</span> 00038 <span class="keywordflow">if</span> (*fdp == NULL && fnp && *fnp) { 00039 fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*fnp, ((flags & O_WRONLY) ? <span class="stringliteral">"w.ufdio"</span> : <span class="stringliteral">"r.ufdio"</span>)); 00040 <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) { 00041 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a63">RPMERR_OPEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: open failed: %s\n"</span>), *fnp, 00042 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd)); 00043 <span class="keywordflow">return</span> 1; 00044 } 00045 *fdp = fd; 00046 <span class="keywordflow">return</span> 0; 00047 } 00048 00049 <span class="comment">/* open a temp file */</span> 00050 <span class="keywordflow">if</span> (*fdp == NULL && (fnp == NULL || *fnp == NULL)) { 00051 fn = NULL; 00052 <span class="keywordflow">if</span> (<a class="code" href="lib_2misc_8c.html#a8">makeTempFile</a>(NULL, (fnp ? &fn : NULL), &fd)) { 00053 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a74">RPMERR_MAKETEMP</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"makeTempFile failed\n"</span>)); 00054 <span class="keywordflow">return</span> 1; 00055 } 00056 <span class="keywordflow">if</span> (fnp) 00057 *fnp = fn; 00058 *fdp = <a class="code" href="rpmio_8h.html#a5">fdLink</a>(fd, <span class="stringliteral">"manageFile return"</span>); 00059 (void) <a class="code" href="rpmio_8h.html#a6">fdFree</a>(fd, <span class="stringliteral">"manageFile return"</span>); 00060 <span class="keywordflow">return</span> 0; 00061 } 00062 00063 <span class="comment">/* no operation */</span> 00064 <span class="keywordflow">if</span> (*fdp && fnp && *fnp) { 00065 <span class="keywordflow">return</span> 0; 00066 } 00067 00068 <span class="comment">/* XXX never reached */</span> 00069 <span class="keywordflow">return</span> 1; 00070 } 00071 <a name="l00072"></a><a class="code" href="lib_2rpmchecksig_8c.html#a1">00072</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(<a class="code" href="struct__FD__s.html">FD_t</a> *sfdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **sfnp, 00073 <a class="code" href="struct__FD__s.html">FD_t</a> *tfdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **tfnp) 00074 <span class="comment">/*@modifies *sfdp, *sfnp, *tfdp, *tfnp, fileSystem @*/</span> 00075 { 00076 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> buffer[BUFSIZ]; 00077 ssize_t count; 00078 <span class="keywordtype">int</span> rc = 1; 00079 00080 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(sfdp, sfnp, O_RDONLY, 0)) 00081 <span class="keywordflow">goto</span> exit; 00082 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(tfdp, tfnp, O_WRONLY|O_CREAT|O_TRUNC, 0)) 00083 <span class="keywordflow">goto</span> exit; 00084 00085 <span class="keywordflow">while</span> ((count = <a class="code" href="group__rpmio.html#a77">Fread</a>(buffer, <span class="keyword">sizeof</span>(buffer[0]), <span class="keyword">sizeof</span>(buffer), *sfdp)) > 0) { 00086 <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a78">Fwrite</a>(buffer, <span class="keyword">sizeof</span>(buffer[0]), count, *tfdp) != count) { 00087 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a75">RPMERR_FWRITE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Fwrite failed: %s\n"</span>), *tfnp, 00088 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(*tfdp)); 00089 <span class="keywordflow">goto</span> exit; 00090 } 00091 } 00092 <span class="keywordflow">if</span> (count < 0) { 00093 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a76">RPMERR_FREAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Fread failed: %s\n"</span>), *sfnp, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(*sfdp)); 00094 <span class="keywordflow">goto</span> exit; 00095 } 00096 00097 rc = 0; 00098 00099 exit: 00100 <span class="keywordflow">if</span> (*sfdp) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(sfdp, NULL, 0, rc); 00101 <span class="keywordflow">if</span> (*tfdp) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(tfdp, NULL, 0, rc); 00102 <span class="keywordflow">return</span> rc; 00103 } 00104 <a name="l00105"></a><a class="code" href="group__rpmcli.html#a38">00105</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a38">rpmReSign</a>(<a class="code" href="group__rpmcli.html#a17">rpmResignFlags</a> flags, <span class="keywordtype">char</span> * passPhrase, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv) 00106 { 00107 <a class="code" href="struct__FD__s.html">FD_t</a> fd = NULL; 00108 <a class="code" href="struct__FD__s.html">FD_t</a> ofd = NULL; 00109 <span class="keyword">struct </span><a class="code" href="structrpmlead.html">rpmlead</a> lead, *l = &lead; 00110 <a class="code" href="header_8h.html#a9">int_32</a> sigtag; 00111 <span class="keyword">const</span> <span class="keywordtype">char</span> *rpm, *trpm; 00112 <span class="keyword">const</span> <span class="keywordtype">char</span> *sigtarget = NULL; 00113 <span class="keywordtype">char</span> tmprpm[1024+1]; 00114 <a class="code" href="structheaderToken.html">Header</a> sig = NULL; 00115 <span class="keywordtype">void</span> * uh = NULL; 00116 <a class="code" href="header_8h.html#a9">int_32</a> uht, uhc; 00117 <span class="keywordtype">int</span> res = <a class="code" href="system_8h.html#a3">EXIT_FAILURE</a>; 00118 <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc; 00119 <span class="keywordtype">int</span> xx; 00120 00121 tmprpm[0] = <span class="charliteral">'\0'</span>; 00122 <span class="keywordflow">if</span> (argv) 00123 <span class="keywordflow">while</span> ((rpm = *argv++) != NULL) { 00124 00125 fprintf(stdout, <span class="stringliteral">"%s:\n"</span>, rpm); 00126 00127 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&fd, &rpm, O_RDONLY, 0)) 00128 <span class="keywordflow">goto</span> exit; 00129 00130 memset(l, 0, <span class="keyword">sizeof</span>(*l)); 00131 <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a1">readLead</a>(fd, l)) { 00132 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a77">RPMERR_READLEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: readLead failed\n"</span>), rpm); 00133 <span class="keywordflow">goto</span> exit; 00134 } 00135 <span class="keywordflow">switch</span> (l-><a class="code" href="structrpmlead.html#m1">major</a>) { 00136 <span class="keywordflow">case</span> 1: 00137 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Can't sign v1.0 RPM\n"</span>), rpm); 00138 <span class="keywordflow">goto</span> exit; 00139 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00140 <span class="keywordflow">case</span> 2: 00141 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Can't re-sign v2.0 RPM\n"</span>), rpm); 00142 <span class="keywordflow">goto</span> exit; 00143 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00144 <span class="keywordflow">default</span>: 00145 <span class="keywordflow">break</span>; 00146 } 00147 00148 rc = <a class="code" href="group__signature.html#a5">rpmReadSignature</a>(fd, &sig, l-><a class="code" href="structrpmlead.html#m7">signature_type</a>); 00149 <span class="keywordflow">if</span> (!(rc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || rc == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>)) { 00150 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmReadSignature failed\n"</span>), rpm); 00151 <span class="keywordflow">goto</span> exit; 00152 } 00153 <span class="keywordflow">if</span> (sig == NULL) { 00154 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available\n"</span>), rpm); 00155 <span class="keywordflow">goto</span> exit; 00156 } 00157 00158 <span class="comment">/* Write the header and archive to a temp file */</span> 00159 <span class="comment">/* ASSERT: ofd == NULL && sigtarget == NULL */</span> 00160 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&fd, &rpm, &ofd, &sigtarget)) 00161 <span class="keywordflow">goto</span> exit; 00162 <span class="comment">/* Both fd and ofd are now closed. sigtarget contains tempfile name. */</span> 00163 <span class="comment">/* ASSERT: fd == NULL && ofd == NULL */</span> 00164 00165 <span class="comment">/* Dump the immutable region (if present). */</span> 00166 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(sig, <a class="code" href="rpmlib_8h.html#a494a95">RPMTAG_HEADERSIGNATURES</a>, &uht, &uh, &uhc)) { 00167 <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi; 00168 <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count; 00169 <a class="code" href="header_8h.html#a17">hPTR_t</a> ptr; 00170 <a class="code" href="structheaderToken.html">Header</a> oh; 00171 <a class="code" href="structheaderToken.html">Header</a> nh; 00172 00173 nh = <a class="code" href="group__header.html#a51">headerNew</a>(); 00174 <span class="keywordflow">if</span> (nh == NULL) { 00175 uh = <a class="code" href="group__header.html#a83">headerFreeData</a>(uh, uht); 00176 <span class="keywordflow">goto</span> exit; 00177 } 00178 00179 oh = <a class="code" href="group__header.html#a31">headerCopyLoad</a>(uh); 00180 <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(oh); 00181 <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &tag, &type, &ptr, &count); 00182 ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type)) 00183 { 00184 <span class="keywordflow">if</span> (ptr) 00185 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(nh, tag, type, ptr, count); 00186 } 00187 hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi); 00188 oh = <a class="code" href="group__header.html#a16">headerFree</a>(oh); 00189 00190 sig = <a class="code" href="group__header.html#a16">headerFree</a>(sig); 00191 sig = <a class="code" href="group__header.html#a14">headerLink</a>(nh); 00192 nh = <a class="code" href="group__header.html#a16">headerFree</a>(nh); 00193 } 00194 00195 <span class="comment">/* Eliminate broken digest values. */</span> 00196 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>); 00197 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>); 00198 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a406">RPMSIGTAG_BADSHA1_1</a>); 00199 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a407">RPMSIGTAG_BADSHA1_2</a>); 00200 00201 <span class="comment">/* Toss and recalculate header+payload size and digests. */</span> 00202 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>); 00203 xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>, passPhrase); 00204 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>); 00205 xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>, passPhrase); 00206 <span class="preprocessor">#ifdef NOTYET </span><span class="comment">/* XXX leave new-fangled header-only digest in place. */</span> 00207 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a408">RPMSIGTAG_SHA1</a>); 00208 xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a408">RPMSIGTAG_SHA1</a>, passPhrase); 00209 <span class="preprocessor">#endif</span> 00210 <span class="preprocessor"></span> 00211 <span class="keywordflow">if</span> ((sigtag = <a class="code" href="group__signature.html#a8">rpmLookupSignatureType</a>(<a class="code" href="signature_8h.html#a0">RPMLOOKUPSIG_QUERY</a>)) > 0) { 00212 <span class="preprocessor">#ifdef NOTYET </span><span class="comment">/* XXX leave new-fangled header-only signatures in place. */</span> 00213 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>: 00214 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a409">RPMSIGTAG_DSA</a>); 00215 <span class="comment">/*@fallthrough@*/</span> 00216 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>: 00217 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>: 00218 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a410">RPMSIGTAG_RSA</a>); 00219 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 00220 } 00221 <span class="preprocessor">#endif</span> 00222 <span class="preprocessor"></span> xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, sigtag); 00223 xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, sigtag, passPhrase); 00224 } 00225 00226 <span class="comment">/* Reallocate the signature into one contiguous region. */</span> 00227 sig = <a class="code" href="group__header.html#a30">headerReload</a>(sig, <a class="code" href="rpmlib_8h.html#a494a95">RPMTAG_HEADERSIGNATURES</a>); 00228 <span class="keywordflow">if</span> (sig == NULL) <span class="comment">/* XXX can't happen */</span> 00229 <span class="keywordflow">goto</span> exit; 00230 00231 <span class="comment">/* Write the lead/signature of the output rpm */</span> 00232 strcpy(tmprpm, rpm); 00233 strcat(tmprpm, <span class="stringliteral">".XXXXXX"</span>); 00234 (void) <span class="comment">/*@-unrecog@*/</span> mktemp(tmprpm) <span class="comment">/*@=unrecog@*/</span>; 00235 trpm = tmprpm; 00236 00237 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&ofd, &trpm, O_WRONLY|O_CREAT|O_TRUNC, 0)) 00238 <span class="keywordflow">goto</span> exit; 00239 00240 l-><a class="code" href="structrpmlead.html#m7">signature_type</a> = <a class="code" href="group__signature.html#a12a11">RPMSIGTYPE_HEADERSIG</a>; 00241 <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a0">writeLead</a>(ofd, l)) { 00242 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a78">RPMERR_WRITELEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: writeLead failed: %s\n"</span>), trpm, 00243 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(ofd)); 00244 <span class="keywordflow">goto</span> exit; 00245 } 00246 00247 <span class="keywordflow">if</span> (<a class="code" href="group__signature.html#a6">rpmWriteSignature</a>(ofd, sig)) { 00248 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmWriteSignature failed: %s\n"</span>), trpm, 00249 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(ofd)); 00250 <span class="keywordflow">goto</span> exit; 00251 } 00252 00253 <span class="comment">/* Append the header and archive from the temp file */</span> 00254 <span class="comment">/* ASSERT: fd == NULL && ofd != NULL */</span> 00255 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&fd, &sigtarget, &ofd, &trpm)) 00256 <span class="keywordflow">goto</span> exit; 00257 <span class="comment">/* Both fd and ofd are now closed. */</span> 00258 <span class="comment">/* ASSERT: fd == NULL && ofd == NULL */</span> 00259 00260 <span class="comment">/* Clean up intermediate target */</span> 00261 (void) unlink(sigtarget); 00262 sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget); 00263 00264 <span class="comment">/* Move final target into place. */</span> 00265 (void) unlink(rpm); 00266 (void) rename(trpm, rpm); 00267 tmprpm[0] = <span class="charliteral">'\0'</span>; 00268 } 00269 00270 res = 0; 00271 00272 exit: 00273 <span class="keywordflow">if</span> (fd) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&fd, NULL, 0, res); 00274 <span class="keywordflow">if</span> (ofd) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&ofd, NULL, 0, res); 00275 00276 sig = <a class="code" href="group__signature.html#a9">rpmFreeSignature</a>(sig); 00277 00278 <span class="keywordflow">if</span> (sigtarget) { 00279 (void) unlink(sigtarget); 00280 sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget); 00281 } 00282 <span class="keywordflow">if</span> (tmprpm[0] != <span class="charliteral">'\0'</span>) { 00283 (void) unlink(tmprpm); 00284 tmprpm[0] = <span class="charliteral">'\0'</span>; 00285 } 00286 00287 <span class="keywordflow">return</span> res; 00288 } 00289 <a name="l00290"></a><a class="code" href="group__rpmcli.html#a37">00290</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a37">rpmCheckSig</a>(<a class="code" href="group__rpmcli.html#a16">rpmCheckSigFlags</a> flags, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv) 00291 { 00292 <a class="code" href="struct__FD__s.html">FD_t</a> fd = NULL; 00293 <a class="code" href="struct__FD__s.html">FD_t</a> ofd = NULL; 00294 <span class="keywordtype">int</span> res2, res3; 00295 <span class="keyword">struct </span><a class="code" href="structrpmlead.html">rpmlead</a> lead, *l = &lead; 00296 <span class="keyword">const</span> <span class="keywordtype">char</span> *rpm = NULL; 00297 <span class="keywordtype">char</span> result[8*BUFSIZ]; 00298 <span class="keyword">const</span> <span class="keywordtype">char</span> * sigtarget = NULL; 00299 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> buffer[8192]; 00300 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> missingKeys[7164]; 00301 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> untrustedKeys[7164]; 00302 <a class="code" href="structheaderToken.html">Header</a> sig; 00303 <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi; 00304 <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count; 00305 <span class="keyword">const</span> <span class="keywordtype">void</span> * ptr; 00306 <span class="keywordtype">int</span> res = 0; 00307 <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc; 00308 00309 <span class="keywordflow">if</span> (argv) 00310 <span class="keywordflow">while</span> ((rpm = *argv++) != NULL) { 00311 00312 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&fd, &rpm, O_RDONLY, 0)) { 00313 res++; 00314 <span class="keywordflow">goto</span> bottom; 00315 } 00316 00317 memset(l, 0, <span class="keyword">sizeof</span>(*l)); 00318 <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a1">readLead</a>(fd, l)) { 00319 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a77">RPMERR_READLEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: readLead failed\n"</span>), rpm); 00320 res++; 00321 <span class="keywordflow">goto</span> bottom; 00322 } 00323 <span class="keywordflow">switch</span> (l-><a class="code" href="structrpmlead.html#m1">major</a>) { 00324 <span class="keywordflow">case</span> 1: 00325 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available (v1.0 RPM)\n"</span>), rpm); 00326 res++; 00327 <span class="keywordflow">goto</span> bottom; 00328 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00329 <span class="keywordflow">default</span>: 00330 <span class="keywordflow">break</span>; 00331 } 00332 00333 rc = <a class="code" href="group__signature.html#a5">rpmReadSignature</a>(fd, &sig, l-><a class="code" href="structrpmlead.html#m7">signature_type</a>); 00334 <span class="keywordflow">if</span> (!(rc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || rc == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>)) { 00335 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmReadSignature failed\n"</span>), rpm); 00336 res++; 00337 <span class="keywordflow">goto</span> bottom; 00338 } 00339 <span class="keywordflow">if</span> (sig == NULL) { 00340 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available\n"</span>), rpm); 00341 res++; 00342 <span class="keywordflow">goto</span> bottom; 00343 } 00344 <span class="comment">/* Write the header and archive to a temp file */</span> 00345 <span class="comment">/* ASSERT: ofd == NULL && sigtarget == NULL */</span> 00346 <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&fd, &rpm, &ofd, &sigtarget)) { 00347 res++; 00348 <span class="keywordflow">goto</span> bottom; 00349 } 00350 <span class="comment">/* Both fd and ofd are now closed. sigtarget contains tempfile name. */</span> 00351 <span class="comment">/* ASSERT: fd == NULL && ofd == NULL */</span> 00352 00353 res2 = 0; 00354 missingKeys[0] = <span class="charliteral">'\0'</span>; 00355 untrustedKeys[0] = <span class="charliteral">'\0'</span>; 00356 sprintf(buffer, <span class="stringliteral">"%s:%c"</span>, rpm, (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>() ? <span class="charliteral">'\n'</span> : <span class="charliteral">' '</span>) ); 00357 00358 <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(sig); 00359 <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &tag, &type, &ptr, &count); 00360 ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type)) 00361 { 00362 <span class="keywordflow">switch</span> (tag) { 00363 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>: <span class="comment">/* XXX legacy */</span> 00364 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>: 00365 <span class="keywordflow">if</span> (!(flags & <a class="code" href="group__rpmcli.html#a43a64">CHECKSIG_PGP</a>)) 00366 <span class="keywordflow">continue</span>; 00367 <span class="keywordflow">break</span>; 00368 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>: 00369 <span class="keywordflow">if</span> (!(flags & <a class="code" href="group__rpmcli.html#a43a66">CHECKSIG_GPG</a>)) 00370 <span class="keywordflow">continue</span>; 00371 <span class="keywordflow">break</span>; 00372 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>: 00373 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>: 00374 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>: 00375 <span class="keywordflow">if</span> (!(flags & <a class="code" href="group__rpmcli.html#a43a65">CHECKSIG_MD5</a>)) 00376 <span class="keywordflow">continue</span>; 00377 <span class="keywordflow">break</span>; 00378 <span class="keywordflow">default</span>: 00379 <span class="keywordflow">continue</span>; 00380 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00381 } 00382 <span class="keywordflow">if</span> (ptr == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> 00383 00384 <span class="keywordflow">if</span> ((res3 = <a class="code" href="group__signature.html#a19">rpmVerifySignature</a>(sigtarget, tag, ptr, count, 00385 result))) { 00386 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) { 00387 strcat(buffer, result); 00388 res2 = 1; 00389 } <span class="keywordflow">else</span> { 00390 <span class="keywordtype">char</span> *tempKey; 00391 <span class="keywordflow">switch</span> (tag) { 00392 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>: 00393 strcat(buffer, <span class="stringliteral">"SIZE "</span>); 00394 res2 = 1; 00395 <span class="keywordflow">break</span>; 00396 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>: 00397 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>: 00398 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>: 00399 strcat(buffer, <span class="stringliteral">"MD5 "</span>); 00400 res2 = 1; 00401 <span class="keywordflow">break</span>; 00402 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>: <span class="comment">/* XXX legacy */</span> 00403 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>: 00404 <span class="keywordflow">switch</span> (res3) { 00405 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>: 00406 res2 = 1; 00407 <span class="comment">/*@fallthrough@*/</span> 00408 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a415">RPMSIG_NOTTRUSTED</a>: 00409 { <span class="keywordtype">int</span> offset = 7; 00410 strcat(buffer, <span class="stringliteral">"(PGP) "</span>); 00411 tempKey = strstr(result, <span class="stringliteral">"Key ID"</span>); 00412 <span class="keywordflow">if</span> (tempKey == NULL) { 00413 tempKey = strstr(result, <span class="stringliteral">"keyid:"</span>); 00414 offset = 9; 00415 } 00416 <span class="keywordflow">if</span> (tempKey) { 00417 <span class="keywordflow">if</span> (res3 == <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>) { 00418 strcat(missingKeys, <span class="stringliteral">" PGP#"</span>); 00419 <span class="comment">/*@-compdef@*/</span> 00420 strncat(missingKeys, tempKey + offset, 8); 00421 <span class="comment">/*@=compdef@*/</span> 00422 } <span class="keywordflow">else</span> { 00423 strcat(untrustedKeys, <span class="stringliteral">" PGP#"</span>); 00424 <span class="comment">/*@-compdef@*/</span> 00425 strncat(untrustedKeys, tempKey + offset, 8); 00426 <span class="comment">/*@=compdef@*/</span> 00427 } 00428 } 00429 } <span class="keywordflow">break</span>; 00430 <span class="keywordflow">default</span>: 00431 strcat(buffer, <span class="stringliteral">"PGP "</span>); 00432 res2 = 1; 00433 <span class="keywordflow">break</span>; 00434 } 00435 <span class="keywordflow">break</span>; 00436 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>: 00437 <span class="comment">/* Do not consider this a failure */</span> 00438 <span class="keywordflow">switch</span> (res3) { 00439 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>: 00440 strcat(buffer, <span class="stringliteral">"(GPG) "</span>); 00441 strcat(missingKeys, <span class="stringliteral">" GPG#"</span>); 00442 tempKey = strstr(result, <span class="stringliteral">"key ID"</span>); 00443 <span class="keywordflow">if</span> (tempKey) 00444 <span class="comment">/*@-compdef@*/</span> 00445 strncat(missingKeys, tempKey+7, 8); 00446 <span class="comment">/*@=compdef@*/</span> 00447 res2 = 1; 00448 <span class="keywordflow">break</span>; 00449 <span class="keywordflow">default</span>: 00450 strcat(buffer, <span class="stringliteral">"GPG "</span>); 00451 res2 = 1; 00452 <span class="keywordflow">break</span>; 00453 } 00454 <span class="keywordflow">break</span>; 00455 <span class="keywordflow">default</span>: 00456 strcat(buffer, <span class="stringliteral">"?UnknownSignatureType? "</span>); 00457 res2 = 1; 00458 <span class="keywordflow">break</span>; 00459 } 00460 } 00461 } <span class="keywordflow">else</span> { 00462 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) { 00463 strcat(buffer, result); 00464 } <span class="keywordflow">else</span> { 00465 <span class="keywordflow">switch</span> (tag) { 00466 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>: 00467 strcat(buffer, <span class="stringliteral">"size "</span>); 00468 <span class="keywordflow">break</span>; 00469 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>: 00470 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>: 00471 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>: 00472 strcat(buffer, <span class="stringliteral">"md5 "</span>); 00473 <span class="keywordflow">break</span>; 00474 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>: <span class="comment">/* XXX legacy */</span> 00475 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>: 00476 strcat(buffer, <span class="stringliteral">"pgp "</span>); 00477 <span class="keywordflow">break</span>; 00478 <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>: 00479 strcat(buffer, <span class="stringliteral">"gpg "</span>); 00480 <span class="keywordflow">break</span>; 00481 <span class="keywordflow">default</span>: 00482 strcat(buffer, <span class="stringliteral">"??? "</span>); 00483 <span class="keywordflow">break</span>; 00484 } 00485 } 00486 } 00487 } 00488 hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi); 00489 res += res2; 00490 (void) unlink(sigtarget); 00491 sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget); 00492 00493 <span class="keywordflow">if</span> (res2) { 00494 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) { 00495 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s"</span>, (<span class="keywordtype">char</span> *)buffer); 00496 } <span class="keywordflow">else</span> { 00497 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s%s%s%s%s%s%s%s\n"</span>, (<span class="keywordtype">char</span> *)buffer, 00498 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"NOT OK"</span>), 00499 (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (MISSING KEYS:"</span>) : <span class="stringliteral">""</span>, 00500 (<span class="keywordtype">char</span> *)missingKeys, 00501 (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">") "</span>) : <span class="stringliteral">""</span>, 00502 (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (UNTRUSTED KEYS:"</span>) : <span class="stringliteral">""</span>, 00503 (<span class="keywordtype">char</span> *)untrustedKeys, 00504 (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">")"</span>) : <span class="stringliteral">""</span>); 00505 00506 } 00507 } <span class="keywordflow">else</span> { 00508 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) { 00509 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s"</span>, (<span class="keywordtype">char</span> *)buffer); 00510 } <span class="keywordflow">else</span> { 00511 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s%s%s%s%s%s%s%s\n"</span>, (<span class="keywordtype">char</span> *)buffer, 00512 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"OK"</span>), 00513 (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (MISSING KEYS:"</span>) : <span class="stringliteral">""</span>, 00514 (<span class="keywordtype">char</span> *)missingKeys, 00515 (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">") "</span>) : <span class="stringliteral">""</span>, 00516 (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (UNTRUSTED KEYS:"</span>) : <span class="stringliteral">""</span>, 00517 (<span class="keywordtype">char</span> *)untrustedKeys, 00518 (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">")"</span>) : <span class="stringliteral">""</span>); 00519 } 00520 } 00521 00522 bottom: 00523 <span class="keywordflow">if</span> (fd) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&fd, NULL, 0, 0); 00524 <span class="keywordflow">if</span> (ofd) (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&ofd, NULL, 0, 0); 00525 <span class="keywordflow">if</span> (sigtarget) { 00526 (void) unlink(sigtarget); 00527 sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget); 00528 } 00529 } 00530 00531 <span class="keywordflow">return</span> res; 00532 } </pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:58 2002 for rpm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.17 </small></address> </body> </html>