void crypto_md5_final(CRYPTO_MD5 * md5, uint8 * out_data) { #ifdef CRYPTO_OPENSSL MD5_Final(out_data, md5); #else /* built-in crypto */ ssl_md5_final(md5, out_data); #endif }
/* Generate a 32-byte random for the secure transport code. */ void generate_random(uint8 * random) { struct stat st; struct tms tmsbuf; SSL_MD5 md5; uint32 *r; int fd, n; /* If we have a kernel random device, try that first */ if (((fd = open("/dev/urandom", O_RDONLY)) != -1) || ((fd = open("/dev/random", O_RDONLY)) != -1)) { n = read(fd, random, 32); close(fd); if (n == 32) return; } #ifdef EGD_SOCKET /* As a second preference use an EGD */ if (generate_random_egd(random)) return; #endif /* Otherwise use whatever entropy we can gather - ideas welcome. */ r = (uint32 *) random; r[0] = (getpid()) | (getppid() << 16); r[1] = (getuid()) | (getgid() << 16); r[2] = times(&tmsbuf); /* system uptime (clocks) */ gettimeofday((struct timeval *) &r[3], NULL); /* sec and usec */ stat("/tmp", &st); r[5] = st.st_atime; r[6] = st.st_mtime; r[7] = st.st_ctime; /* Hash both halves with MD5 to obscure possible patterns */ ssl_md5_init(&md5); ssl_md5_update(&md5, random, 16); ssl_md5_final(&md5, random); ssl_md5_update(&md5, random + 16, 16); ssl_md5_final(&md5, random + 16); }
void crypto_md5_final(CryptoMd5 md5, uint8 * out_data) { ssl_md5_final(&md5->data, out_data); xfree(md5); }