1/* 2 * md5.c: checksum routines 3 * 4 * ==================================================================== 5 * Licensed to the Apache Software Foundation (ASF) under one 6 * or more contributor license agreements. See the NOTICE file 7 * distributed with this work for additional information 8 * regarding copyright ownership. The ASF licenses this file 9 * to you under the Apache License, Version 2.0 (the 10 * "License"); you may not use this file except in compliance 11 * with the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, 16 * software distributed under the License is distributed on an 17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18 * KIND, either express or implied. See the License for the 19 * specific language governing permissions and limitations 20 * under the License. 21 * ==================================================================== 22 */ 23 24 25#include <apr_md5.h> 26#include "md5.h" 27#include "svn_md5.h" 28 29 30 31/* The MD5 digest for the empty string. */ 32static const unsigned char svn_md5__empty_string_digest_array[] = { 33 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 34 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e 35}; 36 37const unsigned char * 38svn_md5__empty_string_digest(void) 39{ 40 return svn_md5__empty_string_digest_array; 41} 42 43 44const char * 45svn_md5__digest_to_cstring_display(const unsigned char digest[], 46 apr_pool_t *pool) 47{ 48 static const char *hex = "0123456789abcdef"; 49 char *str = apr_palloc(pool, (APR_MD5_DIGESTSIZE * 2) + 1); 50 int i; 51 52 for (i = 0; i < APR_MD5_DIGESTSIZE; i++) 53 { 54 str[i*2] = hex[digest[i] >> 4]; 55 str[i*2+1] = hex[digest[i] & 0x0f]; 56 } 57 str[i*2] = '\0'; 58 59 return str; 60} 61 62 63const char * 64svn_md5__digest_to_cstring(const unsigned char digest[], apr_pool_t *pool) 65{ 66 static const unsigned char zeros_digest[APR_MD5_DIGESTSIZE] = { 0 }; 67 68 if (memcmp(digest, zeros_digest, APR_MD5_DIGESTSIZE) != 0) 69 return svn_md5__digest_to_cstring_display(digest, pool); 70 else 71 return NULL; 72} 73 74 75svn_boolean_t 76svn_md5__digests_match(const unsigned char d1[], const unsigned char d2[]) 77{ 78 static const unsigned char zeros[APR_MD5_DIGESTSIZE] = { 0 }; 79 80 return ((memcmp(d1, zeros, APR_MD5_DIGESTSIZE) == 0) 81 || (memcmp(d2, zeros, APR_MD5_DIGESTSIZE) == 0) 82 || (memcmp(d1, d2, APR_MD5_DIGESTSIZE) == 0)); 83} 84 85/* These are all deprecated, and just wrap the internal functions defined 86 above. */ 87const unsigned char * 88svn_md5_empty_string_digest(void) 89{ 90 return svn_md5__empty_string_digest(); 91} 92 93const char * 94svn_md5_digest_to_cstring_display(const unsigned char digest[], 95 apr_pool_t *pool) 96{ 97 return svn_md5__digest_to_cstring_display(digest, pool); 98} 99 100const char * 101svn_md5_digest_to_cstring(const unsigned char digest[], apr_pool_t *pool) 102{ 103 return svn_md5__digest_to_cstring(digest, pool); 104} 105 106svn_boolean_t 107svn_md5_digests_match(const unsigned char d1[], const unsigned char d2[]) 108{ 109 return svn_md5__digests_match(d1, d2); 110} 111