-
-
-static char nib2b64[0x40+1] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static char *
-calculate_digest(CT ct, int asciiP)
-{
- int cc;
- char buffer[BUFSIZ], *vp, *op;
- unsigned char *dp;
- unsigned char digest[16];
- unsigned char outbuf[25];
- FILE *in;
- MD5_CTX mdContext;
- CE ce = ct->c_cefile;
-
- /* open content */
- if ((in = fopen(ce->ce_file, "r")) == NULL)
- adios(ce->ce_file, "unable to open for reading");
-
- /* Initialize md5 context */
- MD5Init(&mdContext);
-
- /* calculate md5 message digest */
- if (asciiP) {
- while (fgets(buffer, sizeof(buffer) - 1, in)) {
- char c, *cp;
-
- cp = buffer + strlen(buffer) - 1;
- if ((c = *cp) == '\n')
- *cp = '\0';
-
- MD5Update(&mdContext, (unsigned char *) buffer,
- (unsigned int) strlen(buffer));
-
- if (c == '\n')
- MD5Update(&mdContext, (unsigned char *) "\r\n",
- 2);
- }
- } else {
- while ((cc = fread(buffer, sizeof(*buffer), sizeof(buffer),
- in)) > 0)
- MD5Update(&mdContext, (unsigned char *) buffer,
- (unsigned int) cc);
- }
-
- /* md5 finalization. Write digest and zero md5 context */
- MD5Final(digest, &mdContext);
-
- /* close content */
- fclose(in);
-
- /* print debugging info */
- if (debugsw) {
- unsigned char *ep;
-
- fprintf(stderr, "MD5 digest=");
- for (ep = (dp = digest) + sizeof(digest) / sizeof(digest[0]);
- dp < ep; dp++)
- fprintf(stderr, "%02x", *dp & 0xff);
- fprintf(stderr, "\n");
- }
-
- /* encode the digest using base64 */
- for (dp = digest, op = outbuf, cc = sizeof(digest) / sizeof(digest[0]);
- cc > 0; cc -= 3, op += 4) {
- unsigned long bits;
- char *bp;
-
- bits = (*dp++ & 0xff) << 16;
- if (cc > 1) {
- bits |= (*dp++ & 0xff) << 8;
- if (cc > 2)
- bits |= *dp++ & 0xff;
- }
-
- for (bp = op + 4; bp > op; bits >>= 6)
- *--bp = nib2b64[bits & 0x3f];
- if (cc < 3) {
- *(op + 3) = '=';
- if (cc < 2)
- *(op + 2) = '=';
- }
- }
-
- /* null terminate string */
- outbuf[24] = '\0';
-
- /* now make copy and return string */
- vp = concat(" ", outbuf, "\n", NULL);
- return vp;
-}