1 | /* |
2 | * libwebsockets - small server side websockets and web server implementation |
3 | * |
4 | * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | * of this software and associated documentation files (the "Software"), to |
8 | * deal in the Software without restriction, including without limitation the |
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
10 | * sell copies of the Software, and to permit persons to whom the Software is |
11 | * furnished to do so, subject to the following conditions: |
12 | * |
13 | * The above copyright notice and this permission notice shall be included in |
14 | * all copies or substantial portions of the Software. |
15 | * |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
22 | * IN THE SOFTWARE. |
23 | */ |
24 | |
25 | /*! \defgroup generichash Generic Hash |
26 | * ## Generic Hash related functions |
27 | * |
28 | * Lws provides generic hash / digest accessors that abstract the ones |
29 | * provided by whatever tls library you are linking against. |
30 | * |
31 | * It lets you use the same code if you build against mbedtls or OpenSSL |
32 | * for example. |
33 | */ |
34 | ///@{ |
35 | |
36 | enum lws_genhash_types { |
37 | LWS_GENHASH_TYPE_UNKNOWN, |
38 | LWS_GENHASH_TYPE_MD5, |
39 | LWS_GENHASH_TYPE_SHA1, |
40 | LWS_GENHASH_TYPE_SHA256, |
41 | LWS_GENHASH_TYPE_SHA384, |
42 | LWS_GENHASH_TYPE_SHA512, |
43 | }; |
44 | |
45 | enum lws_genhmac_types { |
46 | LWS_GENHMAC_TYPE_UNKNOWN, |
47 | LWS_GENHMAC_TYPE_SHA256, |
48 | LWS_GENHMAC_TYPE_SHA384, |
49 | LWS_GENHMAC_TYPE_SHA512, |
50 | }; |
51 | |
52 | #define LWS_GENHASH_LARGEST 64 |
53 | |
54 | struct lws_genhash_ctx { |
55 | uint8_t type; |
56 | #if defined(LWS_WITH_MBEDTLS) |
57 | union { |
58 | mbedtls_md5_context md5; |
59 | mbedtls_sha1_context sha1; |
60 | mbedtls_sha256_context sha256; |
61 | mbedtls_sha512_context sha512; /* 384 also uses this */ |
62 | const mbedtls_md_info_t *hmac; |
63 | } u; |
64 | #else |
65 | const EVP_MD *evp_type; |
66 | EVP_MD_CTX *mdctx; |
67 | #endif |
68 | }; |
69 | |
70 | struct lws_genhmac_ctx { |
71 | uint8_t type; |
72 | #if defined(LWS_WITH_MBEDTLS) |
73 | const mbedtls_md_info_t *hmac; |
74 | mbedtls_md_context_t ctx; |
75 | #else |
76 | const EVP_MD *evp_type; |
77 | |
78 | #if defined(LWS_HAVE_EVP_PKEY_new_raw_private_key) |
79 | EVP_MD_CTX *ctx; |
80 | EVP_PKEY *key; |
81 | #else |
82 | #if defined(LWS_HAVE_HMAC_CTX_new) |
83 | HMAC_CTX *ctx; |
84 | #else |
85 | HMAC_CTX ctx; |
86 | #endif |
87 | #endif |
88 | |
89 | #endif |
90 | }; |
91 | |
92 | /** lws_genhash_size() - get hash size in bytes |
93 | * |
94 | * \param type: one of LWS_GENHASH_TYPE_... |
95 | * |
96 | * Returns number of bytes in this type of hash, if the hash type is unknown, it |
97 | * will return 0. |
98 | */ |
99 | LWS_VISIBLE LWS_EXTERN size_t LWS_WARN_UNUSED_RESULT |
100 | lws_genhash_size(enum lws_genhash_types type); |
101 | |
102 | /** lws_genhmac_size() - get hash size in bytes |
103 | * |
104 | * \param type: one of LWS_GENHASH_TYPE_... |
105 | * |
106 | * Returns number of bytes in this type of hmac, if the hmac type is unknown, it |
107 | * will return 0. |
108 | */ |
109 | LWS_VISIBLE LWS_EXTERN size_t LWS_WARN_UNUSED_RESULT |
110 | lws_genhmac_size(enum lws_genhmac_types type); |
111 | |
112 | /** lws_genhash_init() - prepare your struct lws_genhash_ctx for use |
113 | * |
114 | * \param ctx: your struct lws_genhash_ctx |
115 | * \param type: one of LWS_GENHASH_TYPE_... |
116 | * |
117 | * Initializes the hash context for the type you requested |
118 | */ |
119 | LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT |
120 | lws_genhash_init(struct lws_genhash_ctx *ctx, enum lws_genhash_types type); |
121 | |
122 | /** lws_genhash_update() - digest len bytes of the buffer starting at in |
123 | * |
124 | * \param ctx: your struct lws_genhash_ctx |
125 | * \param in: start of the bytes to digest |
126 | * \param len: count of bytes to digest |
127 | * |
128 | * Updates the state of your hash context to reflect digesting len bytes from in |
129 | */ |
130 | LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT |
131 | lws_genhash_update(struct lws_genhash_ctx *ctx, const void *in, size_t len); |
132 | |
133 | /** lws_genhash_destroy() - copy out the result digest and destroy the ctx |
134 | * |
135 | * \param ctx: your struct lws_genhash_ctx |
136 | * \param result: NULL, or where to copy the result hash |
137 | * |
138 | * Finalizes the hash and copies out the digest. Destroys any allocations such |
139 | * that ctx can safely go out of scope after calling this. |
140 | * |
141 | * NULL result is supported so that you can destroy the ctx cleanly on error |
142 | * conditions, where there is no valid result. |
143 | */ |
144 | LWS_VISIBLE LWS_EXTERN int |
145 | lws_genhash_destroy(struct lws_genhash_ctx *ctx, void *result); |
146 | |
147 | /** lws_genhmac_init() - prepare your struct lws_genhmac_ctx for use |
148 | * |
149 | * \param ctx: your struct lws_genhmac_ctx |
150 | * \param type: one of LWS_GENHMAC_TYPE_... |
151 | * \param key: pointer to the start of the HMAC key |
152 | * \param key_len: length of the HMAC key |
153 | * |
154 | * Initializes the hash context for the type you requested |
155 | * |
156 | * If the return is nonzero, it failed and there is nothing needing to be |
157 | * destroyed. |
158 | */ |
159 | LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT |
160 | lws_genhmac_init(struct lws_genhmac_ctx *ctx, enum lws_genhmac_types type, |
161 | const uint8_t *key, size_t key_len); |
162 | |
163 | /** lws_genhmac_update() - digest len bytes of the buffer starting at in |
164 | * |
165 | * \param ctx: your struct lws_genhmac_ctx |
166 | * \param in: start of the bytes to digest |
167 | * \param len: count of bytes to digest |
168 | * |
169 | * Updates the state of your hash context to reflect digesting len bytes from in |
170 | * |
171 | * If the return is nonzero, it failed and needs destroying. |
172 | */ |
173 | LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT |
174 | lws_genhmac_update(struct lws_genhmac_ctx *ctx, const void *in, size_t len); |
175 | |
176 | /** lws_genhmac_destroy() - copy out the result digest and destroy the ctx |
177 | * |
178 | * \param ctx: your struct lws_genhmac_ctx |
179 | * \param result: NULL, or where to copy the result hash |
180 | * |
181 | * Finalizes the hash and copies out the digest. Destroys any allocations such |
182 | * that ctx can safely go out of scope after calling this. |
183 | * |
184 | * NULL result is supported so that you can destroy the ctx cleanly on error |
185 | * conditions, where there is no valid result. |
186 | */ |
187 | LWS_VISIBLE LWS_EXTERN int |
188 | lws_genhmac_destroy(struct lws_genhmac_ctx *ctx, void *result); |
189 | ///@} |
190 | |