1/* 2 * digestCommon.h - openssl-style digest ops that can be redirected to CommonDigest.h 3 */ 4 5/* 6 * Currently, SHA2 functions are not implemented by OpenSSL, even though they are 7 * present in the header <openssl/fips_sha.h>. 8 * 9 * <rdar://problem/4753005> SHA2 functions are declared, but not implemented 10 * 11 * For now we'll have to redirect openssl SHA2 calls manually just to get this 12 * program to build and run correctly. (We could just disable all of the SHA2 13 * code but we still get a benefit from compiling openssl-style code). 14 */ 15#define OPENSSL_SHA2_IMPLEMENTED 0 16 17#include "digestCommonExtern.h" 18 19#ifdef COMMON_DIGEST_FOR_OPENSSL 20 21/* redirecting to CommonDigest */ 22 23#define doMD2 md2cc 24#define doMD4 md4cc 25#define doMD5 md5cc 26#define doSHA1 sha1cc 27#define doSHA224 sha224cc 28#define doSHA256 sha256cc 29#define doSHA384 sha384cc 30#define doSHA512 sha512cc 31 32#else /* !COMMON_DIGEST_FOR_OPENSSL */ 33 34/* openssl */ 35 36#define doMD2 md2os 37#define doMD4 md4os 38#define doMD5 md5os 39#define doSHA1 sha1os 40#define doSHA224 sha224os 41#define doSHA256 sha256os 42#define doSHA384 sha384os 43#define doSHA512 sha512os 44 45#if !OPENSSL_SHA2_IMPLEMENTED 46 47/* Hack: redirect SHA2 calls after all */ 48 49#include <CommonCrypto/CommonDigest.h> 50 51#define SHA256_CTX CC_SHA256_CTX 52#define SHA224_Init(c) CC_SHA224_Init(c) 53#define SHA224_Update(c,d,l) CC_SHA224_Update(c,d,l) 54#define SHA224_Final(m, c) CC_SHA224_Final(m,c) 55 56#define SHA256_Init(c) CC_SHA256_Init(c) 57#define SHA256_Update(c,d,l) CC_SHA256_Update(c,d,l) 58#define SHA256_Final(m, c) CC_SHA256_Final(m,c) 59 60#define SHA512_CTX CC_SHA512_CTX 61#define SHA384_Init(c) CC_SHA384_Init(c) 62#define SHA384_Update(c,d,l) CC_SHA384_Update(c,d,l) 63#define SHA384_Final(m, c) CC_SHA384_Final(m,c) 64 65#define SHA512_Init(c) CC_SHA512_Init(c) 66#define SHA512_Update(c,d,l) CC_SHA512_Update(c,d,l) 67#define SHA512_Final(m, c) CC_SHA512_Final(m,c) 68 69#endif /* OPENSSL_SHA2_IMPLEMENTED */ 70 71 72#endif /* COMMON_DIGEST_FOR_OPENSSL */ 73 74/* all functions return nonzero on error */ 75 76int doMD2(const void *p, unsigned long len, unsigned char *md) 77{ 78 /* OPenSSL MD2 is not orthogonal: the pointer is a const unsigned char * */ 79 MD2_CTX ctx; 80 const unsigned char *cp = (const unsigned char *)p; 81 82 if(!MD2_Init(&ctx)) { 83 return -1; 84 } 85 if(!MD2_Update(&ctx, cp, len)) { 86 return -1; 87 } 88 if(!MD2_Final(md, &ctx)) { 89 return -1; 90 } 91 return 0; 92} 93 94int doMD4(const void *p, unsigned long len, unsigned char *md) 95{ 96 MD4_CTX ctx; 97 if(!MD4_Init(&ctx)) { 98 return -1; 99 } 100 if(!MD4_Update(&ctx, p, len)) { 101 return -1; 102 } 103 if(!MD4_Final(md, &ctx)) { 104 return -1; 105 } 106 return 0; 107} 108 109int doMD5(const void *p, unsigned long len, unsigned char *md) 110{ 111 MD5_CTX ctx; 112 if(!MD5_Init(&ctx)) { 113 return -1; 114 } 115 if(!MD5_Update(&ctx, p, len)) { 116 return -1; 117 } 118 if(!MD5_Final(md, &ctx)) { 119 return -1; 120 } 121 return 0; 122} 123 124int doSHA1(const void *p, unsigned long len, unsigned char *md) 125{ 126 SHA_CTX ctx; 127 if(!SHA1_Init(&ctx)) { 128 return -1; 129 } 130 if(!SHA1_Update(&ctx, p, len)) { 131 return -1; 132 } 133 if(!SHA1_Final(md, &ctx)) { 134 return -1; 135 } 136 return 0; 137} 138 139int doSHA224(const void *p, unsigned long len, unsigned char *md) 140{ 141 SHA256_CTX ctx; 142 if(!SHA224_Init(&ctx)) { 143 return -1; 144 } 145 if(!SHA224_Update(&ctx, p, len)) { 146 return -1; 147 } 148 if(!SHA224_Final(md, &ctx)) { 149 return -1; 150 } 151 return 0; 152} 153 154int doSHA256(const void *p, unsigned long len, unsigned char *md) 155{ 156 SHA256_CTX ctx; 157 if(!SHA256_Init(&ctx)) { 158 return -1; 159 } 160 if(!SHA256_Update(&ctx, p, len)) { 161 return -1; 162 } 163 if(!SHA256_Final(md, &ctx)) { 164 return -1; 165 } 166 return 0; 167} 168 169int doSHA384(const void *p, unsigned long len, unsigned char *md) 170{ 171 SHA512_CTX ctx; 172 if(!SHA384_Init(&ctx)) { 173 return -1; 174 } 175 if(!SHA384_Update(&ctx, p, len)) { 176 return -1; 177 } 178 if(!SHA384_Final(md, &ctx)) { 179 return -1; 180 } 181 return 0; 182} 183 184int doSHA512(const void *p, unsigned long len, unsigned char *md) 185{ 186 SHA512_CTX ctx; 187 if(!SHA512_Init(&ctx)) { 188 return -1; 189 } 190 if(!SHA512_Update(&ctx, p, len)) { 191 return -1; 192 } 193 if(!SHA512_Final(md, &ctx)) { 194 return -1; 195 } 196 return 0; 197} 198