Annotation of embedaddon/strongswan/src/libstrongswan/plugins/botan/botan_x25519.c, revision 1.1.1.2
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:
1.1.1.2 ! misho 158: if (!botan_get_rng(&rng, RNG_STRONG))
1.1 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>