Annotation of embedaddon/strongswan/src/libstrongswan/plugins/botan/botan_hmac.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2018 René Korthaus
! 3: * Rohde & Schwarz Cybersecurity GmbH
! 4: *
! 5: * Permission is hereby granted, free of charge, to any person obtaining a copy
! 6: * of this software and associated documentation files (the "Software"), to deal
! 7: * in the Software without restriction, including without limitation the rights
! 8: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! 9: * copies of the Software, and to permit persons to whom the Software is
! 10: * furnished to do so, subject to the following conditions:
! 11: *
! 12: * The above copyright notice and this permission notice shall be included in
! 13: * all copies or substantial portions of the Software.
! 14: *
! 15: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! 16: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! 17: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! 18: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! 19: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! 20: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
! 21: * THE SOFTWARE.
! 22: */
! 23:
! 24: #include "botan_hmac.h"
! 25:
! 26: #include <botan/build.h>
! 27:
! 28: #ifdef BOTAN_HAS_HMAC
! 29:
! 30: #include <crypto/mac.h>
! 31: #include <crypto/prfs/mac_prf.h>
! 32: #include <crypto/signers/mac_signer.h>
! 33:
! 34: #include <botan/ffi.h>
! 35:
! 36: typedef struct private_botan_mac_t private_botan_mac_t;
! 37:
! 38: /**
! 39: * Private data of a mac_t object.
! 40: */
! 41: struct private_botan_mac_t {
! 42:
! 43: /**
! 44: * Public interface
! 45: */
! 46: mac_t public;
! 47:
! 48: /**
! 49: * HMAC
! 50: */
! 51: botan_mac_t hmac;
! 52: };
! 53:
! 54: METHOD(mac_t, set_key, bool,
! 55: private_botan_mac_t *this, chunk_t key)
! 56: {
! 57: if (botan_mac_set_key(this->hmac, key.ptr, key.len))
! 58: {
! 59: return FALSE;
! 60: }
! 61: return TRUE;
! 62: }
! 63:
! 64: METHOD(mac_t, get_mac, bool,
! 65: private_botan_mac_t *this, chunk_t data, uint8_t *out)
! 66: {
! 67: if (botan_mac_update(this->hmac, data.ptr, data.len))
! 68: {
! 69: return FALSE;
! 70: }
! 71:
! 72: if (out && botan_mac_final(this->hmac, out))
! 73: {
! 74: return FALSE;
! 75: }
! 76: return TRUE;
! 77: }
! 78:
! 79: METHOD(mac_t, get_mac_size, size_t,
! 80: private_botan_mac_t *this)
! 81: {
! 82: size_t len = 0;
! 83:
! 84: if (botan_mac_output_length(this->hmac, &len))
! 85: {
! 86: return 0;
! 87: }
! 88: return len;
! 89: }
! 90:
! 91: METHOD(mac_t, destroy, void,
! 92: private_botan_mac_t *this)
! 93: {
! 94: botan_mac_destroy(this->hmac);
! 95: free(this);
! 96: }
! 97:
! 98: /*
! 99: * Create a Botan-backed implementation of the mac_t interface
! 100: */
! 101: static mac_t *hmac_create(hash_algorithm_t algo)
! 102: {
! 103: private_botan_mac_t *this;
! 104: const char* hmac_name;
! 105:
! 106: switch (algo)
! 107: {
! 108: case HASH_SHA1:
! 109: hmac_name = "HMAC(SHA-1)";
! 110: break;
! 111: case HASH_SHA256:
! 112: hmac_name = "HMAC(SHA-256)";
! 113: break;
! 114: case HASH_SHA384:
! 115: hmac_name = "HMAC(SHA-384)";
! 116: break;
! 117: case HASH_SHA512:
! 118: hmac_name = "HMAC(SHA-512)";
! 119: break;
! 120: default:
! 121: return NULL;
! 122: }
! 123:
! 124: INIT(this,
! 125: .public = {
! 126: .get_mac = _get_mac,
! 127: .get_mac_size = _get_mac_size,
! 128: .set_key = _set_key,
! 129: .destroy = _destroy,
! 130: }
! 131: );
! 132:
! 133: if (botan_mac_init(&this->hmac, hmac_name, 0))
! 134: {
! 135: free(this);
! 136: return NULL;
! 137: }
! 138: return &this->public;
! 139: }
! 140:
! 141: /*
! 142: * Described in header
! 143: */
! 144: prf_t *botan_hmac_prf_create(pseudo_random_function_t algo)
! 145: {
! 146: mac_t *hmac;
! 147:
! 148: hmac = hmac_create(hasher_algorithm_from_prf(algo));
! 149: if (hmac)
! 150: {
! 151: return mac_prf_create(hmac);
! 152: }
! 153: return NULL;
! 154: }
! 155:
! 156: /*
! 157: * Described in header
! 158: */
! 159: signer_t *botan_hmac_signer_create(integrity_algorithm_t algo)
! 160: {
! 161: mac_t *hmac;
! 162: size_t trunc;
! 163:
! 164: hmac = hmac_create(hasher_algorithm_from_integrity(algo, &trunc));
! 165: if (hmac)
! 166: {
! 167: return mac_signer_create(hmac, trunc);
! 168: }
! 169: return NULL;
! 170: }
! 171:
! 172: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>