Annotation of embedaddon/strongswan/src/libstrongswan/plugins/wolfssl/wolfssl_sha1_prf.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_SHA
! 26:
! 27: #include "wolfssl_sha1_prf.h"
! 28:
! 29: #include <wolfssl/wolfcrypt/sha.h>
! 30: #include <crypto/hashers/hasher.h>
! 31:
! 32: typedef struct private_wolfssl_sha1_prf_t private_wolfssl_sha1_prf_t;
! 33:
! 34: /**
! 35: * Private data of an wolfssl_sha1_prf_t object.
! 36: */
! 37: struct private_wolfssl_sha1_prf_t {
! 38:
! 39: /**
! 40: * Public wolfssl_sha1_prf_t interface
! 41: */
! 42: wolfssl_sha1_prf_t public;
! 43:
! 44: /**
! 45: * SHA1 context
! 46: */
! 47: wc_Sha sha1;
! 48: };
! 49:
! 50: METHOD(prf_t, get_bytes, bool,
! 51: private_wolfssl_sha1_prf_t *this, chunk_t seed, uint8_t *bytes)
! 52: {
! 53: if (wc_ShaUpdate(&this->sha1, seed.ptr, seed.len) != 0)
! 54: {
! 55: return FALSE;
! 56: }
! 57:
! 58: if (bytes)
! 59: {
! 60: uint32_t *hash = (uint32_t*)bytes;
! 61:
! 62: hash[0] = htonl(this->sha1.digest[0]);
! 63: hash[1] = htonl(this->sha1.digest[1]);
! 64: hash[2] = htonl(this->sha1.digest[2]);
! 65: hash[3] = htonl(this->sha1.digest[3]);
! 66: hash[4] = htonl(this->sha1.digest[4]);
! 67: }
! 68: return TRUE;
! 69: }
! 70:
! 71: METHOD(prf_t, get_block_size, size_t,
! 72: private_wolfssl_sha1_prf_t *this)
! 73: {
! 74: return HASH_SIZE_SHA1;
! 75: }
! 76:
! 77: METHOD(prf_t, allocate_bytes, bool,
! 78: private_wolfssl_sha1_prf_t *this, chunk_t seed, chunk_t *chunk)
! 79: {
! 80: if (chunk)
! 81: {
! 82: *chunk = chunk_alloc(HASH_SIZE_SHA1);
! 83: return get_bytes(this, seed, chunk->ptr);
! 84: }
! 85: return get_bytes(this, seed, NULL);
! 86: }
! 87:
! 88: METHOD(prf_t, get_key_size, size_t,
! 89: private_wolfssl_sha1_prf_t *this)
! 90: {
! 91: return HASH_SIZE_SHA1;
! 92: }
! 93:
! 94: METHOD(prf_t, set_key, bool,
! 95: private_wolfssl_sha1_prf_t *this, chunk_t key)
! 96: {
! 97: if (wc_InitSha(&this->sha1) != 0)
! 98: {
! 99: return FALSE;
! 100: }
! 101:
! 102: if (key.len % 4)
! 103: {
! 104: return FALSE;
! 105: }
! 106: if (key.len >= 4)
! 107: {
! 108: this->sha1.digest[0] ^= untoh32(key.ptr);
! 109: }
! 110: if (key.len >= 8)
! 111: {
! 112: this->sha1.digest[1] ^= untoh32(key.ptr + 4);
! 113: }
! 114: if (key.len >= 12)
! 115: {
! 116: this->sha1.digest[2] ^= untoh32(key.ptr + 8);
! 117: }
! 118: if (key.len >= 16)
! 119: {
! 120: this->sha1.digest[3] ^= untoh32(key.ptr + 12);
! 121: }
! 122: if (key.len >= 20)
! 123: {
! 124: this->sha1.digest[4] ^= untoh32(key.ptr + 16);
! 125: }
! 126: return TRUE;
! 127: }
! 128:
! 129: METHOD(prf_t, destroy, void,
! 130: private_wolfssl_sha1_prf_t *this)
! 131: {
! 132: wc_ShaFree(&this->sha1);
! 133: free(this);
! 134: }
! 135:
! 136: /*
! 137: * Described in header
! 138: */
! 139: wolfssl_sha1_prf_t *wolfssl_sha1_prf_create(pseudo_random_function_t algo)
! 140: {
! 141: private_wolfssl_sha1_prf_t *this;
! 142:
! 143: INIT(this,
! 144: .public = {
! 145: .prf = {
! 146: .get_block_size = _get_block_size,
! 147: .get_bytes = _get_bytes,
! 148: .allocate_bytes = _allocate_bytes,
! 149: .get_key_size = _get_key_size,
! 150: .set_key = _set_key,
! 151: .destroy = _destroy,
! 152: },
! 153: },
! 154: );
! 155:
! 156: if (wc_InitSha(&this->sha1) != 0)
! 157: {
! 158: free(this);
! 159: return NULL;
! 160: }
! 161: return &this->public;
! 162: }
! 163:
! 164: #endif /* NO_SHA */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>