12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /* hash-common.c - Common code for hash algorithms
- * Copyright (C) 2008 Free Software Foundation, Inc.
- *
- * This file is part of Libgcrypt.
- *
- * Libgcrypt is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * Libgcrypt is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
- #include <config.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #ifdef HAVE_STDINT_H
- # include <stdint.h>
- #endif
- #include "g10lib.h"
- #include "hash-common.h"
- /* Run a selftest for hash algorithm ALGO. If the resulting digest
- matches EXPECT/EXPECTLEN and everything else is fine as well,
- return NULL. If an error occurs, return a static text string
- describing the error.
- DATAMODE controls what will be hashed according to this table:
- 0 - Hash the supplied DATA of DATALEN.
- 1 - Hash one million times a 'a'. DATA and DATALEN are ignored.
- */
- const char *
- _gcry_hash_selftest_check_one (int algo,
- int datamode, const void *data, size_t datalen,
- const void *expect, size_t expectlen)
- {
- const char *result = NULL;
- gcry_error_t err = 0;
- gcry_md_hd_t hd;
- unsigned char *digest;
- if (_gcry_md_get_algo_dlen (algo) != expectlen)
- return "digest size does not match expected size";
- err = _gcry_md_open (&hd, algo, 0);
- if (err)
- return "gcry_md_open failed";
- switch (datamode)
- {
- case 0:
- _gcry_md_write (hd, data, datalen);
- break;
- case 1: /* Hash one million times an "a". */
- {
- char aaa[1000];
- int i;
- /* Write in odd size chunks so that we test the buffering. */
- memset (aaa, 'a', 1000);
- for (i = 0; i < 1000; i++)
- _gcry_md_write (hd, aaa, 1000);
- }
- break;
- default:
- result = "invalid DATAMODE";
- }
- if (!result)
- {
- digest = _gcry_md_read (hd, algo);
- if ( memcmp (digest, expect, expectlen) )
- result = "digest mismatch";
- }
- _gcry_md_close (hd);
- return result;
- }
|