Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Macros | Functions | Variables
func_aes.c File Reference

AES encryption/decryption dialplan functions. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/crypto.h"
Include dependency graph for func_aes.c:

Go to the source code of this file.

Macros

#define AES_BLOCK_SIZE   16
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static int aes_helper (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "AES dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_crypto", }
 
static struct ast_custom_function aes_decrypt_function
 
static struct ast_custom_function aes_encrypt_function
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

AES encryption/decryption dialplan functions.

Author
David Vossel dvoss.nosp@m.el@d.nosp@m.igium.nosp@m..com

Definition in file func_aes.c.

Macro Definition Documentation

◆ AES_BLOCK_SIZE

#define AES_BLOCK_SIZE   16

Definition at line 38 of file func_aes.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 191 of file func_aes.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 191 of file func_aes.c.

◆ aes_helper()

static int aes_helper ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 92 of file func_aes.c.

94{
95 unsigned char curblock[AES_BLOCK_SIZE] = { 0, };
96 char *tmp;
97 char *tmpP;
98 int data_len, encrypt;
99 ast_aes_encrypt_key ecx; /* AES 128 Encryption context */
101
103 AST_APP_ARG(key);
104 AST_APP_ARG(data);
105 );
106
108
109 if (ast_strlen_zero(args.data) || ast_strlen_zero(args.key)) {
110 ast_log(LOG_WARNING, "Syntax: %s(<key>,<data>) - missing argument!\n", cmd);
111 return -1;
112 }
113
114 if (strlen(args.key) != AES_BLOCK_SIZE) { /* key must be of 16 characters in length, 128 bits */
115 ast_log(LOG_WARNING, "Syntax: %s(<key>,<data>) - <key> parameter must be exactly 16 characters!\n", cmd);
116 return -1;
117 }
118
119 ast_aes_set_encrypt_key((unsigned char *) args.key, &ecx); /* encryption: plaintext -> encryptedtext -> base64 */
120 ast_aes_set_decrypt_key((unsigned char *) args.key, &dcx); /* decryption: base64 -> encryptedtext -> plaintext */
121 tmp = ast_calloc(1, len); /* requires a tmp buffer for the base64 decode */
122 if (!tmp) {
123 ast_log(LOG_ERROR, "Unable to allocate memory for data\n");
124 return -1;
125 }
126 tmpP = tmp;
127 encrypt = strcmp("AES_DECRYPT", cmd); /* -1 if encrypting, 0 if decrypting */
128
129 if (encrypt) { /* if decrypting first decode src to base64 */
130 ast_copy_string(tmp, args.data, len);
131 data_len = strlen(tmp);
132 } else {
133 data_len = ast_base64decode((unsigned char *) tmp, args.data, len);
134 }
135
136 if (data_len >= len) { /* make sure to not go over buffer len */
137 ast_log(LOG_WARNING, "Syntax: %s(<keys>,<data>) - <data> exceeds buffer length. Result may be truncated!\n", cmd);
138 data_len = len - 1;
139 }
140
141 while (data_len > 0) {
142 memset(curblock, 0, AES_BLOCK_SIZE);
143 memcpy(curblock, tmpP, (data_len < AES_BLOCK_SIZE) ? data_len : AES_BLOCK_SIZE);
144 if (encrypt) {
145 ast_aes_encrypt(curblock, (unsigned char *) tmpP, &ecx);
146 } else {
147 ast_aes_decrypt(curblock, (unsigned char *) tmpP, &dcx);
148 }
149 tmpP += AES_BLOCK_SIZE;
150 data_len -= AES_BLOCK_SIZE;
151 }
152
153 if (encrypt) { /* if encrypting encode result to base64 */
154 ast_base64encode(buf, (unsigned char *) tmp, tmpP - tmp, len);
155 } else {
156 memcpy(buf, tmp, len);
157 }
158 ast_free(tmp);
159
160 return 0;
161}
#define ast_free(a)
Definition astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ast_log
Definition astobj2.c:42
int AST_OPTIONAL_API_NAME() ast_aes_set_encrypt_key(const unsigned char *key, ast_aes_encrypt_key *ctx)
Set an encryption key.
Definition res_crypto.c:700
int AST_OPTIONAL_API_NAME() ast_aes_decrypt(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *key)
AES decrypt data.
Definition res_crypto.c:790
int AST_OPTIONAL_API_NAME() ast_aes_set_decrypt_key(const unsigned char *key, ast_aes_decrypt_key *ctx)
Set a decryption key.
Definition res_crypto.c:709
int AST_OPTIONAL_API_NAME() ast_aes_encrypt(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *key)
AES encrypt data.
Definition res_crypto.c:749
char buf[BUFSIZE]
Definition eagi_proxy.c:66
#define AES_BLOCK_SIZE
Definition func_aes.c:38
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
#define LOG_ERROR
#define LOG_WARNING
static struct @519 args
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
int ast_base64decode(unsigned char *dst, const char *src, int max)
Decode data from base64.
Definition utils.c:296
int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max)
Encode data in base64.
Definition utils.c:406

References AES_BLOCK_SIZE, args, ast_aes_decrypt(), ast_aes_encrypt(), ast_aes_set_decrypt_key(), ast_aes_set_encrypt_key(), AST_APP_ARG, ast_base64decode(), ast_base64encode(), ast_calloc, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_free, ast_log, AST_STANDARD_APP_ARGS, ast_strlen_zero(), buf, len(), LOG_ERROR, and LOG_WARNING.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 191 of file func_aes.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 179 of file func_aes.c.

180{
184}
static struct ast_custom_function aes_decrypt_function
Definition func_aes.c:168
static struct ast_custom_function aes_encrypt_function
Definition func_aes.c:163
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
#define ast_custom_function_register(acf)
Register a custom function.
Definition pbx.h:1562

References aes_decrypt_function, aes_encrypt_function, ast_custom_function_register, AST_MODULE_LOAD_DECLINE, and AST_MODULE_LOAD_SUCCESS.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 173 of file func_aes.c.

174{
177}
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.

References aes_decrypt_function, aes_encrypt_function, and ast_custom_function_unregister().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "AES dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_crypto", }
static

Definition at line 191 of file func_aes.c.

◆ aes_decrypt_function

struct ast_custom_function aes_decrypt_function
static
Initial value:
= {
.name = "AES_DECRYPT",
.read = aes_helper,
}
static int aes_helper(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_aes.c:92

Definition at line 168 of file func_aes.c.

168 {
169 .name = "AES_DECRYPT",
170 .read = aes_helper,
171};

Referenced by load_module(), and unload_module().

◆ aes_encrypt_function

struct ast_custom_function aes_encrypt_function
static
Initial value:
= {
.name = "AES_ENCRYPT",
.read = aes_helper,
}

Definition at line 163 of file func_aes.c.

163 {
164 .name = "AES_ENCRYPT",
165 .read = aes_helper,
166};

Referenced by load_module(), and unload_module().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 191 of file func_aes.c.