Return to botan_x25519.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / plugins / botan |
1.1 misho 1: /* 2: * Copyright (C) 2018 Tobias Brunner 3: * HSR Hochschule fuer Technik Rapperswil 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_x25519.h" 25: 26: #include <botan/build.h> 27: 28: #ifdef BOTAN_HAS_X25519 29: 30: #include "botan_util.h" 31: 32: #include <utils/debug.h> 33: 34: #include <botan/ffi.h> 35: 36: typedef struct private_diffie_hellman_t private_diffie_hellman_t; 37: 38: /** 39: * Private data 40: */ 41: struct private_diffie_hellman_t { 42: 43: /** 44: * Public interface 45: */ 46: diffie_hellman_t public; 47: 48: /** 49: * Private key 50: */ 51: botan_privkey_t key; 52: 53: /** 54: * Shared secret 55: */ 56: chunk_t shared_secret; 57: }; 58: 59: METHOD(diffie_hellman_t, set_other_public_value, bool, 60: private_diffie_hellman_t *this, chunk_t value) 61: { 62: if (!diffie_hellman_verify_value(CURVE_25519, value)) 63: { 64: return FALSE; 65: } 66: 67: chunk_clear(&this->shared_secret); 68: 69: return botan_dh_key_derivation(this->key, value, &this->shared_secret); 70: } 71: 72: METHOD(diffie_hellman_t, get_my_public_value, bool, 73: private_diffie_hellman_t *this, chunk_t *value) 74: { 75: value->len = 0; 76: if (botan_pk_op_key_agreement_export_public(this->key, NULL, &value->len) 77: != BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE) 78: { 79: return FALSE; 80: } 81: 82: *value = chunk_alloc(value->len); 83: if (botan_pk_op_key_agreement_export_public(this->key, value->ptr, 84: &value->len)) 85: { 86: chunk_free(value); 87: return FALSE; 88: } 89: return TRUE; 90: } 91: 92: METHOD(diffie_hellman_t, set_private_value, bool, 93: private_diffie_hellman_t *this, chunk_t value) 94: { 95: if (value.len != 32) 96: { 97: return FALSE; 98: } 99: 100: chunk_clear(&this->shared_secret); 101: 102: if (botan_privkey_destroy(this->key)) 103: { 104: return FALSE; 105: } 106: 107: if (botan_privkey_load_x25519(&this->key, value.ptr)) 108: { 109: return FALSE; 110: } 111: return TRUE; 112: } 113: 114: METHOD(diffie_hellman_t, get_shared_secret, bool, 115: private_diffie_hellman_t *this, chunk_t *secret) 116: { 117: if (!this->shared_secret.len) 118: { 119: return FALSE; 120: } 121: *secret = chunk_clone(this->shared_secret); 122: return TRUE; 123: } 124: 125: METHOD(diffie_hellman_t, get_dh_group, diffie_hellman_group_t, 126: private_diffie_hellman_t *this) 127: { 128: return CURVE_25519; 129: } 130: 131: METHOD(diffie_hellman_t, destroy, void, 132: private_diffie_hellman_t *this) 133: { 134: botan_privkey_destroy(this->key); 135: chunk_clear(&this->shared_secret); 136: free(this); 137: } 138: 139: /* 140: * Described in header 141: */ 142: diffie_hellman_t *botan_x25519_create(diffie_hellman_group_t group) 143: { 144: private_diffie_hellman_t *this; 145: botan_rng_t rng; 146: 147: INIT(this, 148: .public = { 149: .get_shared_secret = _get_shared_secret, 150: .set_other_public_value = _set_other_public_value, 151: .get_my_public_value = _get_my_public_value, 152: .set_private_value = _set_private_value, 153: .get_dh_group = _get_dh_group, 154: .destroy = _destroy, 155: }, 156: ); 157: 158: if (botan_rng_init(&rng, "user")) 159: { 160: free(this); 161: return NULL; 162: } 163: 164: if (botan_privkey_create(&this->key, "Curve25519", "", rng)) 165: { 166: DBG1(DBG_LIB, "x25519 private key generation failed"); 167: botan_rng_destroy(rng); 168: free(this); 169: return NULL; 170: } 171: 172: botan_rng_destroy(rng); 173: return &this->public; 174: } 175: 176: #endif