vshost-util-vserver

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

crypto-wrapper-nss.h (4093B)


      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 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 #ifndef H_UTIL_VSERVER_LIB_INTERNAL_CRYPTO_WRAPPER_NSS_H
     18 #define H_UTIL_VSERVER_LIB_INTERNAL_CRYPTO_WRAPPER_NSS_H
     19 
     20 #include <sechash.h>
     21 #include <secoid.h>
     22 #include <nss.h>
     23 
     24 #include "util-cast.h"
     25 
     26 typedef struct SECHashObjectStr		ensc_hash_method;
     27 typedef struct HASHContextStr		*ensc_hash_context;
     28 
     29 inline static int
     30 ensc_crypto_init(void)
     31 {
     32 	NSS_NoDB_Init(NULL);
     33 	return 0;
     34 }
     35 
     36 inline static ensc_hash_method const *
     37 ensc_crypto_hash_get_default(void)
     38 {
     39 	return HASH_GetHashObject(SEC_OID_SHA1);
     40 }
     41 
     42 inline static ensc_hash_method const *
     43 ensc_crypto_hash_find(char const *id_c)
     44 {
     45 	SECOidTag		oid;
     46 
     47 #if 1
     48 	char			*id = strdupa(id_c);
     49 	char			*ptr = id;
     50 
     51 	while (*ptr) {
     52 		*ptr = tolower(*ptr);
     53 		++ptr;
     54 	}
     55 
     56 	ptr = id;
     57 	while ((ptr=strchr(ptr, '-'))!=NULL)
     58 		memmove(ptr, ptr+1, strlen(ptr));
     59 	
     60 	if (strcmp(id, "md2")==0)
     61 		oid = SEC_OID_MD2;
     62 	else if (strcmp(id, "md5")==0)
     63 		oid = SEC_OID_MD5;
     64 	else if (strcmp(id, "sha1")==0)
     65 		oid = SEC_OID_SHA1;
     66 	else if (strcasecmp(id, "sha256")==0)
     67 		oid = SEC_OID_SHA256;
     68 	else if (strcasecmp(id, "sha384")==0)
     69 		oid = SEC_OID_SHA384;
     70 	else if (strcasecmp(id, "sha512")==0)
     71 		oid = SEC_OID_SHA512;
     72 	else
     73 		oid = SEC_OID_UNKNOWN;
     74 		
     75 #else
     76 	struct SECItemStr const	item = {
     77 		.type = ???,
     78 		.data = const_cast(unsigned char *)(static_cast(unsigned char const *)(id)),
     79 		.len  = strlen(id)
     80 	};
     81 	SECOidTag		oid;
     82 	
     83 	oid = SECOID_FindOIDTag(&item);
     84 #endif
     85 
     86 	return HASH_GetHashObjectByOidTag(oid);
     87 }
     88 
     89 inline static char const *
     90 ensc_crypto_hash_get_name(ensc_hash_method const *m)
     91 {
     92 	char const * const	NAMES[] = {
     93 		[HASH_AlgNULL]   = "null",
     94 		[HASH_AlgMD2]    = "md2",
     95 		[HASH_AlgMD5]    = "md5",
     96 		[HASH_AlgSHA1]   = "sha1",
     97 		[HASH_AlgSHA256] = "sha256",
     98 		[HASH_AlgSHA384] = "sha384",
     99 		[HASH_AlgSHA512] = "sha512",
    100 	};
    101 	size_t		idx = static_cast(size_t)(m->type);
    102 	
    103 	if (idx >= sizeof(NAMES)/sizeof(NAMES[0]))
    104 		return NULL;
    105 	
    106 	return NAMES[idx];
    107 	/* TODO: use SECOID_FindOIDTagDescription()? */
    108 }
    109 
    110 inline static size_t
    111 ensc_crypto_hash_get_digestsize(ensc_hash_method const *m)
    112 {
    113 	size_t const		SIZES[] = {
    114 		[HASH_AlgMD2]    = MD2_LENGTH,
    115 		[HASH_AlgMD5]    = MD5_LENGTH,
    116 		[HASH_AlgSHA1]   = SHA1_LENGTH,
    117 		[HASH_AlgSHA256] = SHA256_LENGTH,
    118 		[HASH_AlgSHA384] = SHA384_LENGTH,
    119 		[HASH_AlgSHA512] = SHA512_LENGTH,
    120 	};
    121 	size_t		idx = static_cast(size_t)(m->type);
    122 	
    123 	if (idx >= sizeof(SIZES)/sizeof(SIZES[0]))
    124 		return 0;
    125 	
    126 	return SIZES[idx];
    127 }
    128 
    129 inline static size_t
    130 ensc_crypto_hashctx_get_digestsize(ensc_hash_context const *ctx)
    131 {
    132 	return ensc_crypto_hash_get_digestsize((*ctx)->hashobj);
    133 }
    134 
    135 inline static int
    136 ensc_crypto_hashctx_get_digest(ensc_hash_context *ctx, void *result,
    137 			       size_t UNUSED *res_len_a, size_t UNUSED max_res_len)
    138 {
    139 	unsigned int	res_len;
    140 	
    141 	HASH_End(*ctx, result, &res_len, max_res_len);
    142 	if (res_len_a)
    143 		*res_len_a = res_len;
    144 
    145 	return 0;
    146 }
    147 
    148 inline static int
    149 ensc_crypto_hashctx_init(ensc_hash_context *ctx, ensc_hash_method const *m)
    150 {
    151 	*ctx = HASH_Create(m->type);
    152 	return *ctx==NULL ? -1 : 0;
    153 }
    154 
    155 inline static int
    156 ensc_crypto_hashctx_update(ensc_hash_context *ctx, void const *src, size_t len)
    157 {
    158 	HASH_Update(*ctx, src, len);
    159 	return 0;
    160 }
    161 
    162 inline static int
    163 ensc_crypto_hashctx_reset(ensc_hash_context *ctx)
    164 {
    165 	HASH_Begin(*ctx);
    166 	return 0;
    167 }
    168 
    169 inline static void
    170 ensc_crypto_hashctx_free(ensc_hash_context *ctx)
    171 {
    172 	HASH_Destroy(*ctx);
    173 	*ctx = NULL;
    174 }
    175 
    176 #endif	/* H_UTIL_VSERVER_LIB_INTERNAL_CRYPTO_WRAPPER_NSS_H */