1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <string.h> 12 #include <openssl/md5.h> 13 #include <openssl/crypto.h> 14 15 #ifdef CHARSET_EBCDIC 16 # include <openssl/ebcdic.h> 17 #endif 18 19 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md) 20 { 21 MD5_CTX c; 22 static unsigned char m[MD5_DIGEST_LENGTH]; 23 24 if (md == NULL) 25 md = m; 26 if (!MD5_Init(&c)) 27 return NULL; 28 #ifndef CHARSET_EBCDIC 29 MD5_Update(&c, d, n); 30 #else 31 { 32 char temp[1024]; 33 unsigned long chunk; 34 35 while (n > 0) { 36 chunk = (n > sizeof(temp)) ? sizeof(temp) : n; 37 ebcdic2ascii(temp, d, chunk); 38 MD5_Update(&c, temp, chunk); 39 n -= chunk; 40 d += chunk; 41 } 42 } 43 #endif 44 MD5_Final(md, &c); 45 OPENSSL_cleanse(&c, sizeof(c)); /* security consideration */ 46 return md; 47 } 48