1 | /* |
---|
2 | * sha1.c: SHA1 checksum routines |
---|
3 | * |
---|
4 | * ==================================================================== |
---|
5 | * Copyright (c) 2008 CollabNet. All rights reserved. |
---|
6 | * |
---|
7 | * This software is licensed as described in the file COPYING, which |
---|
8 | * you should have received as part of this distribution. The terms |
---|
9 | * are also available at http://subversion.tigris.org/license-1.html. |
---|
10 | * If newer versions of this license are posted there, you may use a |
---|
11 | * newer version instead, at your option. |
---|
12 | * |
---|
13 | * This software consists of voluntary contributions made by many |
---|
14 | * individuals. For exact contribution history, see the revision |
---|
15 | * history and logs, available at http://subversion.tigris.org/. |
---|
16 | * ==================================================================== |
---|
17 | */ |
---|
18 | |
---|
19 | #include <apr_sha1.h> |
---|
20 | |
---|
21 | #include "sha1.h" |
---|
22 | |
---|
23 | |
---|
24 | |
---|
25 | /* The SHA1 digest for the empty string. */ |
---|
26 | static const unsigned char svn_sha1__empty_string_digest_array[] = { |
---|
27 | 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, |
---|
28 | 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09 |
---|
29 | }; |
---|
30 | |
---|
31 | const unsigned char * |
---|
32 | svn_sha1__empty_string_digest(void) |
---|
33 | { |
---|
34 | return svn_sha1__empty_string_digest_array; |
---|
35 | } |
---|
36 | |
---|
37 | |
---|
38 | const char * |
---|
39 | svn_sha1__digest_to_cstring_display(const unsigned char digest[], |
---|
40 | apr_pool_t *pool) |
---|
41 | { |
---|
42 | static const char *hex = "0123456789abcdef"; |
---|
43 | char *str = apr_palloc(pool, (APR_SHA1_DIGESTSIZE * 2) + 1); |
---|
44 | int i; |
---|
45 | |
---|
46 | for (i = 0; i < APR_SHA1_DIGESTSIZE; i++) |
---|
47 | { |
---|
48 | str[i*2] = hex[digest[i] >> 4]; |
---|
49 | str[i*2+1] = hex[digest[i] & 0x0f]; |
---|
50 | } |
---|
51 | str[i*2] = '\0'; |
---|
52 | |
---|
53 | return str; |
---|
54 | } |
---|
55 | |
---|
56 | |
---|
57 | const char * |
---|
58 | svn_sha1__digest_to_cstring(const unsigned char digest[], apr_pool_t *pool) |
---|
59 | { |
---|
60 | static const unsigned char zeros_digest[APR_SHA1_DIGESTSIZE] = { 0 }; |
---|
61 | |
---|
62 | if (memcmp(digest, zeros_digest, APR_SHA1_DIGESTSIZE) != 0) |
---|
63 | return svn_sha1__digest_to_cstring_display(digest, pool); |
---|
64 | else |
---|
65 | return NULL; |
---|
66 | } |
---|
67 | |
---|
68 | |
---|
69 | svn_boolean_t |
---|
70 | svn_sha1__digests_match(const unsigned char d1[], const unsigned char d2[]) |
---|
71 | { |
---|
72 | static const unsigned char zeros[APR_SHA1_DIGESTSIZE] = { 0 }; |
---|
73 | |
---|
74 | return ((memcmp(d1, zeros, APR_SHA1_DIGESTSIZE) == 0) |
---|
75 | || (memcmp(d2, zeros, APR_SHA1_DIGESTSIZE) == 0) |
---|
76 | || (memcmp(d1, d2, APR_SHA1_DIGESTSIZE) == 0)); |
---|
77 | } |
---|