OpenVPN
base64.c
Go to the documentation of this file.
1 /*
2  * OpenVPN -- An application to securely tunnel IP networks
3  * over a single TCP/UDP port, with support for SSL/TLS-based
4  * session authentication and key exchange,
5  * packet encryption, packet authentication, and
6  * packet compression.
7  *
8  * Copyright (C) 2017 David Sommerseth <davids@openvpn.net>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2
12  * as published by the Free Software Foundation.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program (see the file COPYING included with this
21  * distribution); if not, write to the Free Software Foundation, Inc.,
22  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24 
25 #include <stdio.h>
26 #include <string.h>
27 #include <stdlib.h>
28 
29 #include "openvpn-plugin.h"
30 
31 #define PLUGIN_NAME "base64.c"
32 
33 /* Exported plug-in v3 API functions */
36 plugin_base64_encode_t ovpn_base64_encode = NULL;
37 plugin_base64_decode_t ovpn_base64_decode = NULL;
53 static const char *
54 get_env(const char *name, const char *envp[])
55 {
56  if (envp)
57  {
58  int i;
59  const int namelen = strlen(name);
60  for (i = 0; envp[i]; ++i)
61  {
62  if (!strncmp(envp[i], name, namelen))
63  {
64  const char *cp = envp[i] + namelen;
65  if (*cp == '=')
66  {
67  return cp + 1;
68  }
69  }
70  }
71  }
72  return NULL;
73 }
74 
75 
99 openvpn_plugin_open_v3(const int v3structver,
100  struct openvpn_plugin_args_open_in const *args,
102 {
103  /* Check that we are API compatible */
104  if (v3structver != OPENVPN_PLUGINv3_STRUCTVER)
105  {
106  printf("base64.c: ** ERROR ** Incompatible plug-in interface between this plug-in and OpenVPN\n");
108  }
109 
110  /* Which callbacks to intercept. */
111  ret->type_mask =
114 
115  /* we don't need a plug-in context in this example, but OpenVPN expects "something" */
116  ret->handle = calloc(1, 1);
117 
118  /* Hook into the exported functions from OpenVPN */
119  ovpn_log = args->callbacks->plugin_log;
121  ovpn_base64_encode = args->callbacks->plugin_base64_encode;
122  ovpn_base64_decode = args->callbacks->plugin_base64_decode;
123 
124  /* Print some version information about the OpenVPN process using this plug-in */
125  ovpn_log(PLOG_NOTE, PLUGIN_NAME, "OpenVPN %s (Major: %i, Minor: %i, Patch: %s)\n",
126  args->ovpn_version, args->ovpn_version_major,
128 
130 }
131 
132 
153 OPENVPN_EXPORT int
154 openvpn_plugin_func_v1(openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
155 {
156  if (type != OPENVPN_PLUGIN_TLS_VERIFY
158  {
159  ovpn_log(PLOG_ERR, PLUGIN_NAME, "Unsupported plug-in hook call attempted");
161  }
162 
163  /* get username/password from envp string array */
164  const char *clcert_cn = get_env("X509_0_CN", envp);
165  if (!clcert_cn)
166  {
167  /* Ignore certificate checks not being a client certificate */
169  }
170 
171  /* test the BASE64 encode function */
172  char *buf = NULL;
173  int r = ovpn_base64_encode(clcert_cn, strlen(clcert_cn), &buf);
174  ovpn_log(PLOG_NOTE, PLUGIN_NAME, "BASE64 encoded '%s' (return value %i): '%s'",
175  clcert_cn, r, buf);
176 
177  /* test the BASE64 decode function */
178  char buf2[256] = {0};
179  r = ovpn_base64_decode(buf, &buf2, 255);
180  ovpn_log(PLOG_NOTE, PLUGIN_NAME, "BASE64 decoded '%s' (return value %i): '%s'",
181  buf, r, buf2);
182 
183  /* Verify the result, and free the buffer allocated by ovpn_base64_encode() */
184  r = strcmp(clcert_cn, buf2);
185  free(buf);
186 
188 }
189 
190 
198 OPENVPN_EXPORT void
200 {
201  struct plugin_context *context = (struct plugin_context *) handle;
202  free(context);
203 }
Arguments used to transport variables to the plug-in.
Contains all state information for one tunnel.
Definition: openvpn.h:500
openvpn_plugin_handle_t * handle
const unsigned int ovpn_version_minor
#define PLUGIN_NAME
Definition: base64.c:31
#define OPENVPN_EXPORT
#define OPENVPN_PLUGIN_FUNC_SUCCESS
plugin_vlog_t ovpn_vlog
Pointer to the OpenVPN vlog function.
Definition: base64.c:35
static const char * get_env(const char *name, const char *envp[])
Search the environment pointer for a specific env var name.
Definition: base64.c:54
OPENVPN_EXPORT void openvpn_plugin_close_v1(openvpn_plugin_handle_t handle)
This cleans up the last part of the plug-in, allows it to shut down cleanly and release the plug-in g...
Definition: base64.c:199
#define OPENVPN_PLUGIN_TLS_VERIFY
#define OPENVPN_PLUGIN_FUNC_ERROR
plugin_log_t ovpn_log
Pointer to the OpenVPN log function.
Definition: base64.c:34
const unsigned int ovpn_version_major
void(* plugin_log_t)(openvpn_plugin_log_flags_t flags, const char *plugin_name, const char *format,...) _ovpn_chk_fmt(3
void * openvpn_plugin_handle_t
plugin_base64_decode_t ovpn_base64_decode
Pointer to the openvpn_base64_decode () function.
Definition: base64.c:37
OPENVPN_EXPORT int openvpn_plugin_func_v1(openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
This function is called by OpenVPN each time the OpenVPN reaches a point where plug-in calls should h...
Definition: base64.c:154
OPENVPN_EXPORT int openvpn_plugin_open_v3(const int v3structver, struct openvpn_plugin_args_open_in const *args, struct openvpn_plugin_args_open_return *ret)
This function is called when OpenVPN loads the plug-in.
Definition: base64.c:99
struct openvpn_plugin_callbacks * callbacks
#define free
Definition: cmocka.c:1850
#define OPENVPN_PLUGINv3_STRUCTVER
Defines version of the v3 plugin argument structs.
Definition: argv.h:35
Arguments used to transport variables from the plug-in back to the OpenVPN process.
plugin_base64_encode_t ovpn_base64_encode
Pointer to the openvpn_base64_encode () function.
Definition: base64.c:36
#define OPENVPN_PLUGIN_CLIENT_CONNECT_V2
#define OPENVPN_PLUGIN_MASK(x)
const char *const ovpn_version_patch
void(*) typedef void(* plugin_vlog_t)(openvpn_plugin_log_flags_t flags, const char *plugin_name, const char *format, va_list arglist) _ovpn_chk_fmt(3