Annotation of embedaddon/strongswan/src/libstrongswan/plugins/openssl/openssl_hasher.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008-2017 Tobias Brunner
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include "openssl_hasher.h"
! 17:
! 18: #include <openssl/evp.h>
! 19:
! 20: typedef struct private_openssl_hasher_t private_openssl_hasher_t;
! 21:
! 22: /**
! 23: * Private data of openssl_hasher_t
! 24: */
! 25: struct private_openssl_hasher_t {
! 26:
! 27: /**
! 28: * Public part of this class.
! 29: */
! 30: openssl_hasher_t public;
! 31:
! 32: /**
! 33: * the hasher to use
! 34: */
! 35: const EVP_MD *hasher;
! 36:
! 37: /**
! 38: * the current digest context
! 39: */
! 40: EVP_MD_CTX *ctx;
! 41: };
! 42:
! 43: METHOD(hasher_t, get_hash_size, size_t,
! 44: private_openssl_hasher_t *this)
! 45: {
! 46: return EVP_MD_size(this->hasher);
! 47: }
! 48:
! 49: METHOD(hasher_t, reset, bool,
! 50: private_openssl_hasher_t *this)
! 51: {
! 52: return EVP_DigestInit_ex(this->ctx, this->hasher, NULL) == 1;
! 53: }
! 54:
! 55: METHOD(hasher_t, get_hash, bool,
! 56: private_openssl_hasher_t *this, chunk_t chunk, uint8_t *hash)
! 57: {
! 58: if (EVP_DigestUpdate(this->ctx, chunk.ptr, chunk.len) != 1)
! 59: {
! 60: return FALSE;
! 61: }
! 62: if (hash)
! 63: {
! 64: if (EVP_DigestFinal_ex(this->ctx, hash, NULL) != 1)
! 65: {
! 66: return FALSE;
! 67: }
! 68: return reset(this);
! 69: }
! 70: return TRUE;
! 71: }
! 72:
! 73: METHOD(hasher_t, allocate_hash, bool,
! 74: private_openssl_hasher_t *this, chunk_t chunk, chunk_t *hash)
! 75: {
! 76: if (hash)
! 77: {
! 78: *hash = chunk_alloc(get_hash_size(this));
! 79: return get_hash(this, chunk, hash->ptr);
! 80: }
! 81: return get_hash(this, chunk, NULL);
! 82: }
! 83:
! 84: METHOD(hasher_t, destroy, void,
! 85: private_openssl_hasher_t *this)
! 86: {
! 87: EVP_MD_CTX_destroy(this->ctx);
! 88: free(this);
! 89: }
! 90:
! 91: /*
! 92: * Described in header
! 93: */
! 94: const EVP_MD *openssl_get_md(hash_algorithm_t hash)
! 95: {
! 96: const EVP_MD *md;
! 97: char *name;
! 98:
! 99: name = strdupnull(enum_to_name(hash_algorithm_short_names, hash));
! 100: if (!name)
! 101: {
! 102: return NULL;
! 103: }
! 104: /* for SHA3, we use underscores, while OpenSSL uses dashes */
! 105: translate(name, "_", "-");
! 106: md = EVP_get_digestbyname(name);
! 107: free(name);
! 108: return md;
! 109: }
! 110:
! 111: /*
! 112: * Described in header
! 113: */
! 114: openssl_hasher_t *openssl_hasher_create(hash_algorithm_t algo)
! 115: {
! 116: private_openssl_hasher_t *this;
! 117:
! 118: INIT(this,
! 119: .public = {
! 120: .hasher = {
! 121: .get_hash = _get_hash,
! 122: .allocate_hash = _allocate_hash,
! 123: .get_hash_size = _get_hash_size,
! 124: .reset = _reset,
! 125: .destroy = _destroy,
! 126: },
! 127: },
! 128: );
! 129:
! 130: this->hasher = openssl_get_md(algo);
! 131: if (!this->hasher)
! 132: {
! 133: /* OpenSSL does not support the requested algo */
! 134: free(this);
! 135: return NULL;
! 136: }
! 137:
! 138: this->ctx = EVP_MD_CTX_create();
! 139:
! 140: /* initialization */
! 141: if (!reset(this))
! 142: {
! 143: destroy(this);
! 144: return NULL;
! 145: }
! 146:
! 147: return &this->public;
! 148: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>