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