1162852Sdes/* $OpenBSD: md-sha256.c,v 1.5 2006/08/03 03:34:42 deraadt Exp $ */ 2162852Sdes/* 3162852Sdes * Copyright (c) 2005 Damien Miller <djm@openbsd.org> 4162852Sdes * 5162852Sdes * Permission to use, copy, modify, and distribute this software for any 6162852Sdes * purpose with or without fee is hereby granted, provided that the above 7162852Sdes * copyright notice and this permission notice appear in all copies. 8162852Sdes * 9162852Sdes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10162852Sdes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11162852Sdes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12162852Sdes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13162852Sdes * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14162852Sdes * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15162852Sdes * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16162852Sdes */ 17162852Sdes 18162852Sdes/* EVP wrapper for SHA256 */ 19162852Sdes 20162852Sdes#include "includes.h" 21162852Sdes 22162852Sdes#include <sys/types.h> 23162852Sdes#include <openssl/opensslv.h> 24162852Sdes 25162852Sdes#if !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) 26162852Sdes 27162852Sdes#include <string.h> 28162852Sdes#include <openssl/evp.h> 29162852Sdes#ifdef HAVE_SHA256_UPDATE 30162852Sdes# ifdef HAVE_SHA2_H 31162852Sdes# include <sha2.h> 32162852Sdes# elif defined(HAVE_CRYPTO_SHA2_H) 33162852Sdes# include <crypto/sha2.h> 34162852Sdes# endif 35162852Sdes#endif 36162852Sdes 37162852Sdesconst EVP_MD *evp_ssh_sha256(void); 38162852Sdes 39162852Sdesstatic int 40162852Sdesssh_sha256_init(EVP_MD_CTX *ctxt) 41162852Sdes{ 42162852Sdes SHA256_Init(ctxt->md_data); 43162852Sdes return (1); 44162852Sdes} 45162852Sdes 46162852Sdesstatic int 47162852Sdesssh_sha256_update(EVP_MD_CTX *ctxt, const void *data, unsigned long len) 48162852Sdes{ 49162852Sdes SHA256_Update(ctxt->md_data, data, len); 50162852Sdes return (1); 51162852Sdes} 52162852Sdes 53162852Sdesstatic int 54162852Sdesssh_sha256_final(EVP_MD_CTX *ctxt, unsigned char *digest) 55162852Sdes{ 56162852Sdes SHA256_Final(digest, ctxt->md_data); 57162852Sdes return (1); 58162852Sdes} 59162852Sdes 60162852Sdesstatic int 61162852Sdesssh_sha256_cleanup(EVP_MD_CTX *ctxt) 62162852Sdes{ 63162852Sdes memset(ctxt->md_data, 0, sizeof(SHA256_CTX)); 64162852Sdes return (1); 65162852Sdes} 66162852Sdes 67162852Sdesconst EVP_MD * 68162852Sdesevp_ssh_sha256(void) 69162852Sdes{ 70162852Sdes static EVP_MD ssh_sha256; 71162852Sdes 72162852Sdes memset(&ssh_sha256, 0, sizeof(ssh_sha256)); 73162852Sdes ssh_sha256.type = NID_undef; 74162852Sdes ssh_sha256.md_size = SHA256_DIGEST_LENGTH; 75162852Sdes ssh_sha256.init = ssh_sha256_init; 76162852Sdes ssh_sha256.update = ssh_sha256_update; 77162852Sdes ssh_sha256.final = ssh_sha256_final; 78162852Sdes ssh_sha256.cleanup = ssh_sha256_cleanup; 79162852Sdes ssh_sha256.block_size = SHA256_BLOCK_LENGTH; 80162852Sdes ssh_sha256.ctx_size = sizeof(SHA256_CTX); 81162852Sdes 82162852Sdes return (&ssh_sha256); 83162852Sdes} 84162852Sdes 85162852Sdes#endif /* !defined(HAVE_EVP_SHA256) && (OPENSSL_VERSION_NUMBER >= 0x00907000L) */ 86162852Sdes 87