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-2024 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 */
42
57static const char *
58get_env(const char *name, const char *envp[])
59{
60 if (envp)
61 {
62 int i;
63 const int namelen = strlen(name);
64 for (i = 0; envp[i]; ++i)
65 {
66 if (!strncmp(envp[i], name, namelen))
67 {
68 const char *cp = envp[i] + namelen;
69 if (*cp == '=')
70 {
71 return cp + 1;
72 }
73 }
74 }
75 }
76 return NULL;
77}
78
79
103openvpn_plugin_open_v3(const int v3structver,
104 struct openvpn_plugin_args_open_in const *args,
106{
107 /* Check that we are API compatible */
108 if (v3structver != OPENVPN_PLUGINv3_STRUCTVER)
109 {
110 printf("base64.c: ** ERROR ** Incompatible plug-in interface between this plug-in and OpenVPN\n");
112 }
113
114 /* Which callbacks to intercept. */
115 ret->type_mask =
118
119 /* we don't need a plug-in context in this example, but OpenVPN expects "something" */
120 ret->handle = calloc(1, 1);
121
122 /* Hook into the exported functions from OpenVPN */
127
128 /* Print some version information about the OpenVPN process using this plug-in */
129 ovpn_log(PLOG_NOTE, PLUGIN_NAME, "OpenVPN %s (Major: %i, Minor: %i, Patch: %s)\n",
130 args->ovpn_version, args->ovpn_version_major,
132
134}
135
136
159openvpn_plugin_func_v1(openvpn_plugin_handle_t handle, const int type, const char *argv[], const char *envp[])
160{
161 if (type != OPENVPN_PLUGIN_TLS_VERIFY
163 {
164 ovpn_log(PLOG_ERR, PLUGIN_NAME, "Unsupported plug-in hook call attempted");
166 }
167
168 /* get username/password from envp string array */
169 const char *clcert_cn = get_env("X509_0_CN", envp);
170 if (!clcert_cn)
171 {
172 /* Ignore certificate checks not being a client certificate */
174 }
175
176 /* test the BASE64 encode function */
177 char *buf = NULL;
178 int r = ovpn_base64_encode(clcert_cn, strlen(clcert_cn), &buf);
179 ovpn_log(PLOG_NOTE, PLUGIN_NAME, "BASE64 encoded '%s' (return value %i): '%s'",
180 clcert_cn, r, buf);
181
182 /* test the BASE64 decode function */
183 char buf2[256] = {0};
184 r = ovpn_base64_decode(buf, &buf2, 255);
185 ovpn_log(PLOG_NOTE, PLUGIN_NAME, "BASE64 decoded '%s' (return value %i): '%s'",
186 buf, r, buf2);
187
188 /* Verify the result, and free the buffer allocated by ovpn_base64_encode() */
189 r = strcmp(clcert_cn, buf2);
190 free(buf);
191
193}
194
195
205{
206 struct plugin_context *context = (struct plugin_context *) handle;
207 free(context);
208}
@ PLOG_NOTE
@ PLOG_ERR
#define OPENVPN_PLUGIN_CLIENT_CONNECT_V2
void * openvpn_plugin_handle_t
#define OPENVPN_PLUGIN_MASK(x)
int(* plugin_base64_encode_t)(const void *data, int size, char **str)
Export of openvpn_base64_encode() to be used inside plug-ins.
#define OPENVPN_PLUGIN_TLS_VERIFY
void(* plugin_log_t)(openvpn_plugin_log_flags_t flags, const char *plugin_name, const char *format,...) _ovpn_chk_fmt(3
#define OPENVPN_PLUGIN_FUNC_SUCCESS
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
#define OPENVPN_EXPORT
#define OPENVPN_PLUGINv3_STRUCTVER
Defines version of the v3 plugin argument structs.
#define OPENVPN_PLUGIN_FUNC_ERROR
int(* plugin_base64_decode_t)(const char *str, void *data, int size)
Export of openvpn_base64_decode() to be used inside plug-ins.
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:159
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:204
#define PLUGIN_NAME
Definition base64.c:31
plugin_log_t ovpn_log
Pointer to the OpenVPN log function.
Definition base64.c:35
plugin_base64_decode_t ovpn_base64_decode
Pointer to the openvpn_base64_decode () function.
Definition base64.c:41
plugin_base64_encode_t ovpn_base64_encode
Pointer to the openvpn_base64_encode () function.
Definition base64.c:39
plugin_vlog_t ovpn_vlog
Pointer to the OpenVPN vlog function.
Definition base64.c:37
static const char * get_env(const char *name, const char *envp[])
Search the environment pointer for a specific env var name.
Definition base64.c:58
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:103
Definition argv.h:35
Contains all state information for one tunnel.
Definition openvpn.h:474
Arguments used to transport variables to the plug-in.
const char *const ovpn_version_patch
const unsigned int ovpn_version_major
const unsigned int ovpn_version_minor
struct openvpn_plugin_callbacks * callbacks
Arguments used to transport variables from the plug-in back to the OpenVPN process.
openvpn_plugin_handle_t handle
plugin_base64_encode_t plugin_base64_encode
plugin_base64_decode_t plugin_base64_decode