mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-10-30 23:34:47 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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;
 | |
| }
 | 
