1/* $OpenBSD: md-sha256.c,v 1.5 2006/08/03 03:34:42 deraadt Exp $ */ 2/* 3 * Copyright (c) 2005 Damien Miller <djm@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* EVP wrapper for SHA256 */ 19 20#include "includes.h" 21 22#include <sys/types.h> 23#ifdef __APPLE_CRYPTO__ 24#include "ossl-crypto.h" 25#else 26#include <openssl/opensslv.h> 27#endif 28 29#if !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) 30 31#include <string.h> 32#ifdef __APPLE_CRYPTO__ 33#error "HAVE_EVP_SHA256 should be defined" 34#else 35#include <openssl/evp.h> 36#ifdef HAVE_SHA256_UPDATE 37# ifdef HAVE_SHA2_H 38# include <sha2.h> 39# elif defined(HAVE_CRYPTO_SHA2_H) 40# include <crypto/sha2.h> 41# endif 42#endif /* HAVE_SHA256_UPDATE */ 43#endif /* __APPLE_CRYPTO__ */ 44 45const EVP_MD *evp_ssh_sha256(void); 46 47static int 48ssh_sha256_init(EVP_MD_CTX *ctxt) 49{ 50 SHA256_Init(ctxt->md_data); 51 return (1); 52} 53 54static int 55ssh_sha256_update(EVP_MD_CTX *ctxt, const void *data, unsigned long len) 56{ 57 SHA256_Update(ctxt->md_data, data, len); 58 return (1); 59} 60 61static int 62ssh_sha256_final(EVP_MD_CTX *ctxt, unsigned char *digest) 63{ 64 SHA256_Final(digest, ctxt->md_data); 65 return (1); 66} 67 68static int 69ssh_sha256_cleanup(EVP_MD_CTX *ctxt) 70{ 71 memset(ctxt->md_data, 0, sizeof(SHA256_CTX)); 72 return (1); 73} 74 75const EVP_MD * 76evp_ssh_sha256(void) 77{ 78 static EVP_MD ssh_sha256; 79 80 memset(&ssh_sha256, 0, sizeof(ssh_sha256)); 81 ssh_sha256.type = NID_undef; 82 ssh_sha256.md_size = SHA256_DIGEST_LENGTH; 83 ssh_sha256.init = ssh_sha256_init; 84 ssh_sha256.update = ssh_sha256_update; 85 ssh_sha256.final = ssh_sha256_final; 86 ssh_sha256.cleanup = ssh_sha256_cleanup; 87 ssh_sha256.block_size = SHA256_BLOCK_LENGTH; 88 ssh_sha256.ctx_size = sizeof(SHA256_CTX); 89 90 return (&ssh_sha256); 91} 92 93#endif /* !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) */ 94 95