vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

crypto.c (5884B)


      1 /*	--*- c -*--
      2  * Copyright (C) 2008 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      3  *
      4  * This program is free software; you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation; version 2 and/or 3 of the License.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #define ENSC_TESTSUITE
     18 
     19 #ifdef HAVE_CONFIG_H
     20 #  include <config.h>
     21 #endif
     22 
     23 #include <lib_internal/crypto-wrapper.h>
     24 #include <lib_internal/coreassert.h>
     25 
     26 static unsigned int
     27 hex2digit(char c)
     28 {
     29 	if (c>='0' && c<='9')
     30 		return c-'0';
     31 	c &= ~0x20;
     32 	if (c>='A' && c<='F')
     33 		return c-'A' + 10;
     34 
     35 	assert(0);
     36 	return 0;
     37 }
     38 
     39 static void
     40 convert_digest_ascii2bin(void *dst_v, char const *digest, size_t d_len)
     41 {
     42 	unsigned char	*dst = dst_v;
     43 	
     44 	while (d_len>0) {
     45 		*dst  = hex2digit(*digest++)<<4;
     46 		*dst |= hex2digit(*digest++);
     47 
     48 		++dst;
     49 		--d_len;
     50 	}
     51 }
     52 
     53 static void
     54 test_digest(char const *name, size_t d_len,
     55 	    void const *buf,  size_t buf_len,
     56 	    char const *digest)
     57 {
     58 	ensc_hash_method const	*m = ensc_crypto_hash_find(name);
     59 	ensc_hash_context	ctx;
     60 	unsigned char		*exp_digest[d_len/8];
     61 	unsigned char		*bin_digest[d_len/8];
     62 	size_t			bin_digest_len;
     63 	size_t			i;
     64 
     65 	d_len /= 8;
     66 	convert_digest_ascii2bin(exp_digest, digest, d_len);
     67 
     68 	assert(m);
     69 	assert(ensc_crypto_hash_get_digestsize(m)==d_len);
     70 
     71 	{
     72 		char const		*tmp_name = ensc_crypto_hash_get_name(m);
     73 		ensc_hash_method const	*tmp_meth = tmp_name ? ensc_crypto_hash_find(tmp_name) : NULL;
     74 
     75 		assert(tmp_name!=NULL);
     76 		assert(tmp_meth!=NULL);
     77 		assert(ensc_crypto_hash_get_digestsize(tmp_meth)==d_len);
     78 	}
     79 
     80 	ensc_crypto_hashctx_init(&ctx, m);
     81 	assert(ensc_crypto_hashctx_get_digestsize(&ctx)==d_len);
     82 
     83 	/* run it multiple times to test for correct reset/init behavior */
     84 	for (i=0; i<3; ++i) {
     85 		assert(ensc_crypto_hashctx_reset(&ctx)==0);
     86 		assert(ensc_crypto_hashctx_update(&ctx, buf, buf_len)==0);
     87 
     88 		switch (i) {
     89 		case 0:
     90 		case 2:
     91 			break;
     92 
     93 		case 1:
     94 			assert(ensc_crypto_hashctx_update(&ctx, "gremlin", 7)==0);
     95 			break;
     96 		}
     97 
     98 		assert(ensc_crypto_hashctx_get_digest(&ctx, bin_digest, &bin_digest_len, d_len)==0);
     99 		assert(bin_digest_len==d_len);
    100 
    101 		
    102 		switch (i) {
    103 		case 0:
    104 		case 2:
    105 			assert(memcmp(exp_digest, bin_digest, d_len)==0);
    106 			break;
    107 
    108 		case 1:
    109 			assert(memcmp(exp_digest, bin_digest, d_len)!=0);
    110 			break;
    111 		}
    112 	}
    113 
    114 	ensc_crypto_hashctx_free(&ctx);
    115 }
    116 
    117 int main()
    118 {
    119 	ensc_crypto_init();
    120 	assert(ensc_crypto_hash_get_default()!=NULL);
    121 
    122 	/* MD-5 */
    123 
    124 	test_digest("md5",  128, "",    0, "d41d8cd98f00b204e9800998ecf8427e");
    125 	test_digest("md-5", 128, "",    0, "d41d8cd98f00b204e9800998ecf8427e");
    126 	test_digest("MD5",  128, "",    0, "d41d8cd98f00b204e9800998ecf8427e");
    127 	test_digest("MD-5", 128, "",    0, "d41d8cd98f00b204e9800998ecf8427e");
    128 
    129 	test_digest("md5",  128, "foo", 3, "acbd18db4cc2f85cedef654fccc4a4d8");
    130 	
    131 	/* SHA-1 */
    132 	test_digest("sha1",  160, "",    0, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
    133 	test_digest("sha-1", 160, "",    0, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
    134 	test_digest("SHA1",  160, "",    0, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
    135 	test_digest("SHA-1", 160, "",    0, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
    136 	
    137 	test_digest("sha1",  160, "foo", 3, "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33");
    138 
    139 	/* SHA-256 */
    140 	test_digest("sha256",  256, "",    0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
    141 	test_digest("sha-256", 256, "",    0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
    142 	test_digest("SHA256",  256, "",    0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
    143 	test_digest("SHA-256", 256, "",    0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
    144 
    145 	test_digest("sha256",  256, "foo", 3, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae");
    146 
    147 #if ENSC_CRYPTO_API != ENSC_CRYPTO_API_BEECRYPT	 /* see comments in crypto-wrapper-beecrypt.h */
    148 	/* SHA-384 */
    149 	test_digest("sha384",  384, "",    0, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
    150 	test_digest("sha-384", 384, "",    0, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
    151 	test_digest("SHA384",  384, "",    0, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
    152 	test_digest("SHA-384", 384, "",    0, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
    153 
    154 	test_digest("sha384",  384, "foo", 3, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb");
    155 #endif
    156 
    157 	/* SHA-512 */
    158 	test_digest("sha512",  512, "",    0, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
    159 	test_digest("sha-512", 512, "",    0, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
    160 	test_digest("SHA512",  512, "",    0, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
    161 	test_digest("SHA-512", 512, "",    0, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
    162 
    163 	test_digest("sha512",  512, "foo", 3, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7");
    164 }