Revision: 857 http://trac.macosforge.org/projects/darwinbuild/changeset/857 Author: wsiegrist@apple.com Date: 2010-08-06 11:33:20 -0700 (Fri, 06 Aug 2010) Log Message: ----------- Replace OpenSSL with CommonCrypto in darwinup Modified Paths: -------------- branches/PR-8279204/darwinup/DB.cpp branches/PR-8279204/darwinup/Digest.cpp branches/PR-8279204/darwinup/Digest.h Modified: branches/PR-8279204/darwinup/DB.cpp =================================================================== --- branches/PR-8279204/darwinup/DB.cpp 2010-08-06 16:48:24 UTC (rev 856) +++ branches/PR-8279204/darwinup/DB.cpp 2010-08-06 18:33:20 UTC (rev 857) @@ -155,11 +155,11 @@ uint64_t size; memcpy(&size, &data[this->file_offset(6)], sizeof(uint64_t)); - Digest* digest = NULL; + SHA1Digest* digest = NULL; uint8_t* dp; memcpy(&dp, &data[this->file_offset(7)], sizeof(uint8_t*)); if (dp) { - digest = new Digest(); + digest = new SHA1Digest(); digest->m_size = 20; // size of SHA1 hash memcpy(digest->m_data, dp, 20); } Modified: branches/PR-8279204/darwinup/Digest.cpp =================================================================== --- branches/PR-8279204/darwinup/Digest.cpp 2010-08-06 16:48:24 UTC (rev 856) +++ branches/PR-8279204/darwinup/Digest.cpp 2010-08-06 18:33:20 UTC (rev 857) @@ -49,50 +49,6 @@ #include "redo_prebinding.h" } -Digest::Digest() { - memset(m_data, 0, sizeof(m_data)); - m_size = 0; -} - -Digest::Digest(const EVP_MD* md, int fd) { - digest(md, fd); -} - -void Digest::digest(const EVP_MD* md, int fd) { - EVP_MD_CTX ctx; - EVP_MD_CTX_init(&ctx); - EVP_DigestInit(&ctx, md); - - int len; - const unsigned int blocklen = 8192; - static uint8_t* block = NULL; - if (block == NULL) { - block = (uint8_t*)malloc(blocklen); - } - while(1) { - len = read(fd, block, blocklen); - if (len == 0) { close(fd); break; } - if ((len < 0) && (errno == EINTR)) continue; - if (len < 0) { close(fd); return; } - EVP_DigestUpdate(&ctx, block, len); - } - if (len >= 0) { - EVP_DigestFinal(&ctx, m_data, &m_size); - } -} - -Digest::Digest(const EVP_MD* md, uint8_t* data, uint32_t size) { - digest(md, data, size); -} - -void Digest::digest(const EVP_MD* md, uint8_t* data, uint32_t size) { - EVP_MD_CTX ctx; - EVP_MD_CTX_init(&ctx); - EVP_DigestInit(&ctx, md); - EVP_DigestUpdate(&ctx, data, size); - EVP_DigestFinal(&ctx, m_data, &m_size); -} - uint8_t* Digest::data() { return m_data; } uint32_t Digest::size() { return m_size; } @@ -121,45 +77,51 @@ return (memcmp(a->data(), b->data(), a_size) == 0); } - -const EVP_MD* SHA1Digest::m_md; - SHA1Digest::SHA1Digest() { - if (m_md == NULL) { - OpenSSL_add_all_digests(); - m_md = EVP_get_digestbyname("sha1"); - assert(m_md != NULL); - } + m_size = CC_SHA1_DIGEST_LENGTH; } SHA1Digest::SHA1Digest(int fd) { - if (m_md == NULL) { - OpenSSL_add_all_digests(); - m_md = EVP_get_digestbyname("sha1"); - assert(m_md != NULL); - } - digest(m_md, fd); + m_size = CC_SHA1_DIGEST_LENGTH; + digest(m_data, fd); } SHA1Digest::SHA1Digest(const char* filename) { + m_size = CC_SHA1_DIGEST_LENGTH; int fd = open(filename, O_RDONLY); - if (m_md == NULL) { - OpenSSL_add_all_digests(); - m_md = EVP_get_digestbyname("sha1"); - assert(m_md != NULL); - } - digest(m_md, fd); + digest(m_data, fd); } SHA1Digest::SHA1Digest(uint8_t* data, uint32_t size) { - if (m_md == NULL) { - OpenSSL_add_all_digests(); - m_md = EVP_get_digestbyname("sha1"); - assert(m_md != NULL); + m_size = CC_SHA1_DIGEST_LENGTH; + digest(m_data, data, size); +} + +void SHA1Digest::digest(unsigned char* md, int fd) { + CC_SHA1_CTX c; + CC_SHA1_Init(&c); + + int len; + const unsigned int blocklen = 8192; + static uint8_t* block = NULL; + if (block == NULL) { + block = (uint8_t*)malloc(blocklen); } - digest(m_md, data, size); + while(1) { + len = read(fd, block, blocklen); + if (len == 0) { close(fd); break; } + if ((len < 0) && (errno == EINTR)) continue; + if (len < 0) { close(fd); return; } + CC_SHA1_Update(&c, block, (size_t)len); + } + if (len >= 0) { + CC_SHA1_Final(md, &c); + } } +void SHA1Digest::digest(unsigned char* md, uint8_t* data, uint32_t size) { + CC_SHA1((const void*)data, (CC_LONG)size, md); +} SHA1DigestMachO::SHA1DigestMachO(const char* filename) { char* error = NULL; @@ -182,11 +144,11 @@ &block, &blocklen); if (ret == REDO_PREBINDING_SUCCESS && block != NULL) { - digest(SHA1Digest::m_md, (uint8_t*)block, blocklen); + digest(m_data, (uint8_t*)block, blocklen); } else { //fprintf(stderr, "%s:%d: unexpected unprebind result: %s: %s (%d)\n", __FILE__, __LINE__, filename, error, ret); int fd = open(filename, O_RDONLY); - digest(SHA1Digest::m_md, fd); + digest(m_data, fd); close(fd); } if (block != NULL) { @@ -195,7 +157,7 @@ } } else { int fd = open(filename, O_RDONLY); - digest(SHA1Digest::m_md, fd); + digest(m_data, fd); close(fd); } } @@ -206,6 +168,6 @@ if (res == -1) { fprintf(stderr, "%s:%d: readlink: %s: %s (%d)\n", __FILE__, __LINE__, filename, strerror(errno), errno); } else { - digest(SHA1Digest::m_md, (uint8_t*)link, res); + digest(m_data, (uint8_t*)link, res); } } Modified: branches/PR-8279204/darwinup/Digest.h =================================================================== --- branches/PR-8279204/darwinup/Digest.h 2010-08-06 16:48:24 UTC (rev 856) +++ branches/PR-8279204/darwinup/Digest.h 2010-08-06 18:33:20 UTC (rev 857) @@ -35,34 +35,25 @@ #include <sys/types.h> #include <stdint.h> -#include <openssl/evp.h> +#include <CommonCrypto/CommonDigest.h> #include "Utils.h" //// // Digest // -// Digest is the root class for all message digest algorithms -// supported by darwinup. +// Digest is the abstract root class for all message digest algorithms +// supported by darwinup. Subclasses must implement the constructors +// and digest() APIs. // -// Conceptually it's an abstract class, although that -// hasn't been formalized. -// // SHA1Digest is the only concrete subclass. There are two // subclasses of SHA1Digest which add convenience functions // for digesting a canonicalized Mach-O binary, and the // target of a symlink obtained by readlink(2). // -// NOTE: It might be more appropriate to use the CommonCrypto -// implementation of these algorithms rather than the OpenSSL -// implementation. However, CommonCrypto is only available on -// Tiger. //// struct Digest { - Digest(); - Digest(const EVP_MD* md, int fd); - Digest(const EVP_MD* md, uint8_t* data, uint32_t size); //// // Accessor functions @@ -74,7 +65,7 @@ // Returns the size of the raw digest. virtual uint32_t size(); - // Returns the digest as an ASCIZ string, represented in hexidecimal. + // Returns the digest as an ASCII string, represented in hexidecimal. virtual char* string(); //// @@ -88,11 +79,11 @@ protected: - virtual void digest(const EVP_MD* md, int fd); - virtual void digest(const EVP_MD* md, uint8_t* data, uint32_t size); + virtual void digest(unsigned char* md, int fd) = 0; + virtual void digest(unsigned char* md, uint8_t* data, uint32_t size) = 0; - uint8_t m_data[EVP_MAX_MD_SIZE]; - uint32_t m_size; + unsigned char m_data[CC_SHA512_DIGEST_LENGTH]; // support up to 64 bytes + uint32_t m_size; friend struct Depot; friend struct DarwinupDatabase; @@ -102,8 +93,6 @@ // SHA1Digest //// struct SHA1Digest : Digest { - static const EVP_MD* m_md; - // Creates an empty digest. SHA1Digest(); @@ -115,6 +104,10 @@ // Computes the SHA-1 digest of the block of memory. SHA1Digest(uint8_t* data, uint32_t size); + + void digest(unsigned char* md, int fd); + void digest(unsigned char* md, uint8_t* data, uint32_t size); + }; ////
participants (1)
-
source_changes@macosforge.org