Annotation of embedaddon/strongswan/src/libstrongswan/plugins/wolfssl/wolfssl_hmac.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2019 Sean Parkinson, wolfSSL Inc.
! 3: *
! 4: * Permission is hereby granted, free of charge, to any person obtaining a copy
! 5: * of this software and associated documentation files (the "Software"), to deal
! 6: * in the Software without restriction, including without limitation the rights
! 7: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! 8: * copies of the Software, and to permit persons to whom the Software is
! 9: * furnished to do so, subject to the following conditions:
! 10: *
! 11: * The above copyright notice and this permission notice shall be included in
! 12: * all copies or substantial portions of the Software.
! 13: *
! 14: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! 15: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! 16: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! 17: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! 18: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! 19: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
! 20: * THE SOFTWARE.
! 21: */
! 22:
! 23: #include "wolfssl_common.h"
! 24:
! 25: #ifndef NO_HMAC
! 26:
! 27: #include <wolfssl/wolfcrypt/hmac.h>
! 28:
! 29: #include "wolfssl_hmac.h"
! 30: #include "wolfssl_util.h"
! 31:
! 32: #include <crypto/mac.h>
! 33: #include <crypto/prfs/mac_prf.h>
! 34: #include <crypto/signers/mac_signer.h>
! 35:
! 36: typedef struct private_mac_t private_mac_t;
! 37:
! 38: /**
! 39: * Private data of a mac_t object.
! 40: */
! 41: struct private_mac_t {
! 42:
! 43: /**
! 44: * Public interface
! 45: */
! 46: mac_t public;
! 47:
! 48: /**
! 49: * Current HMAC
! 50: */
! 51: Hmac hmac;
! 52:
! 53: /**
! 54: * Hasher to use
! 55: */
! 56: enum wc_HashType type;
! 57:
! 58: /**
! 59: * Key set on Hmac?
! 60: */
! 61: bool key_set;
! 62: };
! 63:
! 64: METHOD(mac_t, set_key, bool,
! 65: private_mac_t *this, chunk_t key)
! 66: {
! 67: int ret = wc_HmacSetKey(&this->hmac, this->type, key.ptr, key.len);
! 68: this->key_set = (ret == 0);
! 69: return ret == 0;
! 70: }
! 71:
! 72: METHOD(mac_t, get_mac, bool,
! 73: private_mac_t *this, chunk_t data, uint8_t *out)
! 74: {
! 75: int ret = -1;
! 76:
! 77: if (this->key_set)
! 78: {
! 79: ret = wc_HmacUpdate(&this->hmac, data.ptr, data.len);
! 80: if (ret == 0 && out)
! 81: {
! 82: ret = wc_HmacFinal(&this->hmac, out);
! 83: }
! 84: }
! 85: return ret == 0;
! 86: }
! 87:
! 88: METHOD(mac_t, get_mac_size, size_t,
! 89: private_mac_t *this)
! 90: {
! 91: return wc_HmacSizeByType(this->type);
! 92: }
! 93:
! 94: METHOD(mac_t, destroy, void,
! 95: private_mac_t *this)
! 96: {
! 97: wc_HmacFree(&this->hmac);
! 98: free(this);
! 99: }
! 100:
! 101: /*
! 102: * Create an wolfSSL-backed implementation of the mac_t interface
! 103: */
! 104: static mac_t *hmac_create(hash_algorithm_t algo)
! 105: {
! 106: private_mac_t *this;
! 107: enum wc_HashType type;
! 108:
! 109: if (!wolfssl_hash2type(algo, &type))
! 110: {
! 111: return NULL;
! 112: }
! 113:
! 114: INIT(this,
! 115: .public = {
! 116: .get_mac = _get_mac,
! 117: .get_mac_size = _get_mac_size,
! 118: .set_key = _set_key,
! 119: .destroy = _destroy,
! 120: },
! 121: .type = type,
! 122: );
! 123:
! 124: if (wc_HmacInit(&this->hmac, NULL, INVALID_DEVID) != 0)
! 125: {
! 126: DBG1(DBG_LIB, "HMAC init failed, hmac create failed\n");
! 127: free(this);
! 128: return NULL;
! 129: }
! 130: return &this->public;
! 131: }
! 132:
! 133: /*
! 134: * Described in header
! 135: */
! 136: prf_t *wolfssl_hmac_prf_create(pseudo_random_function_t algo)
! 137: {
! 138: mac_t *hmac;
! 139:
! 140: hmac = hmac_create(hasher_algorithm_from_prf(algo));
! 141: if (hmac)
! 142: {
! 143: return mac_prf_create(hmac);
! 144: }
! 145: return NULL;
! 146: }
! 147:
! 148: /*
! 149: * Described in header
! 150: */
! 151: signer_t *wolfssl_hmac_signer_create(integrity_algorithm_t algo)
! 152: {
! 153: mac_t *hmac;
! 154: size_t trunc;
! 155:
! 156: hmac = hmac_create(hasher_algorithm_from_integrity(algo, &trunc));
! 157: if (hmac)
! 158: {
! 159: return mac_signer_create(hmac, trunc);
! 160: }
! 161: return NULL;
! 162: }
! 163:
! 164: #endif /* NO_HMAC */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>