xref: /openbsd-src/usr.bin/ssh/digest.h (revision 52769410c46259475daf7cd61701023ce6a02bab)
1*52769410Sdjm /* $OpenBSD: digest.h,v 1.8 2017/05/08 22:57:38 djm Exp $ */
28df5df93Sdjm /*
38df5df93Sdjm  * Copyright (c) 2013 Damien Miller <djm@mindrot.org>
48df5df93Sdjm  *
58df5df93Sdjm  * Permission to use, copy, modify, and distribute this software for any
68df5df93Sdjm  * purpose with or without fee is hereby granted, provided that the above
78df5df93Sdjm  * copyright notice and this permission notice appear in all copies.
88df5df93Sdjm  *
98df5df93Sdjm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108df5df93Sdjm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118df5df93Sdjm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128df5df93Sdjm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138df5df93Sdjm  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148df5df93Sdjm  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158df5df93Sdjm  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168df5df93Sdjm  */
178df5df93Sdjm 
188df5df93Sdjm #ifndef _DIGEST_H
198df5df93Sdjm #define _DIGEST_H
208df5df93Sdjm 
218df5df93Sdjm /* Maximum digest output length */
228df5df93Sdjm #define SSH_DIGEST_MAX_LENGTH	64
238df5df93Sdjm 
248df5df93Sdjm /* Digest algorithms */
258df5df93Sdjm #define SSH_DIGEST_MD5		0
26*52769410Sdjm #define SSH_DIGEST_SHA1		1
27*52769410Sdjm #define SSH_DIGEST_SHA256	2
28*52769410Sdjm #define SSH_DIGEST_SHA384	3
29*52769410Sdjm #define SSH_DIGEST_SHA512	4
30*52769410Sdjm #define SSH_DIGEST_MAX		5
318df5df93Sdjm 
3297a43512Sdjm struct sshbuf;
33f7baae32Smarkus struct ssh_digest_ctx;
34f7baae32Smarkus 
353dbedef4Sdjm /* Looks up a digest algorithm by name */
363dbedef4Sdjm int ssh_digest_alg_by_name(const char *name);
373dbedef4Sdjm 
383dbedef4Sdjm /* Returns the algorithm name for a digest identifier */
393dbedef4Sdjm const char *ssh_digest_alg_name(int alg);
403dbedef4Sdjm 
418df5df93Sdjm /* Returns the algorithm's digest length in bytes or 0 for invalid algorithm */
428df5df93Sdjm size_t ssh_digest_bytes(int alg);
438df5df93Sdjm 
44f7baae32Smarkus /* Returns the block size of the digest, e.g. for implementing HMAC */
45f7baae32Smarkus size_t ssh_digest_blocksize(struct ssh_digest_ctx *ctx);
46f7baae32Smarkus 
47f7baae32Smarkus /* Copies internal state of digest of 'from' to 'to' */
48f7baae32Smarkus int ssh_digest_copy_state(struct ssh_digest_ctx *from,
49f7baae32Smarkus     struct ssh_digest_ctx *to);
50f7baae32Smarkus 
518df5df93Sdjm /* One-shot API */
528df5df93Sdjm int ssh_digest_memory(int alg, const void *m, size_t mlen,
538df5df93Sdjm     u_char *d, size_t dlen)
5437ec574aSdjm 	__attribute__((__bounded__(__buffer__, 2, 3)))
5537ec574aSdjm 	__attribute__((__bounded__(__buffer__, 4, 5)));
56ea2d8289Sdjm int ssh_digest_buffer(int alg, const struct sshbuf *b, u_char *d, size_t dlen)
5737ec574aSdjm 	__attribute__((__bounded__(__buffer__, 3, 4)));
588df5df93Sdjm 
598df5df93Sdjm /* Update API */
608df5df93Sdjm struct ssh_digest_ctx *ssh_digest_start(int alg);
618df5df93Sdjm int ssh_digest_update(struct ssh_digest_ctx *ctx, const void *m, size_t mlen)
6237ec574aSdjm 	__attribute__((__bounded__(__buffer__, 2, 3)));
63ea2d8289Sdjm int ssh_digest_update_buffer(struct ssh_digest_ctx *ctx,
64ea2d8289Sdjm     const struct sshbuf *b);
658df5df93Sdjm int ssh_digest_final(struct ssh_digest_ctx *ctx, u_char *d, size_t dlen)
6637ec574aSdjm 	__attribute__((__bounded__(__buffer__, 2, 3)));
678df5df93Sdjm void ssh_digest_free(struct ssh_digest_ctx *ctx);
688df5df93Sdjm 
698df5df93Sdjm #endif /* _DIGEST_H */
708df5df93Sdjm 
71