1 /*
2 * internal.c
3 * Wrapper for builtin functions
4 *
5 * Copyright (c) 2001 Marko Kreen
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * contrib/pgcrypto/internal-sha2.c
30 */
31
32 #include "postgres.h"
33
34 #include <time.h>
35
36 #include "common/sha2.h"
37 #include "px.h"
38
39 void init_sha224(PX_MD *h);
40 void init_sha256(PX_MD *h);
41 void init_sha384(PX_MD *h);
42 void init_sha512(PX_MD *h);
43
44 /* SHA224 */
45
46 static unsigned
int_sha224_len(PX_MD * h)47 int_sha224_len(PX_MD *h)
48 {
49 return PG_SHA224_DIGEST_LENGTH;
50 }
51
52 static unsigned
int_sha224_block_len(PX_MD * h)53 int_sha224_block_len(PX_MD *h)
54 {
55 return PG_SHA224_BLOCK_LENGTH;
56 }
57
58 static void
int_sha224_update(PX_MD * h,const uint8 * data,unsigned dlen)59 int_sha224_update(PX_MD *h, const uint8 *data, unsigned dlen)
60 {
61 pg_sha224_ctx *ctx = (pg_sha224_ctx *) h->p.ptr;
62
63 pg_sha224_update(ctx, data, dlen);
64 }
65
66 static void
int_sha224_reset(PX_MD * h)67 int_sha224_reset(PX_MD *h)
68 {
69 pg_sha224_ctx *ctx = (pg_sha224_ctx *) h->p.ptr;
70
71 pg_sha224_init(ctx);
72 }
73
74 static void
int_sha224_finish(PX_MD * h,uint8 * dst)75 int_sha224_finish(PX_MD *h, uint8 *dst)
76 {
77 pg_sha224_ctx *ctx = (pg_sha224_ctx *) h->p.ptr;
78
79 pg_sha224_final(ctx, dst);
80 }
81
82 static void
int_sha224_free(PX_MD * h)83 int_sha224_free(PX_MD *h)
84 {
85 pg_sha224_ctx *ctx = (pg_sha224_ctx *) h->p.ptr;
86
87 px_memset(ctx, 0, sizeof(*ctx));
88 px_free(ctx);
89 px_free(h);
90 }
91
92 /* SHA256 */
93
94 static unsigned
int_sha256_len(PX_MD * h)95 int_sha256_len(PX_MD *h)
96 {
97 return PG_SHA256_DIGEST_LENGTH;
98 }
99
100 static unsigned
int_sha256_block_len(PX_MD * h)101 int_sha256_block_len(PX_MD *h)
102 {
103 return PG_SHA256_BLOCK_LENGTH;
104 }
105
106 static void
int_sha256_update(PX_MD * h,const uint8 * data,unsigned dlen)107 int_sha256_update(PX_MD *h, const uint8 *data, unsigned dlen)
108 {
109 pg_sha256_ctx *ctx = (pg_sha256_ctx *) h->p.ptr;
110
111 pg_sha256_update(ctx, data, dlen);
112 }
113
114 static void
int_sha256_reset(PX_MD * h)115 int_sha256_reset(PX_MD *h)
116 {
117 pg_sha256_ctx *ctx = (pg_sha256_ctx *) h->p.ptr;
118
119 pg_sha256_init(ctx);
120 }
121
122 static void
int_sha256_finish(PX_MD * h,uint8 * dst)123 int_sha256_finish(PX_MD *h, uint8 *dst)
124 {
125 pg_sha256_ctx *ctx = (pg_sha256_ctx *) h->p.ptr;
126
127 pg_sha256_final(ctx, dst);
128 }
129
130 static void
int_sha256_free(PX_MD * h)131 int_sha256_free(PX_MD *h)
132 {
133 pg_sha256_ctx *ctx = (pg_sha256_ctx *) h->p.ptr;
134
135 px_memset(ctx, 0, sizeof(*ctx));
136 px_free(ctx);
137 px_free(h);
138 }
139
140 /* SHA384 */
141
142 static unsigned
int_sha384_len(PX_MD * h)143 int_sha384_len(PX_MD *h)
144 {
145 return PG_SHA384_DIGEST_LENGTH;
146 }
147
148 static unsigned
int_sha384_block_len(PX_MD * h)149 int_sha384_block_len(PX_MD *h)
150 {
151 return PG_SHA384_BLOCK_LENGTH;
152 }
153
154 static void
int_sha384_update(PX_MD * h,const uint8 * data,unsigned dlen)155 int_sha384_update(PX_MD *h, const uint8 *data, unsigned dlen)
156 {
157 pg_sha384_ctx *ctx = (pg_sha384_ctx *) h->p.ptr;
158
159 pg_sha384_update(ctx, data, dlen);
160 }
161
162 static void
int_sha384_reset(PX_MD * h)163 int_sha384_reset(PX_MD *h)
164 {
165 pg_sha384_ctx *ctx = (pg_sha384_ctx *) h->p.ptr;
166
167 pg_sha384_init(ctx);
168 }
169
170 static void
int_sha384_finish(PX_MD * h,uint8 * dst)171 int_sha384_finish(PX_MD *h, uint8 *dst)
172 {
173 pg_sha384_ctx *ctx = (pg_sha384_ctx *) h->p.ptr;
174
175 pg_sha384_final(ctx, dst);
176 }
177
178 static void
int_sha384_free(PX_MD * h)179 int_sha384_free(PX_MD *h)
180 {
181 pg_sha384_ctx *ctx = (pg_sha384_ctx *) h->p.ptr;
182
183 px_memset(ctx, 0, sizeof(*ctx));
184 px_free(ctx);
185 px_free(h);
186 }
187
188 /* SHA512 */
189
190 static unsigned
int_sha512_len(PX_MD * h)191 int_sha512_len(PX_MD *h)
192 {
193 return PG_SHA512_DIGEST_LENGTH;
194 }
195
196 static unsigned
int_sha512_block_len(PX_MD * h)197 int_sha512_block_len(PX_MD *h)
198 {
199 return PG_SHA512_BLOCK_LENGTH;
200 }
201
202 static void
int_sha512_update(PX_MD * h,const uint8 * data,unsigned dlen)203 int_sha512_update(PX_MD *h, const uint8 *data, unsigned dlen)
204 {
205 pg_sha512_ctx *ctx = (pg_sha512_ctx *) h->p.ptr;
206
207 pg_sha512_update(ctx, data, dlen);
208 }
209
210 static void
int_sha512_reset(PX_MD * h)211 int_sha512_reset(PX_MD *h)
212 {
213 pg_sha512_ctx *ctx = (pg_sha512_ctx *) h->p.ptr;
214
215 pg_sha512_init(ctx);
216 }
217
218 static void
int_sha512_finish(PX_MD * h,uint8 * dst)219 int_sha512_finish(PX_MD *h, uint8 *dst)
220 {
221 pg_sha512_ctx *ctx = (pg_sha512_ctx *) h->p.ptr;
222
223 pg_sha512_final(ctx, dst);
224 }
225
226 static void
int_sha512_free(PX_MD * h)227 int_sha512_free(PX_MD *h)
228 {
229 pg_sha512_ctx *ctx = (pg_sha512_ctx *) h->p.ptr;
230
231 px_memset(ctx, 0, sizeof(*ctx));
232 px_free(ctx);
233 px_free(h);
234 }
235
236 /* init functions */
237
238 void
init_sha224(PX_MD * md)239 init_sha224(PX_MD *md)
240 {
241 pg_sha224_ctx *ctx;
242
243 ctx = px_alloc(sizeof(*ctx));
244 memset(ctx, 0, sizeof(*ctx));
245
246 md->p.ptr = ctx;
247
248 md->result_size = int_sha224_len;
249 md->block_size = int_sha224_block_len;
250 md->reset = int_sha224_reset;
251 md->update = int_sha224_update;
252 md->finish = int_sha224_finish;
253 md->free = int_sha224_free;
254
255 md->reset(md);
256 }
257
258 void
init_sha256(PX_MD * md)259 init_sha256(PX_MD *md)
260 {
261 pg_sha256_ctx *ctx;
262
263 ctx = px_alloc(sizeof(*ctx));
264 memset(ctx, 0, sizeof(*ctx));
265
266 md->p.ptr = ctx;
267
268 md->result_size = int_sha256_len;
269 md->block_size = int_sha256_block_len;
270 md->reset = int_sha256_reset;
271 md->update = int_sha256_update;
272 md->finish = int_sha256_finish;
273 md->free = int_sha256_free;
274
275 md->reset(md);
276 }
277
278 void
init_sha384(PX_MD * md)279 init_sha384(PX_MD *md)
280 {
281 pg_sha384_ctx *ctx;
282
283 ctx = px_alloc(sizeof(*ctx));
284 memset(ctx, 0, sizeof(*ctx));
285
286 md->p.ptr = ctx;
287
288 md->result_size = int_sha384_len;
289 md->block_size = int_sha384_block_len;
290 md->reset = int_sha384_reset;
291 md->update = int_sha384_update;
292 md->finish = int_sha384_finish;
293 md->free = int_sha384_free;
294
295 md->reset(md);
296 }
297
298 void
init_sha512(PX_MD * md)299 init_sha512(PX_MD *md)
300 {
301 pg_sha512_ctx *ctx;
302
303 ctx = px_alloc(sizeof(*ctx));
304 memset(ctx, 0, sizeof(*ctx));
305
306 md->p.ptr = ctx;
307
308 md->result_size = int_sha512_len;
309 md->block_size = int_sha512_block_len;
310 md->reset = int_sha512_reset;
311 md->update = int_sha512_update;
312 md->finish = int_sha512_finish;
313 md->free = int_sha512_free;
314
315 md->reset(md);
316 }
317