1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker * aes_icm_nss.c
3*90e502c7SAndroid Build Coastguard Worker *
4*90e502c7SAndroid Build Coastguard Worker * AES Integer Counter Mode
5*90e502c7SAndroid Build Coastguard Worker *
6*90e502c7SAndroid Build Coastguard Worker * Richard L. Barnes
7*90e502c7SAndroid Build Coastguard Worker * Cisco Systems, Inc.
8*90e502c7SAndroid Build Coastguard Worker */
9*90e502c7SAndroid Build Coastguard Worker
10*90e502c7SAndroid Build Coastguard Worker /*
11*90e502c7SAndroid Build Coastguard Worker *
12*90e502c7SAndroid Build Coastguard Worker * Copyright (c) 2013-2017, Cisco Systems, Inc.
13*90e502c7SAndroid Build Coastguard Worker * All rights reserved.
14*90e502c7SAndroid Build Coastguard Worker *
15*90e502c7SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
16*90e502c7SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
17*90e502c7SAndroid Build Coastguard Worker * are met:
18*90e502c7SAndroid Build Coastguard Worker *
19*90e502c7SAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright
20*90e502c7SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
21*90e502c7SAndroid Build Coastguard Worker *
22*90e502c7SAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above
23*90e502c7SAndroid Build Coastguard Worker * copyright notice, this list of conditions and the following
24*90e502c7SAndroid Build Coastguard Worker * disclaimer in the documentation and/or other materials provided
25*90e502c7SAndroid Build Coastguard Worker * with the distribution.
26*90e502c7SAndroid Build Coastguard Worker *
27*90e502c7SAndroid Build Coastguard Worker * Neither the name of the Cisco Systems, Inc. nor the names of its
28*90e502c7SAndroid Build Coastguard Worker * contributors may be used to endorse or promote products derived
29*90e502c7SAndroid Build Coastguard Worker * from this software without specific prior written permission.
30*90e502c7SAndroid Build Coastguard Worker *
31*90e502c7SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*90e502c7SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*90e502c7SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34*90e502c7SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35*90e502c7SAndroid Build Coastguard Worker * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36*90e502c7SAndroid Build Coastguard Worker * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37*90e502c7SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38*90e502c7SAndroid Build Coastguard Worker * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*90e502c7SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*90e502c7SAndroid Build Coastguard Worker * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41*90e502c7SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42*90e502c7SAndroid Build Coastguard Worker * OF THE POSSIBILITY OF SUCH DAMAGE.
43*90e502c7SAndroid Build Coastguard Worker *
44*90e502c7SAndroid Build Coastguard Worker */
45*90e502c7SAndroid Build Coastguard Worker
46*90e502c7SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
47*90e502c7SAndroid Build Coastguard Worker #include <config.h>
48*90e502c7SAndroid Build Coastguard Worker #endif
49*90e502c7SAndroid Build Coastguard Worker
50*90e502c7SAndroid Build Coastguard Worker #include "aes_icm_ext.h"
51*90e502c7SAndroid Build Coastguard Worker #include "crypto_types.h"
52*90e502c7SAndroid Build Coastguard Worker #include "err.h" /* for srtp_debug */
53*90e502c7SAndroid Build Coastguard Worker #include "alloc.h"
54*90e502c7SAndroid Build Coastguard Worker #include "cipher_types.h"
55*90e502c7SAndroid Build Coastguard Worker
56*90e502c7SAndroid Build Coastguard Worker srtp_debug_module_t srtp_mod_aes_icm = {
57*90e502c7SAndroid Build Coastguard Worker 0, /* debugging is off by default */
58*90e502c7SAndroid Build Coastguard Worker "aes icm nss" /* printable module name */
59*90e502c7SAndroid Build Coastguard Worker };
60*90e502c7SAndroid Build Coastguard Worker
61*90e502c7SAndroid Build Coastguard Worker /*
62*90e502c7SAndroid Build Coastguard Worker * integer counter mode works as follows:
63*90e502c7SAndroid Build Coastguard Worker *
64*90e502c7SAndroid Build Coastguard Worker * 16 bits
65*90e502c7SAndroid Build Coastguard Worker * <----->
66*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+
67*90e502c7SAndroid Build Coastguard Worker * | nonce | packet index | ctr |---+
68*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+ |
69*90e502c7SAndroid Build Coastguard Worker * |
70*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+ v
71*90e502c7SAndroid Build Coastguard Worker * | salt |000000|->(+)
72*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+ |
73*90e502c7SAndroid Build Coastguard Worker * |
74*90e502c7SAndroid Build Coastguard Worker * +---------+
75*90e502c7SAndroid Build Coastguard Worker * | encrypt |
76*90e502c7SAndroid Build Coastguard Worker * +---------+
77*90e502c7SAndroid Build Coastguard Worker * |
78*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+ |
79*90e502c7SAndroid Build Coastguard Worker * | keystream block |<--+
80*90e502c7SAndroid Build Coastguard Worker * +------+------+------+------+------+------+------+------+
81*90e502c7SAndroid Build Coastguard Worker *
82*90e502c7SAndroid Build Coastguard Worker * All fields are big-endian
83*90e502c7SAndroid Build Coastguard Worker *
84*90e502c7SAndroid Build Coastguard Worker * ctr is the block counter, which increments from zero for
85*90e502c7SAndroid Build Coastguard Worker * each packet (16 bits wide)
86*90e502c7SAndroid Build Coastguard Worker *
87*90e502c7SAndroid Build Coastguard Worker * packet index is distinct for each packet (48 bits wide)
88*90e502c7SAndroid Build Coastguard Worker *
89*90e502c7SAndroid Build Coastguard Worker * nonce can be distinct across many uses of the same key, or
90*90e502c7SAndroid Build Coastguard Worker * can be a fixed value per key, or can be per-packet randomness
91*90e502c7SAndroid Build Coastguard Worker * (64 bits)
92*90e502c7SAndroid Build Coastguard Worker *
93*90e502c7SAndroid Build Coastguard Worker */
94*90e502c7SAndroid Build Coastguard Worker
95*90e502c7SAndroid Build Coastguard Worker /*
96*90e502c7SAndroid Build Coastguard Worker * This function allocates a new instance of this crypto engine.
97*90e502c7SAndroid Build Coastguard Worker * The key_len parameter should be one of 30, 38, or 46 for
98*90e502c7SAndroid Build Coastguard Worker * AES-128, AES-192, and AES-256 respectively. Note, this key_len
99*90e502c7SAndroid Build Coastguard Worker * value is inflated, as it also accounts for the 112 bit salt
100*90e502c7SAndroid Build Coastguard Worker * value. The tlen argument is for the AEAD tag length, which
101*90e502c7SAndroid Build Coastguard Worker * isn't used in counter mode.
102*90e502c7SAndroid Build Coastguard Worker */
srtp_aes_icm_nss_alloc(srtp_cipher_t ** c,int key_len,int tlen)103*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t srtp_aes_icm_nss_alloc(srtp_cipher_t **c,
104*90e502c7SAndroid Build Coastguard Worker int key_len,
105*90e502c7SAndroid Build Coastguard Worker int tlen)
106*90e502c7SAndroid Build Coastguard Worker {
107*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_ctx_t *icm;
108*90e502c7SAndroid Build Coastguard Worker NSSInitContext *nss;
109*90e502c7SAndroid Build Coastguard Worker
110*90e502c7SAndroid Build Coastguard Worker debug_print(srtp_mod_aes_icm, "allocating cipher with key length %d",
111*90e502c7SAndroid Build Coastguard Worker key_len);
112*90e502c7SAndroid Build Coastguard Worker
113*90e502c7SAndroid Build Coastguard Worker /*
114*90e502c7SAndroid Build Coastguard Worker * Verify the key_len is valid for one of: AES-128/192/256
115*90e502c7SAndroid Build Coastguard Worker */
116*90e502c7SAndroid Build Coastguard Worker if (key_len != SRTP_AES_ICM_128_KEY_LEN_WSALT &&
117*90e502c7SAndroid Build Coastguard Worker key_len != SRTP_AES_ICM_192_KEY_LEN_WSALT &&
118*90e502c7SAndroid Build Coastguard Worker key_len != SRTP_AES_ICM_256_KEY_LEN_WSALT) {
119*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_bad_param;
120*90e502c7SAndroid Build Coastguard Worker }
121*90e502c7SAndroid Build Coastguard Worker
122*90e502c7SAndroid Build Coastguard Worker /* Initialize NSS equiv of NSS_NoDB_Init(NULL) */
123*90e502c7SAndroid Build Coastguard Worker nss = NSS_InitContext("", "", "", "", NULL,
124*90e502c7SAndroid Build Coastguard Worker NSS_INIT_READONLY | NSS_INIT_NOCERTDB |
125*90e502c7SAndroid Build Coastguard Worker NSS_INIT_NOMODDB | NSS_INIT_FORCEOPEN |
126*90e502c7SAndroid Build Coastguard Worker NSS_INIT_OPTIMIZESPACE);
127*90e502c7SAndroid Build Coastguard Worker if (!nss) {
128*90e502c7SAndroid Build Coastguard Worker return (srtp_err_status_cipher_fail);
129*90e502c7SAndroid Build Coastguard Worker }
130*90e502c7SAndroid Build Coastguard Worker
131*90e502c7SAndroid Build Coastguard Worker /* allocate memory a cipher of type aes_icm */
132*90e502c7SAndroid Build Coastguard Worker *c = (srtp_cipher_t *)srtp_crypto_alloc(sizeof(srtp_cipher_t));
133*90e502c7SAndroid Build Coastguard Worker if (*c == NULL) {
134*90e502c7SAndroid Build Coastguard Worker NSS_ShutdownContext(nss);
135*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_alloc_fail;
136*90e502c7SAndroid Build Coastguard Worker }
137*90e502c7SAndroid Build Coastguard Worker
138*90e502c7SAndroid Build Coastguard Worker icm = (srtp_aes_icm_ctx_t *)srtp_crypto_alloc(sizeof(srtp_aes_icm_ctx_t));
139*90e502c7SAndroid Build Coastguard Worker if (icm == NULL) {
140*90e502c7SAndroid Build Coastguard Worker NSS_ShutdownContext(nss);
141*90e502c7SAndroid Build Coastguard Worker srtp_crypto_free(*c);
142*90e502c7SAndroid Build Coastguard Worker *c = NULL;
143*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_alloc_fail;
144*90e502c7SAndroid Build Coastguard Worker }
145*90e502c7SAndroid Build Coastguard Worker
146*90e502c7SAndroid Build Coastguard Worker icm->key = NULL;
147*90e502c7SAndroid Build Coastguard Worker icm->ctx = NULL;
148*90e502c7SAndroid Build Coastguard Worker icm->nss = nss;
149*90e502c7SAndroid Build Coastguard Worker
150*90e502c7SAndroid Build Coastguard Worker /* set pointers */
151*90e502c7SAndroid Build Coastguard Worker (*c)->state = icm;
152*90e502c7SAndroid Build Coastguard Worker
153*90e502c7SAndroid Build Coastguard Worker /* setup cipher parameters */
154*90e502c7SAndroid Build Coastguard Worker switch (key_len) {
155*90e502c7SAndroid Build Coastguard Worker case SRTP_AES_ICM_128_KEY_LEN_WSALT:
156*90e502c7SAndroid Build Coastguard Worker (*c)->algorithm = SRTP_AES_ICM_128;
157*90e502c7SAndroid Build Coastguard Worker (*c)->type = &srtp_aes_icm_128;
158*90e502c7SAndroid Build Coastguard Worker icm->key_size = SRTP_AES_128_KEY_LEN;
159*90e502c7SAndroid Build Coastguard Worker break;
160*90e502c7SAndroid Build Coastguard Worker case SRTP_AES_ICM_192_KEY_LEN_WSALT:
161*90e502c7SAndroid Build Coastguard Worker (*c)->algorithm = SRTP_AES_ICM_192;
162*90e502c7SAndroid Build Coastguard Worker (*c)->type = &srtp_aes_icm_192;
163*90e502c7SAndroid Build Coastguard Worker icm->key_size = SRTP_AES_192_KEY_LEN;
164*90e502c7SAndroid Build Coastguard Worker break;
165*90e502c7SAndroid Build Coastguard Worker case SRTP_AES_ICM_256_KEY_LEN_WSALT:
166*90e502c7SAndroid Build Coastguard Worker (*c)->algorithm = SRTP_AES_ICM_256;
167*90e502c7SAndroid Build Coastguard Worker (*c)->type = &srtp_aes_icm_256;
168*90e502c7SAndroid Build Coastguard Worker icm->key_size = SRTP_AES_256_KEY_LEN;
169*90e502c7SAndroid Build Coastguard Worker break;
170*90e502c7SAndroid Build Coastguard Worker }
171*90e502c7SAndroid Build Coastguard Worker
172*90e502c7SAndroid Build Coastguard Worker /* set key size */
173*90e502c7SAndroid Build Coastguard Worker (*c)->key_len = key_len;
174*90e502c7SAndroid Build Coastguard Worker
175*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_ok;
176*90e502c7SAndroid Build Coastguard Worker }
177*90e502c7SAndroid Build Coastguard Worker
178*90e502c7SAndroid Build Coastguard Worker /*
179*90e502c7SAndroid Build Coastguard Worker * This function deallocates an instance of this engine
180*90e502c7SAndroid Build Coastguard Worker */
srtp_aes_icm_nss_dealloc(srtp_cipher_t * c)181*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t srtp_aes_icm_nss_dealloc(srtp_cipher_t *c)
182*90e502c7SAndroid Build Coastguard Worker {
183*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_ctx_t *ctx;
184*90e502c7SAndroid Build Coastguard Worker
185*90e502c7SAndroid Build Coastguard Worker ctx = (srtp_aes_icm_ctx_t *)c->state;
186*90e502c7SAndroid Build Coastguard Worker if (ctx) {
187*90e502c7SAndroid Build Coastguard Worker /* free any PK11 values that have been created */
188*90e502c7SAndroid Build Coastguard Worker if (ctx->key) {
189*90e502c7SAndroid Build Coastguard Worker PK11_FreeSymKey(ctx->key);
190*90e502c7SAndroid Build Coastguard Worker ctx->key = NULL;
191*90e502c7SAndroid Build Coastguard Worker }
192*90e502c7SAndroid Build Coastguard Worker
193*90e502c7SAndroid Build Coastguard Worker if (ctx->ctx) {
194*90e502c7SAndroid Build Coastguard Worker PK11_DestroyContext(ctx->ctx, PR_TRUE);
195*90e502c7SAndroid Build Coastguard Worker ctx->ctx = NULL;
196*90e502c7SAndroid Build Coastguard Worker }
197*90e502c7SAndroid Build Coastguard Worker
198*90e502c7SAndroid Build Coastguard Worker if (ctx->nss) {
199*90e502c7SAndroid Build Coastguard Worker NSS_ShutdownContext(ctx->nss);
200*90e502c7SAndroid Build Coastguard Worker ctx->nss = NULL;
201*90e502c7SAndroid Build Coastguard Worker }
202*90e502c7SAndroid Build Coastguard Worker
203*90e502c7SAndroid Build Coastguard Worker /* zeroize everything */
204*90e502c7SAndroid Build Coastguard Worker octet_string_set_to_zero(ctx, sizeof(srtp_aes_icm_ctx_t));
205*90e502c7SAndroid Build Coastguard Worker srtp_crypto_free(ctx);
206*90e502c7SAndroid Build Coastguard Worker }
207*90e502c7SAndroid Build Coastguard Worker
208*90e502c7SAndroid Build Coastguard Worker /* free memory */
209*90e502c7SAndroid Build Coastguard Worker srtp_crypto_free(c);
210*90e502c7SAndroid Build Coastguard Worker
211*90e502c7SAndroid Build Coastguard Worker return (srtp_err_status_ok);
212*90e502c7SAndroid Build Coastguard Worker }
213*90e502c7SAndroid Build Coastguard Worker
214*90e502c7SAndroid Build Coastguard Worker /*
215*90e502c7SAndroid Build Coastguard Worker * aes_icm_nss_context_init(...) initializes the aes_icm_context
216*90e502c7SAndroid Build Coastguard Worker * using the value in key[].
217*90e502c7SAndroid Build Coastguard Worker *
218*90e502c7SAndroid Build Coastguard Worker * the key is the secret key
219*90e502c7SAndroid Build Coastguard Worker *
220*90e502c7SAndroid Build Coastguard Worker * the salt is unpredictable (but not necessarily secret) data which
221*90e502c7SAndroid Build Coastguard Worker * randomizes the starting point in the keystream
222*90e502c7SAndroid Build Coastguard Worker */
srtp_aes_icm_nss_context_init(void * cv,const uint8_t * key)223*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t srtp_aes_icm_nss_context_init(void *cv,
224*90e502c7SAndroid Build Coastguard Worker const uint8_t *key)
225*90e502c7SAndroid Build Coastguard Worker {
226*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_ctx_t *c = (srtp_aes_icm_ctx_t *)cv;
227*90e502c7SAndroid Build Coastguard Worker
228*90e502c7SAndroid Build Coastguard Worker /*
229*90e502c7SAndroid Build Coastguard Worker * set counter and initial values to 'offset' value, being careful not to
230*90e502c7SAndroid Build Coastguard Worker * go past the end of the key buffer
231*90e502c7SAndroid Build Coastguard Worker */
232*90e502c7SAndroid Build Coastguard Worker v128_set_to_zero(&c->counter);
233*90e502c7SAndroid Build Coastguard Worker v128_set_to_zero(&c->offset);
234*90e502c7SAndroid Build Coastguard Worker memcpy(&c->counter, key + c->key_size, SRTP_SALT_LEN);
235*90e502c7SAndroid Build Coastguard Worker memcpy(&c->offset, key + c->key_size, SRTP_SALT_LEN);
236*90e502c7SAndroid Build Coastguard Worker
237*90e502c7SAndroid Build Coastguard Worker /* force last two octets of the offset to zero (for srtp compatibility) */
238*90e502c7SAndroid Build Coastguard Worker c->offset.v8[SRTP_SALT_LEN] = c->offset.v8[SRTP_SALT_LEN + 1] = 0;
239*90e502c7SAndroid Build Coastguard Worker c->counter.v8[SRTP_SALT_LEN] = c->counter.v8[SRTP_SALT_LEN + 1] = 0;
240*90e502c7SAndroid Build Coastguard Worker
241*90e502c7SAndroid Build Coastguard Worker debug_print(srtp_mod_aes_icm, "key: %s",
242*90e502c7SAndroid Build Coastguard Worker srtp_octet_string_hex_string(key, c->key_size));
243*90e502c7SAndroid Build Coastguard Worker debug_print(srtp_mod_aes_icm, "offset: %s", v128_hex_string(&c->offset));
244*90e502c7SAndroid Build Coastguard Worker
245*90e502c7SAndroid Build Coastguard Worker if (c->key) {
246*90e502c7SAndroid Build Coastguard Worker PK11_FreeSymKey(c->key);
247*90e502c7SAndroid Build Coastguard Worker c->key = NULL;
248*90e502c7SAndroid Build Coastguard Worker }
249*90e502c7SAndroid Build Coastguard Worker
250*90e502c7SAndroid Build Coastguard Worker PK11SlotInfo *slot = PK11_GetBestSlot(CKM_AES_CTR, NULL);
251*90e502c7SAndroid Build Coastguard Worker if (!slot) {
252*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_bad_param;
253*90e502c7SAndroid Build Coastguard Worker }
254*90e502c7SAndroid Build Coastguard Worker
255*90e502c7SAndroid Build Coastguard Worker SECItem keyItem = { siBuffer, (unsigned char *)key, c->key_size };
256*90e502c7SAndroid Build Coastguard Worker c->key = PK11_ImportSymKey(slot, CKM_AES_CTR, PK11_OriginUnwrap,
257*90e502c7SAndroid Build Coastguard Worker CKA_ENCRYPT, &keyItem, NULL);
258*90e502c7SAndroid Build Coastguard Worker PK11_FreeSlot(slot);
259*90e502c7SAndroid Build Coastguard Worker
260*90e502c7SAndroid Build Coastguard Worker if (!c->key) {
261*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_cipher_fail;
262*90e502c7SAndroid Build Coastguard Worker }
263*90e502c7SAndroid Build Coastguard Worker
264*90e502c7SAndroid Build Coastguard Worker return (srtp_err_status_ok);
265*90e502c7SAndroid Build Coastguard Worker }
266*90e502c7SAndroid Build Coastguard Worker
267*90e502c7SAndroid Build Coastguard Worker /*
268*90e502c7SAndroid Build Coastguard Worker * aes_icm_set_iv(c, iv) sets the counter value to the exor of iv with
269*90e502c7SAndroid Build Coastguard Worker * the offset
270*90e502c7SAndroid Build Coastguard Worker */
srtp_aes_icm_nss_set_iv(void * cv,uint8_t * iv,srtp_cipher_direction_t dir)271*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t srtp_aes_icm_nss_set_iv(void *cv,
272*90e502c7SAndroid Build Coastguard Worker uint8_t *iv,
273*90e502c7SAndroid Build Coastguard Worker srtp_cipher_direction_t dir)
274*90e502c7SAndroid Build Coastguard Worker {
275*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_ctx_t *c = (srtp_aes_icm_ctx_t *)cv;
276*90e502c7SAndroid Build Coastguard Worker v128_t nonce;
277*90e502c7SAndroid Build Coastguard Worker
278*90e502c7SAndroid Build Coastguard Worker /* set nonce (for alignment) */
279*90e502c7SAndroid Build Coastguard Worker v128_copy_octet_string(&nonce, iv);
280*90e502c7SAndroid Build Coastguard Worker
281*90e502c7SAndroid Build Coastguard Worker debug_print(srtp_mod_aes_icm, "setting iv: %s", v128_hex_string(&nonce));
282*90e502c7SAndroid Build Coastguard Worker
283*90e502c7SAndroid Build Coastguard Worker v128_xor(&c->counter, &c->offset, &nonce);
284*90e502c7SAndroid Build Coastguard Worker
285*90e502c7SAndroid Build Coastguard Worker debug_print(srtp_mod_aes_icm, "set_counter: %s",
286*90e502c7SAndroid Build Coastguard Worker v128_hex_string(&c->counter));
287*90e502c7SAndroid Build Coastguard Worker
288*90e502c7SAndroid Build Coastguard Worker /* set up the PK11 context now that we have all the info */
289*90e502c7SAndroid Build Coastguard Worker CK_AES_CTR_PARAMS param;
290*90e502c7SAndroid Build Coastguard Worker param.ulCounterBits = 16;
291*90e502c7SAndroid Build Coastguard Worker memcpy(param.cb, &c->counter, 16);
292*90e502c7SAndroid Build Coastguard Worker
293*90e502c7SAndroid Build Coastguard Worker if (!c->key) {
294*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_bad_param;
295*90e502c7SAndroid Build Coastguard Worker }
296*90e502c7SAndroid Build Coastguard Worker
297*90e502c7SAndroid Build Coastguard Worker if (c->ctx) {
298*90e502c7SAndroid Build Coastguard Worker PK11_DestroyContext(c->ctx, PR_TRUE);
299*90e502c7SAndroid Build Coastguard Worker }
300*90e502c7SAndroid Build Coastguard Worker
301*90e502c7SAndroid Build Coastguard Worker SECItem paramItem = { siBuffer, (unsigned char *)¶m,
302*90e502c7SAndroid Build Coastguard Worker sizeof(CK_AES_CTR_PARAMS) };
303*90e502c7SAndroid Build Coastguard Worker c->ctx = PK11_CreateContextBySymKey(CKM_AES_CTR, CKA_ENCRYPT, c->key,
304*90e502c7SAndroid Build Coastguard Worker ¶mItem);
305*90e502c7SAndroid Build Coastguard Worker if (!c->ctx) {
306*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_cipher_fail;
307*90e502c7SAndroid Build Coastguard Worker }
308*90e502c7SAndroid Build Coastguard Worker
309*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_ok;
310*90e502c7SAndroid Build Coastguard Worker }
311*90e502c7SAndroid Build Coastguard Worker
312*90e502c7SAndroid Build Coastguard Worker /*
313*90e502c7SAndroid Build Coastguard Worker * This function encrypts a buffer using AES CTR mode
314*90e502c7SAndroid Build Coastguard Worker *
315*90e502c7SAndroid Build Coastguard Worker * Parameters:
316*90e502c7SAndroid Build Coastguard Worker * c Crypto context
317*90e502c7SAndroid Build Coastguard Worker * buf data to encrypt
318*90e502c7SAndroid Build Coastguard Worker * enc_len length of encrypt buffer
319*90e502c7SAndroid Build Coastguard Worker */
srtp_aes_icm_nss_encrypt(void * cv,unsigned char * buf,unsigned int * enc_len)320*90e502c7SAndroid Build Coastguard Worker static srtp_err_status_t srtp_aes_icm_nss_encrypt(void *cv,
321*90e502c7SAndroid Build Coastguard Worker unsigned char *buf,
322*90e502c7SAndroid Build Coastguard Worker unsigned int *enc_len)
323*90e502c7SAndroid Build Coastguard Worker {
324*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_ctx_t *c = (srtp_aes_icm_ctx_t *)cv;
325*90e502c7SAndroid Build Coastguard Worker
326*90e502c7SAndroid Build Coastguard Worker if (!c->ctx) {
327*90e502c7SAndroid Build Coastguard Worker return srtp_err_status_bad_param;
328*90e502c7SAndroid Build Coastguard Worker }
329*90e502c7SAndroid Build Coastguard Worker
330*90e502c7SAndroid Build Coastguard Worker int rv =
331*90e502c7SAndroid Build Coastguard Worker PK11_CipherOp(c->ctx, buf, (int *)enc_len, *enc_len, buf, *enc_len);
332*90e502c7SAndroid Build Coastguard Worker
333*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t status = (srtp_err_status_ok);
334*90e502c7SAndroid Build Coastguard Worker if (rv != SECSuccess) {
335*90e502c7SAndroid Build Coastguard Worker status = (srtp_err_status_cipher_fail);
336*90e502c7SAndroid Build Coastguard Worker }
337*90e502c7SAndroid Build Coastguard Worker
338*90e502c7SAndroid Build Coastguard Worker return status;
339*90e502c7SAndroid Build Coastguard Worker }
340*90e502c7SAndroid Build Coastguard Worker
341*90e502c7SAndroid Build Coastguard Worker /*
342*90e502c7SAndroid Build Coastguard Worker * Name of this crypto engine
343*90e502c7SAndroid Build Coastguard Worker */
344*90e502c7SAndroid Build Coastguard Worker static const char srtp_aes_icm_128_nss_description[] =
345*90e502c7SAndroid Build Coastguard Worker "AES-128 counter mode using NSS";
346*90e502c7SAndroid Build Coastguard Worker static const char srtp_aes_icm_192_nss_description[] =
347*90e502c7SAndroid Build Coastguard Worker "AES-192 counter mode using NSS";
348*90e502c7SAndroid Build Coastguard Worker static const char srtp_aes_icm_256_nss_description[] =
349*90e502c7SAndroid Build Coastguard Worker "AES-256 counter mode using NSS";
350*90e502c7SAndroid Build Coastguard Worker
351*90e502c7SAndroid Build Coastguard Worker /*
352*90e502c7SAndroid Build Coastguard Worker * KAT values for AES self-test. These
353*90e502c7SAndroid Build Coastguard Worker * values came from the legacy libsrtp code.
354*90e502c7SAndroid Build Coastguard Worker */
355*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
356*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_128_test_case_0_key[SRTP_AES_ICM_128_KEY_LEN_WSALT] = {
357*90e502c7SAndroid Build Coastguard Worker 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
358*90e502c7SAndroid Build Coastguard Worker 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
359*90e502c7SAndroid Build Coastguard Worker 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
360*90e502c7SAndroid Build Coastguard Worker 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd
361*90e502c7SAndroid Build Coastguard Worker };
362*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
363*90e502c7SAndroid Build Coastguard Worker
364*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
365*90e502c7SAndroid Build Coastguard Worker static uint8_t srtp_aes_icm_128_test_case_0_nonce[16] = {
366*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
368*90e502c7SAndroid Build Coastguard Worker };
369*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
370*90e502c7SAndroid Build Coastguard Worker
371*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
372*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_128_test_case_0_plaintext[32] = {
373*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377*90e502c7SAndroid Build Coastguard Worker };
378*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
379*90e502c7SAndroid Build Coastguard Worker
380*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
381*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_128_test_case_0_ciphertext[32] = {
382*90e502c7SAndroid Build Coastguard Worker 0xe0, 0x3e, 0xad, 0x09, 0x35, 0xc9, 0x5e, 0x80,
383*90e502c7SAndroid Build Coastguard Worker 0xe1, 0x66, 0xb1, 0x6d, 0xd9, 0x2b, 0x4e, 0xb4,
384*90e502c7SAndroid Build Coastguard Worker 0xd2, 0x35, 0x13, 0x16, 0x2b, 0x02, 0xd0, 0xf7,
385*90e502c7SAndroid Build Coastguard Worker 0x2a, 0x43, 0xa2, 0xfe, 0x4a, 0x5f, 0x97, 0xab
386*90e502c7SAndroid Build Coastguard Worker };
387*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
388*90e502c7SAndroid Build Coastguard Worker
389*90e502c7SAndroid Build Coastguard Worker static const srtp_cipher_test_case_t srtp_aes_icm_128_test_case_0 = {
390*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_128_KEY_LEN_WSALT, /* octets in key */
391*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_128_test_case_0_key, /* key */
392*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_128_test_case_0_nonce, /* packet index */
393*90e502c7SAndroid Build Coastguard Worker 32, /* octets in plaintext */
394*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_128_test_case_0_plaintext, /* plaintext */
395*90e502c7SAndroid Build Coastguard Worker 32, /* octets in ciphertext */
396*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_128_test_case_0_ciphertext, /* ciphertext */
397*90e502c7SAndroid Build Coastguard Worker 0, /* */
398*90e502c7SAndroid Build Coastguard Worker NULL, /* */
399*90e502c7SAndroid Build Coastguard Worker 0, /* */
400*90e502c7SAndroid Build Coastguard Worker NULL /* pointer to next testcase */
401*90e502c7SAndroid Build Coastguard Worker };
402*90e502c7SAndroid Build Coastguard Worker
403*90e502c7SAndroid Build Coastguard Worker /*
404*90e502c7SAndroid Build Coastguard Worker * KAT values for AES-192-CTR self-test. These
405*90e502c7SAndroid Build Coastguard Worker * values came from section 7 of RFC 6188.
406*90e502c7SAndroid Build Coastguard Worker */
407*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
408*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_192_test_case_0_key[SRTP_AES_ICM_192_KEY_LEN_WSALT] = {
409*90e502c7SAndroid Build Coastguard Worker 0xea, 0xb2, 0x34, 0x76, 0x4e, 0x51, 0x7b, 0x2d,
410*90e502c7SAndroid Build Coastguard Worker 0x3d, 0x16, 0x0d, 0x58, 0x7d, 0x8c, 0x86, 0x21,
411*90e502c7SAndroid Build Coastguard Worker 0x97, 0x40, 0xf6, 0x5f, 0x99, 0xb6, 0xbc, 0xf7,
412*90e502c7SAndroid Build Coastguard Worker 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
413*90e502c7SAndroid Build Coastguard Worker 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd
414*90e502c7SAndroid Build Coastguard Worker };
415*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
416*90e502c7SAndroid Build Coastguard Worker
417*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
418*90e502c7SAndroid Build Coastguard Worker static uint8_t srtp_aes_icm_192_test_case_0_nonce[16] = {
419*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
421*90e502c7SAndroid Build Coastguard Worker };
422*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
423*90e502c7SAndroid Build Coastguard Worker
424*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
425*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_192_test_case_0_plaintext[32] = {
426*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430*90e502c7SAndroid Build Coastguard Worker };
431*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
432*90e502c7SAndroid Build Coastguard Worker
433*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
434*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_192_test_case_0_ciphertext[32] = {
435*90e502c7SAndroid Build Coastguard Worker 0x35, 0x09, 0x6c, 0xba, 0x46, 0x10, 0x02, 0x8d,
436*90e502c7SAndroid Build Coastguard Worker 0xc1, 0xb5, 0x75, 0x03, 0x80, 0x4c, 0xe3, 0x7c,
437*90e502c7SAndroid Build Coastguard Worker 0x5d, 0xe9, 0x86, 0x29, 0x1d, 0xcc, 0xe1, 0x61,
438*90e502c7SAndroid Build Coastguard Worker 0xd5, 0x16, 0x5e, 0xc4, 0x56, 0x8f, 0x5c, 0x9a
439*90e502c7SAndroid Build Coastguard Worker };
440*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
441*90e502c7SAndroid Build Coastguard Worker
442*90e502c7SAndroid Build Coastguard Worker static const srtp_cipher_test_case_t srtp_aes_icm_192_test_case_0 = {
443*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_192_KEY_LEN_WSALT, /* octets in key */
444*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_192_test_case_0_key, /* key */
445*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_192_test_case_0_nonce, /* packet index */
446*90e502c7SAndroid Build Coastguard Worker 32, /* octets in plaintext */
447*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_192_test_case_0_plaintext, /* plaintext */
448*90e502c7SAndroid Build Coastguard Worker 32, /* octets in ciphertext */
449*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_192_test_case_0_ciphertext, /* ciphertext */
450*90e502c7SAndroid Build Coastguard Worker 0, /* */
451*90e502c7SAndroid Build Coastguard Worker NULL, /* */
452*90e502c7SAndroid Build Coastguard Worker 0, /* */
453*90e502c7SAndroid Build Coastguard Worker NULL /* pointer to next testcase */
454*90e502c7SAndroid Build Coastguard Worker };
455*90e502c7SAndroid Build Coastguard Worker
456*90e502c7SAndroid Build Coastguard Worker /*
457*90e502c7SAndroid Build Coastguard Worker * KAT values for AES-256-CTR self-test. These
458*90e502c7SAndroid Build Coastguard Worker * values came from section 7 of RFC 6188.
459*90e502c7SAndroid Build Coastguard Worker */
460*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
461*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_256_test_case_0_key[SRTP_AES_ICM_256_KEY_LEN_WSALT] = {
462*90e502c7SAndroid Build Coastguard Worker 0x57, 0xf8, 0x2f, 0xe3, 0x61, 0x3f, 0xd1, 0x70,
463*90e502c7SAndroid Build Coastguard Worker 0xa8, 0x5e, 0xc9, 0x3c, 0x40, 0xb1, 0xf0, 0x92,
464*90e502c7SAndroid Build Coastguard Worker 0x2e, 0xc4, 0xcb, 0x0d, 0xc0, 0x25, 0xb5, 0x82,
465*90e502c7SAndroid Build Coastguard Worker 0x72, 0x14, 0x7c, 0xc4, 0x38, 0x94, 0x4a, 0x98,
466*90e502c7SAndroid Build Coastguard Worker 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
467*90e502c7SAndroid Build Coastguard Worker 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd
468*90e502c7SAndroid Build Coastguard Worker };
469*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
470*90e502c7SAndroid Build Coastguard Worker
471*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
472*90e502c7SAndroid Build Coastguard Worker static uint8_t srtp_aes_icm_256_test_case_0_nonce[16] = {
473*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
475*90e502c7SAndroid Build Coastguard Worker };
476*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
477*90e502c7SAndroid Build Coastguard Worker
478*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
479*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_256_test_case_0_plaintext[32] = {
480*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483*90e502c7SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484*90e502c7SAndroid Build Coastguard Worker };
485*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
486*90e502c7SAndroid Build Coastguard Worker
487*90e502c7SAndroid Build Coastguard Worker /* clang-format off */
488*90e502c7SAndroid Build Coastguard Worker static const uint8_t srtp_aes_icm_256_test_case_0_ciphertext[32] = {
489*90e502c7SAndroid Build Coastguard Worker 0x92, 0xbd, 0xd2, 0x8a, 0x93, 0xc3, 0xf5, 0x25,
490*90e502c7SAndroid Build Coastguard Worker 0x11, 0xc6, 0x77, 0xd0, 0x8b, 0x55, 0x15, 0xa4,
491*90e502c7SAndroid Build Coastguard Worker 0x9d, 0xa7, 0x1b, 0x23, 0x78, 0xa8, 0x54, 0xf6,
492*90e502c7SAndroid Build Coastguard Worker 0x70, 0x50, 0x75, 0x6d, 0xed, 0x16, 0x5b, 0xac
493*90e502c7SAndroid Build Coastguard Worker };
494*90e502c7SAndroid Build Coastguard Worker /* clang-format on */
495*90e502c7SAndroid Build Coastguard Worker
496*90e502c7SAndroid Build Coastguard Worker static const srtp_cipher_test_case_t srtp_aes_icm_256_test_case_0 = {
497*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_256_KEY_LEN_WSALT, /* octets in key */
498*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_256_test_case_0_key, /* key */
499*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_256_test_case_0_nonce, /* packet index */
500*90e502c7SAndroid Build Coastguard Worker 32, /* octets in plaintext */
501*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_256_test_case_0_plaintext, /* plaintext */
502*90e502c7SAndroid Build Coastguard Worker 32, /* octets in ciphertext */
503*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_256_test_case_0_ciphertext, /* ciphertext */
504*90e502c7SAndroid Build Coastguard Worker 0, /* */
505*90e502c7SAndroid Build Coastguard Worker NULL, /* */
506*90e502c7SAndroid Build Coastguard Worker 0, /* */
507*90e502c7SAndroid Build Coastguard Worker NULL /* pointer to next testcase */
508*90e502c7SAndroid Build Coastguard Worker };
509*90e502c7SAndroid Build Coastguard Worker
510*90e502c7SAndroid Build Coastguard Worker /*
511*90e502c7SAndroid Build Coastguard Worker * This is the function table for this crypto engine.
512*90e502c7SAndroid Build Coastguard Worker * note: the encrypt function is identical to the decrypt function
513*90e502c7SAndroid Build Coastguard Worker */
514*90e502c7SAndroid Build Coastguard Worker const srtp_cipher_type_t srtp_aes_icm_128 = {
515*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_alloc, /* */
516*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_dealloc, /* */
517*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_context_init, /* */
518*90e502c7SAndroid Build Coastguard Worker 0, /* set_aad */
519*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
520*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
521*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_set_iv, /* */
522*90e502c7SAndroid Build Coastguard Worker 0, /* get_tag */
523*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_128_nss_description, /* */
524*90e502c7SAndroid Build Coastguard Worker &srtp_aes_icm_128_test_case_0, /* */
525*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_128 /* */
526*90e502c7SAndroid Build Coastguard Worker };
527*90e502c7SAndroid Build Coastguard Worker
528*90e502c7SAndroid Build Coastguard Worker /*
529*90e502c7SAndroid Build Coastguard Worker * This is the function table for this crypto engine.
530*90e502c7SAndroid Build Coastguard Worker * note: the encrypt function is identical to the decrypt function
531*90e502c7SAndroid Build Coastguard Worker */
532*90e502c7SAndroid Build Coastguard Worker const srtp_cipher_type_t srtp_aes_icm_192 = {
533*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_alloc, /* */
534*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_dealloc, /* */
535*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_context_init, /* */
536*90e502c7SAndroid Build Coastguard Worker 0, /* set_aad */
537*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
538*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
539*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_set_iv, /* */
540*90e502c7SAndroid Build Coastguard Worker 0, /* get_tag */
541*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_192_nss_description, /* */
542*90e502c7SAndroid Build Coastguard Worker &srtp_aes_icm_192_test_case_0, /* */
543*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_192 /* */
544*90e502c7SAndroid Build Coastguard Worker };
545*90e502c7SAndroid Build Coastguard Worker
546*90e502c7SAndroid Build Coastguard Worker /*
547*90e502c7SAndroid Build Coastguard Worker * This is the function table for this crypto engine.
548*90e502c7SAndroid Build Coastguard Worker * note: the encrypt function is identical to the decrypt function
549*90e502c7SAndroid Build Coastguard Worker */
550*90e502c7SAndroid Build Coastguard Worker const srtp_cipher_type_t srtp_aes_icm_256 = {
551*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_alloc, /* */
552*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_dealloc, /* */
553*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_context_init, /* */
554*90e502c7SAndroid Build Coastguard Worker 0, /* set_aad */
555*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
556*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_encrypt, /* */
557*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_nss_set_iv, /* */
558*90e502c7SAndroid Build Coastguard Worker 0, /* get_tag */
559*90e502c7SAndroid Build Coastguard Worker srtp_aes_icm_256_nss_description, /* */
560*90e502c7SAndroid Build Coastguard Worker &srtp_aes_icm_256_test_case_0, /* */
561*90e502c7SAndroid Build Coastguard Worker SRTP_AES_ICM_256 /* */
562*90e502c7SAndroid Build Coastguard Worker };
563