Review Board 1.7.16


added AES_ENCRYPT and AES_DECRYPT dialplan functions

Review Request #128 - Created Jan. 22, 2009 and submitted

David Vossel
trunk
0014301
Reviewers
asterisk-dev
mmichelson, russell
Asterisk
Allows data to be encrypted and decrypted using AES in the dialplan.  

 

Diff revision 1

This is not the most recent revision of the diff. The latest diff is revision 5. See what's changed.

1 2 3 4 5
1 2 3 4 5

  1. /trunk/funcs/func_aes.c: Loading...
/trunk/funcs/func_aes.c
New File

    
   
1
/*

    
   
2
 * Asterisk -- An open source telephony toolkit.

    
   
3
 *

    
   
4
 * Copyright (C) 1999-2009, Digium, Inc.

    
   
5
 *

    
   
6
 * See http://www.asterisk.org for more information about

    
   
7
 * the Asterisk project. Please do not directly contact

    
   
8
 * any of the maintainers of this project for assistance;

    
   
9
 * the project provides a web site, mailing lists and IRC

    
   
10
 * channels for your use.

    
   
11
 *

    
   
12
 * This program is free software, distributed under the terms of

    
   
13
 * the GNU General Public License Version 2. See the LICENSE file

    
   
14
 * at the top of the source tree.

    
   
15
 */

    
   
16

   

    
   
17
/*! \file

    
   
18
 *

    
   
19
 * \brief AES encryption/decryption dialplan functions

    
   
20
 * 

    
   
21
 * \ingroup functions

    
   
22
 */

    
   
23

   

    
   
24

   

    
   
25
#include "asterisk.h"

    
   
26

   

    
   
27
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 170151 $")

    
   
28

   

    
   
29
#include "asterisk/module.h"

    
   
30
#include "asterisk/pbx.h"

    
   
31
#include "asterisk/app.h"

    
   
32
#include "asterisk/aes.h"

    
   
33

   

    
   
34

   

    
   
35
static int aes_encrypt_read(struct ast_channel *chan, const char *cmd, char *data,

    
   
36
	       char *buf, size_t len)

    
   
37
{

    
   
38
	

    
   
39
	unsigned char curblock[16];

    
   
40
	char *src;

    
   
41
	char *dst;

    
   
42
	int x, data_len; 

    
   
43
	ast_aes_encrypt_key ecx;                       /*  AES 128 Encryption context */

    
   
44
	

    
   
45
	AST_DECLARE_APP_ARGS(args,  

    
   
46
		AST_APP_ARG(key);

    
   
47
		AST_APP_ARG(data);

    
   
48
	);

    
   
49
	

    
   
50
	AST_STANDARD_APP_ARGS(args, data);

    
   
51
	

    
   
52
	if (ast_strlen_zero(args.data) || ast_strlen_zero(args.key)) {

    
   
53
		ast_log(LOG_WARNING, "Syntax: AES_ENCRYPT(<key>, <data>) - missing argument!\n");

    
   
54
		return -1;

    
   
55
	}

    
   
56
	

    
   
57
	if (strlen(args.key) != 16 ) {         /* key must be of 16 characters in length, 128 bits */

    
   
58
		ast_log(LOG_WARNING, "Syntax: AES_ENCRYPT(<key>, <data>) - <key> parameter must be exactly 16 characters!\n");

    
   
59
		return -1;

    
   
60
	}

    
   
61
	

    
   
62
	ast_aes_encrypt_key(args.key, &ecx);

    
   
63
	

    
   
64
	dst = buf;

    
   
65
	src = args.data; 

    
   
66
	data_len = strlen(args.data);

    
   
67
	memset(curblock, '\0', sizeof(curblock));

    
   
68
	

    
   
69
	if (data_len >= len) {                           /* make sure to not go over buffer len */

    
   
70
		data_len = (len-1);

    
   
71
	}

    
   
72
	

    
   
73
	while (data_len > 0) {

    
   
74
		for (x = 0; x < 16; x++)

    
   
75
			curblock[x] = src[x];

    
   
76
		ast_aes_encrypt(curblock, dst, &ecx);

    
   
77
		memcpy(curblock, dst, sizeof(curblock));

    
   
78
		dst += 16;

    
   
79
		src += 16;

    
   
80
		data_len -= 16;

    
   
81
	}

    
   
82
	

    
   
83
	return 0;

    
   
84
}

    
   
85
static int aes_decrypt_read(struct ast_channel *chan, const char *cmd, char *data,

    
   
86
	char *buf, size_t len)

    
   
87
{

    
   
88

   

    
   
89
	unsigned char curblock[16];

    
   
90
	char *src;

    
   
91
	char *dst;

    
   
92
	int x, data_len; 	

    
   
93
	ast_aes_decrypt_key dcx;                       /*!< AES 128 Encryption context */

    
   
94
	

    
   
95
	AST_DECLARE_APP_ARGS(args,  

    
   
96
			AST_APP_ARG(key);

    
   
97
			AST_APP_ARG(data);

    
   
98
	);

    
   
99
	

    
   
100
	AST_STANDARD_APP_ARGS(args, data);

    
   
101
	

    
   
102
	if (ast_strlen_zero(args.data) || ast_strlen_zero(args.key)) {

    
   
103
		ast_log(LOG_WARNING, "Syntax: AES_DECRYPT(<key>, <data>) - missing argument!\n");

    
   
104
		return -1;

    
   
105
	}

    
   
106

   

    
   
107
	if (strlen(args.key) != 16 ) {         /* key must be of 16 characters in length, 128 bits */

    
   
108
		ast_log(LOG_WARNING, "Syntax: AES_DECRYPT(<key>, <data>) - <key> parameter must be exactly 16 characters!\n");

    
   
109
		return -1;

    
   
110
	}

    
   
111
	

    
   
112
	ast_aes_decrypt_key(args.key, &dcx);

    
   
113
	

    
   
114
	dst = buf;

    
   
115
	src = args.data; 

    
   
116
	data_len = strlen(args.data);

    
   
117
	memset(curblock, '\0', sizeof(curblock));

    
   
118
	

    
   
119
	if (data_len >= len) {                       /* make sure to not go over buffer len */

    
   
120
		data_len = (len-1);

    
   
121
	}

    
   
122
	

    
   
123
	while (data_len > 0) {

    
   
124
		for (x = 0; x < 16; x++)

    
   
125
			curblock[x] = src[x];

    
   
126
		ast_aes_decrypt(curblock, dst, &dcx);

    
   
127
		memcpy(curblock, dst, sizeof(curblock));

    
   
128
		dst += 16;

    
   
129
		src += 16;

    
   
130
		data_len -= 16;

    
   
131
	}

    
   
132
	

    
   
133
	return 0;

    
   
134
}

    
   
135

   

    
   
136
static struct ast_custom_function aes_encrypt_function = {

    
   
137
	.name = "AES_ENCRYPT",

    
   
138
	.read = aes_encrypt_read,

    
   
139
};

    
   
140

   

    
   
141
static struct ast_custom_function aes_decrypt_function = {

    
   
142
	.name = "AES_DECRYPT",

    
   
143
	.read = aes_decrypt_read,

    
   
144
};

    
   
145

   

    
   
146

   

    
   
147
static int unload_module(void)

    
   
148
{

    
   
149
	int res = ast_custom_function_unregister(&aes_decrypt_function);

    
   
150
	return res |= ast_custom_function_unregister(&aes_encrypt_function);

    
   
151
}

    
   
152

   

    
   
153
static int load_module(void)

    
   
154
{

    
   
155
	int res = ast_custom_function_register(&aes_decrypt_function);

    
   
156
	return res |= ast_custom_function_register(&aes_encrypt_function);

    
   
157
}

    
   
158

   

    
   
159
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AES dialplan functions");
  1. /trunk/funcs/func_aes.c: Loading...

https://reviewboard.asterisk.org/ runs on a server provided by Digium, Inc. and uses bandwidth donated to the open source Asterisk community by API Digital Communications in Huntsville, AL USA.
Please report problems with this site to asteriskteam@digium.com.