Annotation of embedaddon/strongswan/src/libstrongswan/crypto/signers/mac_signer.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2012 Tobias Brunner
! 3: * Copyright (C) 2005-2008 Martin Willi
! 4: * Copyright (C) 2005 Jan Hutter
! 5: * HSR Hochschule fuer Technik Rapperswil
! 6: *
! 7: * This program is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2 of the License, or (at your
! 10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 11: *
! 12: * This program is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 15: * for more details.
! 16: */
! 17:
! 18: #include "mac_signer.h"
! 19:
! 20: typedef struct private_signer_t private_signer_t;
! 21:
! 22: /**
! 23: * Private data of a mac_signer_t object.
! 24: */
! 25: struct private_signer_t {
! 26:
! 27: /**
! 28: * Public interface
! 29: */
! 30: signer_t public;
! 31:
! 32: /**
! 33: * MAC to use
! 34: */
! 35: mac_t *mac;
! 36:
! 37: /**
! 38: * Truncation of MAC output
! 39: */
! 40: size_t truncation;
! 41: };
! 42:
! 43: METHOD(signer_t, get_signature, bool,
! 44: private_signer_t *this, chunk_t data, uint8_t *buffer)
! 45: {
! 46: if (buffer)
! 47: {
! 48: uint8_t mac[this->mac->get_mac_size(this->mac)];
! 49:
! 50: if (!this->mac->get_mac(this->mac, data, mac))
! 51: {
! 52: return FALSE;
! 53: }
! 54: memcpy(buffer, mac, this->truncation);
! 55: return TRUE;
! 56: }
! 57: return this->mac->get_mac(this->mac, data, NULL);
! 58: }
! 59:
! 60: METHOD(signer_t, allocate_signature, bool,
! 61: private_signer_t *this, chunk_t data, chunk_t *chunk)
! 62: {
! 63: if (chunk)
! 64: {
! 65: uint8_t mac[this->mac->get_mac_size(this->mac)];
! 66:
! 67: if (!this->mac->get_mac(this->mac, data, mac))
! 68: {
! 69: return FALSE;
! 70: }
! 71: *chunk = chunk_alloc(this->truncation);
! 72: memcpy(chunk->ptr, mac, this->truncation);
! 73: return TRUE;
! 74: }
! 75: return this->mac->get_mac(this->mac, data, NULL);
! 76: }
! 77:
! 78: METHOD(signer_t, verify_signature, bool,
! 79: private_signer_t *this, chunk_t data, chunk_t signature)
! 80: {
! 81: uint8_t mac[this->mac->get_mac_size(this->mac)];
! 82:
! 83: if (signature.len != this->truncation)
! 84: {
! 85: return FALSE;
! 86: }
! 87: return this->mac->get_mac(this->mac, data, mac) &&
! 88: memeq_const(signature.ptr, mac, this->truncation);
! 89: }
! 90:
! 91: METHOD(signer_t, get_key_size, size_t,
! 92: private_signer_t *this)
! 93: {
! 94: return this->mac->get_mac_size(this->mac);
! 95: }
! 96:
! 97: METHOD(signer_t, get_block_size, size_t,
! 98: private_signer_t *this)
! 99: {
! 100: return this->truncation;
! 101: }
! 102:
! 103: METHOD(signer_t, set_key, bool,
! 104: private_signer_t *this, chunk_t key)
! 105: {
! 106: return this->mac->set_key(this->mac, key);
! 107: }
! 108:
! 109: METHOD(signer_t, destroy, void,
! 110: private_signer_t *this)
! 111: {
! 112: this->mac->destroy(this->mac);
! 113: free(this);
! 114: }
! 115:
! 116: /*
! 117: * Described in header
! 118: */
! 119: signer_t *mac_signer_create(mac_t *mac, size_t len)
! 120: {
! 121: private_signer_t *this;
! 122:
! 123: INIT(this,
! 124: .public = {
! 125: .get_signature = _get_signature,
! 126: .allocate_signature = _allocate_signature,
! 127: .verify_signature = _verify_signature,
! 128: .get_block_size = _get_block_size,
! 129: .get_key_size = _get_key_size,
! 130: .set_key = _set_key,
! 131: .destroy = _destroy,
! 132: },
! 133: .truncation = min(len, mac->get_mac_size(mac)),
! 134: .mac = mac,
! 135: );
! 136:
! 137: return &this->public;
! 138: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>