FD.io VPP  v21.06-1-gbb7418cf9
Vector Packet Processing
wireguard_key.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Doc.ai and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
17 #include <openssl/evp.h>
18 
19 bool
21  const u8 secret_key[CURVE25519_KEY_SIZE],
22  const u8 basepoint[CURVE25519_KEY_SIZE])
23 {
24 
25  bool ret;
26  EVP_PKEY_CTX *ctx;
27  size_t key_len;
28 
29  EVP_PKEY *peerkey = NULL;
30  EVP_PKEY *pkey =
31  EVP_PKEY_new_raw_private_key (EVP_PKEY_X25519, NULL, secret_key,
32  CURVE25519_KEY_SIZE);
33 
34  ret = true;
35 
36  ctx = EVP_PKEY_CTX_new (pkey, NULL);
37  if (EVP_PKEY_derive_init (ctx) <= 0)
38  {
39  ret = false;
40  goto out;
41  }
42 
43  peerkey =
44  EVP_PKEY_new_raw_public_key (EVP_PKEY_X25519, NULL, basepoint,
45  CURVE25519_KEY_SIZE);
46  if (EVP_PKEY_derive_set_peer (ctx, peerkey) <= 0)
47  {
48  ret = false;
49  goto out;
50  }
51 
52  key_len = CURVE25519_KEY_SIZE;
53  if (EVP_PKEY_derive (ctx, shared_key, &key_len) <= 0)
54  {
55  ret = false;
56  }
57 
58 out:
59  EVP_PKEY_CTX_free (ctx);
60  EVP_PKEY_free (pkey);
61  EVP_PKEY_free (peerkey);
62  return ret;
63 }
64 
65 bool
67  const u8 secret_key[CURVE25519_KEY_SIZE])
68 {
69  size_t pub_len;
70  EVP_PKEY *pkey =
71  EVP_PKEY_new_raw_private_key (EVP_PKEY_X25519, NULL, secret_key,
72  CURVE25519_KEY_SIZE);
73  pub_len = CURVE25519_KEY_SIZE;
74  if (!EVP_PKEY_get_raw_public_key (pkey, public_key, &pub_len))
75  {
76  EVP_PKEY_free (pkey);
77  return false;
78  }
79  EVP_PKEY_free (pkey);
80  return true;
81 }
82 
83 bool
85 {
86  size_t secret_len;
87  EVP_PKEY *pkey = NULL;
88  EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id (EVP_PKEY_X25519, NULL);
89  EVP_PKEY_keygen_init (pctx);
90  EVP_PKEY_keygen (pctx, &pkey);
91  EVP_PKEY_CTX_free (pctx);
92 
93  secret_len = CURVE25519_KEY_SIZE;
94  if (!EVP_PKEY_get_raw_private_key (pkey, secret_key, &secret_len))
95  {
96  EVP_PKEY_free (pkey);
97  return false;
98  }
99  EVP_PKEY_free (pkey);
100  return true;
101 }
102 
103 bool
104 key_to_base64 (const u8 * src, size_t src_len, u8 * out)
105 {
106  if (!EVP_EncodeBlock (out, src, src_len))
107  return false;
108  return true;
109 }
110 
111 bool
112 key_from_base64 (const u8 * src, size_t src_len, u8 * out)
113 {
114  if (EVP_DecodeBlock (out, src, src_len - 1) <= 0)
115  return false;
116  return true;
117 }
118 
119 /*
120  * fd.io coding-style-patch-verification: ON
121  *
122  * Local Variables:
123  * eval: (c-set-style "gnu")
124  * End:
125  */
vl_api_address_t src
Definition: gre.api:54
u16 key_len
Definition: ikev2_types.api:95
bool key_to_base64(const u8 *src, size_t src_len, u8 *out)
unsigned char u8
Definition: types.h:56
long ctx[MAX_CONNS]
Definition: main.c:144
bool key_from_base64(const u8 *src, size_t src_len, u8 *out)
u8 public_key[32]
Definition: wireguard.api:36
bool curve25519_gen_secret(u8 secret_key[CURVE25519_KEY_SIZE])
Definition: wireguard_key.c:84
bool curve25519_gen_public(u8 public_key[CURVE25519_KEY_SIZE], const u8 secret_key[CURVE25519_KEY_SIZE])
Definition: wireguard_key.c:66
bool curve25519_gen_shared(u8 shared_key[CURVE25519_KEY_SIZE], const u8 secret_key[CURVE25519_KEY_SIZE], const u8 basepoint[CURVE25519_KEY_SIZE])
Definition: wireguard_key.c:20