Annotation of embedaddon/strongswan/src/libstrongswan/plugins/botan/botan_rng.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_rng.h"
! 25:
! 26: #include <botan/build.h>
! 27:
! 28: #ifdef BOTAN_HAS_HMAC_DRBG
! 29:
! 30: #include <botan/ffi.h>
! 31:
! 32: typedef struct private_botan_random_t private_botan_random_t;
! 33:
! 34: /**
! 35: * Private data of an botan_rng_t object.
! 36: */
! 37: struct private_botan_random_t {
! 38:
! 39: /**
! 40: * Public botan_rnd_t interface.
! 41: */
! 42: botan_random_t public;
! 43:
! 44: /**
! 45: * RNG quality of this instance
! 46: */
! 47: rng_quality_t quality;
! 48:
! 49: /**
! 50: * RNG instance
! 51: */
! 52: botan_rng_t rng;
! 53: };
! 54:
! 55: METHOD(rng_t, get_bytes, bool,
! 56: private_botan_random_t *this, size_t bytes, uint8_t *buffer)
! 57: {
! 58: return botan_rng_get(this->rng, buffer, bytes) == 0;
! 59: }
! 60:
! 61: METHOD(rng_t, allocate_bytes, bool,
! 62: private_botan_random_t *this, size_t bytes, chunk_t *chunk)
! 63: {
! 64: *chunk = chunk_alloc(bytes);
! 65: if (!get_bytes(this, chunk->len, chunk->ptr))
! 66: {
! 67: chunk_free(chunk);
! 68: return FALSE;
! 69: }
! 70: return TRUE;
! 71: }
! 72:
! 73: METHOD(rng_t, destroy, void,
! 74: private_botan_random_t *this)
! 75: {
! 76: botan_rng_destroy(this->rng);
! 77: free(this);
! 78: }
! 79:
! 80: /*
! 81: * Described in header
! 82: */
! 83: botan_random_t *botan_rng_create(rng_quality_t quality)
! 84: {
! 85: private_botan_random_t *this;
! 86: const char* rng_name;
! 87:
! 88: switch (quality)
! 89: {
! 90: case RNG_WEAK:
! 91: case RNG_STRONG:
! 92: /* some rng_t instances of this class (e.g. in the ike-sa-manager)
! 93: * may be called concurrently by different threads. the Botan RNGs
! 94: * are not reentrant, by default, so use the threadsafe version.
! 95: * because we build without threading support when running tests
! 96: * with leak-detective (lots of reports of frees of unknown memory)
! 97: * there is a fallback to the default */
! 98: #ifdef BOTAN_TARGET_OS_HAS_THREADS
! 99: rng_name = "user-threadsafe";
! 100: #else
! 101: rng_name = "user";
! 102: #endif
! 103: break;
! 104: case RNG_TRUE:
! 105: rng_name = "system";
! 106: break;
! 107: default:
! 108: return NULL;
! 109: }
! 110:
! 111: INIT(this,
! 112: .public = {
! 113: .rng = {
! 114: .get_bytes = _get_bytes,
! 115: .allocate_bytes = _allocate_bytes,
! 116: .destroy = _destroy,
! 117: },
! 118: },
! 119: .quality = quality,
! 120: );
! 121:
! 122: if (botan_rng_init(&this->rng, rng_name))
! 123: {
! 124: free(this);
! 125: return NULL;
! 126: }
! 127: return &this->public;
! 128: }
! 129:
! 130: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>