]> granicus.if.org Git - apache/commitdiff
Expression parser: use hex encoding for the sha1 hash.
authorGraham Leggett <minfrin@apache.org>
Mon, 18 Mar 2013 00:27:38 +0000 (00:27 +0000)
committerGraham Leggett <minfrin@apache.org>
Mon, 18 Mar 2013 00:27:38 +0000 (00:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1457610 13f79535-47bb-0310-9956-ffa450edef68

server/util_expr_eval.c

index e59fe5749d8bdf974debc35d9bfa389da5350a31..e5858c402a5b8f274e6790821a74ae4399fd3fea 100644 (file)
@@ -1036,18 +1036,23 @@ static const char *unbase64_func(ap_expr_eval_ctx_t *ctx, const void *data,
 static const char *sha1_func(ap_expr_eval_ctx_t *ctx, const void *data,
                                const char *arg)
 {
-    int l;
     apr_sha1_ctx_t context;
-    apr_byte_t digest[APR_SHA1_DIGESTSIZE];
-    char *out = apr_palloc(ctx->p, 28);
+    apr_byte_t sha1[APR_SHA1_DIGESTSIZE];
+    char *hash, *out;
+    const char *hex = "0123456789abcdef";
+    int idx;
+
+    hash = out = apr_palloc(ctx->p, APR_SHA1_DIGESTSIZE*2+1);
 
     apr_sha1_init(&context);
     apr_sha1_update(&context, arg, strlen(arg));
-    apr_sha1_final(digest, &context);
+    apr_sha1_final(sha1, &context);
 
-    /* SHA1 hash is always 20 chars */
-    l = apr_base64_encode_binary(out, digest, sizeof(digest));
-    out[l] = '\0';
+    for (idx = 0; idx < APR_SHA1_DIGESTSIZE; idx++) {
+        *hash++ = hex[sha1[idx] >> 4];
+        *hash++ = hex[sha1[idx] & 0xF];
+    }
+    *hash++ = '\0';
 
     return out;
 }