1*25749746SEd Maste /* $OpenBSD: sha2.h,v 1.10 2016/09/03 17:00:29 tedu Exp $ */ 2*25749746SEd Maste 3*25749746SEd Maste /* 4*25749746SEd Maste * FILE: sha2.h 5*25749746SEd Maste * AUTHOR: Aaron D. Gifford <me@aarongifford.com> 6*25749746SEd Maste * 7*25749746SEd Maste * Copyright (c) 2000-2001, Aaron D. Gifford 8*25749746SEd Maste * All rights reserved. 9*25749746SEd Maste * 10*25749746SEd Maste * Redistribution and use in source and binary forms, with or without 11*25749746SEd Maste * modification, are permitted provided that the following conditions 12*25749746SEd Maste * are met: 13*25749746SEd Maste * 1. Redistributions of source code must retain the above copyright 14*25749746SEd Maste * notice, this list of conditions and the following disclaimer. 15*25749746SEd Maste * 2. Redistributions in binary form must reproduce the above copyright 16*25749746SEd Maste * notice, this list of conditions and the following disclaimer in the 17*25749746SEd Maste * documentation and/or other materials provided with the distribution. 18*25749746SEd Maste * 3. Neither the name of the copyright holder nor the names of contributors 19*25749746SEd Maste * may be used to endorse or promote products derived from this software 20*25749746SEd Maste * without specific prior written permission. 21*25749746SEd Maste * 22*25749746SEd Maste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND 23*25749746SEd Maste * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*25749746SEd Maste * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*25749746SEd Maste * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE 26*25749746SEd Maste * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*25749746SEd Maste * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*25749746SEd Maste * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*25749746SEd Maste * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*25749746SEd Maste * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*25749746SEd Maste * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*25749746SEd Maste * SUCH DAMAGE. 33*25749746SEd Maste * 34*25749746SEd Maste * $From: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ 35*25749746SEd Maste */ 36*25749746SEd Maste 37*25749746SEd Maste /* OPENBSD ORIGINAL: include/sha2.h */ 38*25749746SEd Maste 39*25749746SEd Maste #ifndef _SSHSHA2_H 40*25749746SEd Maste #define _SSHSHA2_H 41*25749746SEd Maste 42*25749746SEd Maste #include "includes.h" 43*25749746SEd Maste 44*25749746SEd Maste #if !defined(HAVE_SHA256UPDATE) || !defined(HAVE_SHA384UPDATE) || \ 45*25749746SEd Maste !defined(HAVE_SHA512UPDATE) 46*25749746SEd Maste 47*25749746SEd Maste /*** SHA-256/384/512 Various Length Definitions ***********************/ 48*25749746SEd Maste #define SHA224_BLOCK_LENGTH 64 49*25749746SEd Maste #define SHA224_DIGEST_LENGTH 28 50*25749746SEd Maste #define SHA224_DIGEST_STRING_LENGTH (SHA224_DIGEST_LENGTH * 2 + 1) 51*25749746SEd Maste #define SHA256_BLOCK_LENGTH 64 52*25749746SEd Maste #define SHA256_DIGEST_LENGTH 32 53*25749746SEd Maste #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) 54*25749746SEd Maste #define SHA384_BLOCK_LENGTH 128 55*25749746SEd Maste #define SHA384_DIGEST_LENGTH 48 56*25749746SEd Maste #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1) 57*25749746SEd Maste #define SHA512_BLOCK_LENGTH 128 58*25749746SEd Maste #define SHA512_DIGEST_LENGTH 64 59*25749746SEd Maste #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1) 60*25749746SEd Maste #define SHA512_256_BLOCK_LENGTH 128 61*25749746SEd Maste #define SHA512_256_DIGEST_LENGTH 32 62*25749746SEd Maste #define SHA512_256_DIGEST_STRING_LENGTH (SHA512_256_DIGEST_LENGTH * 2 + 1) 63*25749746SEd Maste 64*25749746SEd Maste 65*25749746SEd Maste /*** SHA-224/256/384/512 Context Structure *******************************/ 66*25749746SEd Maste typedef struct _SHA2_CTX { 67*25749746SEd Maste union { 68*25749746SEd Maste u_int32_t st32[8]; 69*25749746SEd Maste u_int64_t st64[8]; 70*25749746SEd Maste } state; 71*25749746SEd Maste u_int64_t bitcount[2]; 72*25749746SEd Maste u_int8_t buffer[SHA512_BLOCK_LENGTH]; 73*25749746SEd Maste } SHA2_CTX; 74*25749746SEd Maste 75*25749746SEd Maste #if 0 76*25749746SEd Maste __BEGIN_DECLS 77*25749746SEd Maste void SHA224Init(SHA2_CTX *); 78*25749746SEd Maste void SHA224Transform(u_int32_t state[8], const u_int8_t [SHA224_BLOCK_LENGTH]); 79*25749746SEd Maste void SHA224Update(SHA2_CTX *, const u_int8_t *, size_t) 80*25749746SEd Maste __attribute__((__bounded__(__string__,2,3))); 81*25749746SEd Maste void SHA224Pad(SHA2_CTX *); 82*25749746SEd Maste void SHA224Final(u_int8_t [SHA224_DIGEST_LENGTH], SHA2_CTX *) 83*25749746SEd Maste __attribute__((__bounded__(__minbytes__,1,SHA224_DIGEST_LENGTH))); 84*25749746SEd Maste char *SHA224End(SHA2_CTX *, char *) 85*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH))); 86*25749746SEd Maste char *SHA224File(const char *, char *) 87*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH))); 88*25749746SEd Maste char *SHA224FileChunk(const char *, char *, off_t, off_t) 89*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA224_DIGEST_STRING_LENGTH))); 90*25749746SEd Maste char *SHA224Data(const u_int8_t *, size_t, char *) 91*25749746SEd Maste __attribute__((__bounded__(__string__,1,2))) 92*25749746SEd Maste __attribute__((__bounded__(__minbytes__,3,SHA224_DIGEST_STRING_LENGTH))); 93*25749746SEd Maste #endif /* 0 */ 94*25749746SEd Maste 95*25749746SEd Maste #ifndef HAVE_SHA256UPDATE 96*25749746SEd Maste void SHA256Init(SHA2_CTX *); 97*25749746SEd Maste void SHA256Transform(u_int32_t state[8], const u_int8_t [SHA256_BLOCK_LENGTH]); 98*25749746SEd Maste void SHA256Update(SHA2_CTX *, const u_int8_t *, size_t) 99*25749746SEd Maste __attribute__((__bounded__(__string__,2,3))); 100*25749746SEd Maste void SHA256Pad(SHA2_CTX *); 101*25749746SEd Maste void SHA256Final(u_int8_t [SHA256_DIGEST_LENGTH], SHA2_CTX *) 102*25749746SEd Maste __attribute__((__bounded__(__minbytes__,1,SHA256_DIGEST_LENGTH))); 103*25749746SEd Maste char *SHA256End(SHA2_CTX *, char *) 104*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH))); 105*25749746SEd Maste char *SHA256File(const char *, char *) 106*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH))); 107*25749746SEd Maste char *SHA256FileChunk(const char *, char *, off_t, off_t) 108*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA256_DIGEST_STRING_LENGTH))); 109*25749746SEd Maste char *SHA256Data(const u_int8_t *, size_t, char *) 110*25749746SEd Maste __attribute__((__bounded__(__string__,1,2))) 111*25749746SEd Maste __attribute__((__bounded__(__minbytes__,3,SHA256_DIGEST_STRING_LENGTH))); 112*25749746SEd Maste #endif /* HAVE_SHA256UPDATE */ 113*25749746SEd Maste 114*25749746SEd Maste #ifndef HAVE_SHA384UPDATE 115*25749746SEd Maste void SHA384Init(SHA2_CTX *); 116*25749746SEd Maste void SHA384Transform(u_int64_t state[8], const u_int8_t [SHA384_BLOCK_LENGTH]); 117*25749746SEd Maste void SHA384Update(SHA2_CTX *, const u_int8_t *, size_t) 118*25749746SEd Maste __attribute__((__bounded__(__string__,2,3))); 119*25749746SEd Maste void SHA384Pad(SHA2_CTX *); 120*25749746SEd Maste void SHA384Final(u_int8_t [SHA384_DIGEST_LENGTH], SHA2_CTX *) 121*25749746SEd Maste __attribute__((__bounded__(__minbytes__,1,SHA384_DIGEST_LENGTH))); 122*25749746SEd Maste char *SHA384End(SHA2_CTX *, char *) 123*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH))); 124*25749746SEd Maste char *SHA384File(const char *, char *) 125*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH))); 126*25749746SEd Maste char *SHA384FileChunk(const char *, char *, off_t, off_t) 127*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA384_DIGEST_STRING_LENGTH))); 128*25749746SEd Maste char *SHA384Data(const u_int8_t *, size_t, char *) 129*25749746SEd Maste __attribute__((__bounded__(__string__,1,2))) 130*25749746SEd Maste __attribute__((__bounded__(__minbytes__,3,SHA384_DIGEST_STRING_LENGTH))); 131*25749746SEd Maste #endif /* HAVE_SHA384UPDATE */ 132*25749746SEd Maste 133*25749746SEd Maste #ifndef HAVE_SHA512UPDATE 134*25749746SEd Maste void SHA512Init(SHA2_CTX *); 135*25749746SEd Maste void SHA512Transform(u_int64_t state[8], const u_int8_t [SHA512_BLOCK_LENGTH]); 136*25749746SEd Maste void SHA512Update(SHA2_CTX *, const u_int8_t *, size_t) 137*25749746SEd Maste __attribute__((__bounded__(__string__,2,3))); 138*25749746SEd Maste void SHA512Pad(SHA2_CTX *); 139*25749746SEd Maste void SHA512Final(u_int8_t [SHA512_DIGEST_LENGTH], SHA2_CTX *) 140*25749746SEd Maste __attribute__((__bounded__(__minbytes__,1,SHA512_DIGEST_LENGTH))); 141*25749746SEd Maste char *SHA512End(SHA2_CTX *, char *) 142*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH))); 143*25749746SEd Maste char *SHA512File(const char *, char *) 144*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH))); 145*25749746SEd Maste char *SHA512FileChunk(const char *, char *, off_t, off_t) 146*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_DIGEST_STRING_LENGTH))); 147*25749746SEd Maste char *SHA512Data(const u_int8_t *, size_t, char *) 148*25749746SEd Maste __attribute__((__bounded__(__string__,1,2))) 149*25749746SEd Maste __attribute__((__bounded__(__minbytes__,3,SHA512_DIGEST_STRING_LENGTH))); 150*25749746SEd Maste #endif /* HAVE_SHA512UPDATE */ 151*25749746SEd Maste 152*25749746SEd Maste #if 0 153*25749746SEd Maste void SHA512_256Init(SHA2_CTX *); 154*25749746SEd Maste void SHA512_256Transform(u_int64_t state[8], const u_int8_t [SHA512_256_BLOCK_LENGTH]); 155*25749746SEd Maste void SHA512_256Update(SHA2_CTX *, const u_int8_t *, size_t) 156*25749746SEd Maste __attribute__((__bounded__(__string__,2,3))); 157*25749746SEd Maste void SHA512_256Pad(SHA2_CTX *); 158*25749746SEd Maste void SHA512_256Final(u_int8_t [SHA512_256_DIGEST_LENGTH], SHA2_CTX *) 159*25749746SEd Maste __attribute__((__bounded__(__minbytes__,1,SHA512_256_DIGEST_LENGTH))); 160*25749746SEd Maste char *SHA512_256End(SHA2_CTX *, char *) 161*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH))); 162*25749746SEd Maste char *SHA512_256File(const char *, char *) 163*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH))); 164*25749746SEd Maste char *SHA512_256FileChunk(const char *, char *, off_t, off_t) 165*25749746SEd Maste __attribute__((__bounded__(__minbytes__,2,SHA512_256_DIGEST_STRING_LENGTH))); 166*25749746SEd Maste char *SHA512_256Data(const u_int8_t *, size_t, char *) 167*25749746SEd Maste __attribute__((__bounded__(__string__,1,2))) 168*25749746SEd Maste __attribute__((__bounded__(__minbytes__,3,SHA512_256_DIGEST_STRING_LENGTH))); 169*25749746SEd Maste __END_DECLS 170*25749746SEd Maste #endif /* 0 */ 171*25749746SEd Maste 172*25749746SEd Maste #endif /* HAVE_SHA{256,384,512}UPDATE */ 173*25749746SEd Maste 174*25749746SEd Maste #endif /* _SSHSHA2_H */ 175