source: trunk/third/rpm/rpmio/tdigest.c @ 17931

Revision 17931, 4.5 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17930, which included commits to RCS files with non-trunk default branches.
Line 
1#include "system.h"
2#include "rpmio_internal.h"
3#include "popt.h"
4#include "debug.h"
5
6
7static pgpHashAlgo hashalgo = PGPHASHALGO_MD5;
8static rpmDigestFlags flags = RPMDIGEST_NONE;
9extern int _rpmio_debug;
10
11static int fips = 0;
12
13const char * FIPSAdigest = "a9993e364706816aba3e25717850c26c9cd0d89d";
14const char * FIPSBdigest = "84983e441c3bd26ebaae4aa1f95129e5e54670f1";
15const char * FIPSCdigest = "34aa973cd4c4daa4f61eeb2bdbad27316534016f";
16
17static struct poptOption optionsTable[] = {
18 { "md5", '\0', POPT_ARG_VAL,   &hashalgo, PGPHASHALGO_MD5,     NULL, NULL },
19 { "sha1",'\0', POPT_ARG_VAL,   &hashalgo, PGPHASHALGO_SHA1,    NULL, NULL },
20#ifdef  DYING
21 { "reverse",'\0', POPT_BIT_SET, &flags, RPMDIGEST_REVERSE,     NULL, NULL },
22#endif
23 { "fipsa",'\0', POPT_ARG_VAL, &fips, 1,        NULL, NULL },
24 { "fipsb",'\0', POPT_ARG_VAL, &fips, 2,        NULL, NULL },
25 { "fipsc",'\0', POPT_ARG_VAL, &fips, 3,        NULL, NULL },
26 { "debug",'d', POPT_ARG_VAL, &_rpmio_debug, -1,        NULL, NULL },
27  POPT_AUTOHELP
28  POPT_TABLEEND
29};
30
31#define SHA1_CMD        "/usr/bin/sha1sum"
32#define MD5_CMD         "/usr/bin/md5sum"
33
34int
35main(int argc, const char *argv[])
36{
37    poptContext optCon;
38    const char ** args;
39    const char * ifn;
40    const char * ofn = "/dev/null";
41    DIGEST_CTX ctx;
42    const char * idigest;
43    const char * odigest;
44    const char * sdigest;
45    const char * digest;
46    size_t digestlen;
47    int asAscii = 1;
48    int reverse = 0;
49    int rc;
50    char appendix;
51    int i;
52
53    optCon = poptGetContext(argv[0], argc, argv, optionsTable, 0);
54    while ((rc = poptGetNextOpt(optCon)) > 0)
55        ;
56
57#ifdef  DYING
58    reverse = (flags & RPMDIGEST_REVERSE);
59#endif
60    if (fips) {
61        ctx = rpmDigestInit(PGPHASHALGO_SHA1, flags);
62        ifn = NULL;
63        appendix = ' ';
64        sdigest = NULL;
65        switch (fips) {
66        case 1:
67            ifn = "abc";
68            rpmDigestUpdate(ctx, ifn, strlen(ifn));
69            sdigest = FIPSAdigest;
70            appendix = 'A';
71            break;
72        case 2:
73            ifn = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
74            rpmDigestUpdate(ctx, ifn, strlen(ifn));
75            sdigest = FIPSBdigest;
76            appendix = 'B';
77            break;
78        case 3:
79            ifn = "aaaaaaaaaaa ...";
80            for (i = 0; i < 1000000; i++)
81                rpmDigestUpdate(ctx, ifn, 1);
82            sdigest = FIPSCdigest;
83            appendix = 'C';
84            break;
85        }
86        if (ifn == NULL)
87            return 1;
88        rpmDigestFinal(ctx, (void **)&digest, &digestlen, asAscii);
89
90        if (digest) {
91            fprintf(stdout, "%s     %s\n", digest, ifn);
92            fflush(stdout);
93            free((void *)digest);
94        }
95        if (sdigest) {
96            fprintf(stdout, "%s     FIPS PUB 180-1 Appendix %c\n", sdigest,
97                appendix);
98            fflush(stdout);
99        }
100        return 0;
101    }
102
103    args = poptGetArgs(optCon);
104    rc = 0;
105    if (args)
106    while ((ifn = *args++) != NULL) {
107        FD_t ifd;
108        FD_t ofd;
109        unsigned char buf[BUFSIZ];
110        ssize_t nb;
111
112        sdigest = NULL;
113        {   char *se;
114            FILE * sfp;
115
116            se = buf;
117            *se = '\0';
118            se = stpcpy(se, ((hashalgo == PGPHASHALGO_SHA1) ? SHA1_CMD : MD5_CMD));
119            *se++ = ' ';
120            se = stpcpy(se, ifn);
121            if ((sfp = popen(buf, "r")) != NULL) {
122                fgets(buf, sizeof(buf), sfp);
123                if ((se = strchr(buf, ' ')) != NULL)
124                    *se = '\0';
125                sdigest = xstrdup(buf);
126                pclose(sfp);
127            }
128        }
129
130        ifd = Fopen(ifn, "r.ufdio");
131        if (ifd == NULL || Ferror(ifd)) {
132            fprintf(stderr, _("cannot open %s: %s\n"), ifn, Fstrerror(ifd));
133            if (ifd) Fclose(ifd);
134            rc++;
135            continue;
136        }
137        idigest = NULL;
138        fdInitDigest(ifd, hashalgo, reverse);
139
140        ofd = Fopen(ofn, "w.ufdio");
141        if (ofd == NULL || Ferror(ofd)) {
142            fprintf(stderr, _("cannot open %s: %s\n"), ofn, Fstrerror(ofd));
143            if (ifd) Fclose(ifd);
144            if (ofd) Fclose(ofd);
145            rc++;
146            continue;
147        }
148        odigest = NULL;
149        fdInitDigest(ofd, hashalgo, reverse);
150
151        ctx = rpmDigestInit(hashalgo, flags);
152
153        while ((nb = Fread(buf, 1, sizeof(buf), ifd)) > 0) {
154            rpmDigestUpdate(ctx, buf, nb);
155            (void) Fwrite(buf, 1, nb, ofd);
156        }
157
158        fdFiniDigest(ifd, hashalgo, (void **)&idigest, NULL, asAscii);
159        Fclose(ifd);
160
161        Fflush(ofd);
162        fdFiniDigest(ofd, hashalgo, (void **)&odigest, NULL, asAscii);
163        Fclose(ofd);
164
165        rpmDigestFinal(ctx, (void **)&digest, &digestlen, asAscii);
166
167        if (digest) {
168            fprintf(stdout, "%s     %s\n", digest, ifn);
169            fflush(stdout);
170            free((void *)digest);
171        }
172        if (idigest) {
173            fprintf(stdout, "%s in  %s\n", idigest, ifn);
174            fflush(stdout);
175            free((void *)idigest);
176        }
177        if (odigest) {
178            fprintf(stdout, "%s out %s\n", odigest, ofn);
179            fflush(stdout);
180            free((void *)odigest);
181        }
182        if (sdigest) {
183            fprintf(stdout, "%s cmd %s\n", sdigest, ifn);
184            fflush(stdout);
185            free((void *)sdigest);
186        }
187    }
188    return rc;
189}
Note: See TracBrowser for help on using the repository browser.