summaryrefslogtreecommitdiff
path: root/usual/crypto/digest.h
blob: ddf3d49f44ac6930fd8ac0e45947449efd4befdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * Common API for cryptographic digests.
 *
 * Copyright (c) 2012  Marko Kreen
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/**
 * @file
 *
 * Common API for cryptographic digests.
 */

#ifndef _USUAL_CRYPTO_DIGEST_H_
#define _USUAL_CRYPTO_DIGEST_H_

#include <usual/cxalloc.h>

typedef void (DigestInitFunc)(void *ctx);
typedef void (DigestUpdateFunc)(void *ctx, const void *, unsigned);
typedef void (DigestFinalFunc)(void *ctx, uint8_t *);

/**
 * Algoright info.
 */
struct DigestInfo {
	DigestInitFunc *init;
	DigestUpdateFunc *update;
	DigestFinalFunc *final;
	short state_len;
	short result_len;
	short block_len;
};

/**
 * Algoright instance.
 */
struct DigestContext;

/**
 * Allocate and initialize new algorithm instance.
 */
struct DigestContext *digest_new(const struct DigestInfo *impl, CxMem *cx);

/** Hash more data */
void digest_update(struct DigestContext *ctx, const void *data, size_t len);

/**
 * Get final result.
 *
 * To re-use same instance, digest_reset() must be called first.
 */
void digest_final(struct DigestContext *ctx, uint8_t *res);

/**
 * Prepares instance for new data.
 */
void digest_reset(struct DigestContext *ctx);

/**
 * Free instance.
 */
void digest_free(struct DigestContext *ctx);

/**
 * Hash function block length in bytes.
 */
unsigned digest_block_len(struct DigestContext *ctx);

/**
 * Hash function result length in bytes.
 */
unsigned digest_result_len(struct DigestContext *ctx);

/*
 * Declare algorithm info's here instead per-also headers
 * to avoid unnecessary dependencies.
 */

/** MD5 message digest */
const struct DigestInfo *digest_MD5(void);

/** SHA1 message digest */
const struct DigestInfo *digest_SHA1(void);

/** SHA224 message digest */
const struct DigestInfo *digest_SHA224(void);

/** SHA256 message digest */
const struct DigestInfo *digest_SHA256(void);

/** SHA384 message digest */
const struct DigestInfo *digest_SHA384(void);

/** SHA512 message digest */
const struct DigestInfo *digest_SHA512(void);

/** SHA3-224 message digest */
const struct DigestInfo *digest_SHA3_224(void);

/** SHA3-256 message digest */
const struct DigestInfo *digest_SHA3_256(void);

/** SHA3-384 message digest */
const struct DigestInfo *digest_SHA3_384(void);

/** SHA3-512 message digest */
const struct DigestInfo *digest_SHA3_512(void);

/** SHAKE128 in regular digest mode */
const struct DigestInfo *digest_SHAKE128(void);

/** SHAKE256 in regular digest mode */
const struct DigestInfo *digest_SHAKE256(void);

#endif