1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * null_cipher.c
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * A null cipher implementation.  This cipher leaves the plaintext
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * unchanged.
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc.
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "datatypes.h"
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "null_cipher.h"
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "alloc.h"
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* the null_cipher uses the cipher debug module  */
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern debug_module_t mod_cipher;
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_alloc(cipher_t **c, int key_len) {
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  extern cipher_type_t null_cipher;
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint8_t *pointer;
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  debug_print(mod_cipher,
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	      "allocating cipher with key length %d", key_len);
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* allocate memory a cipher of type null_cipher */
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  pointer = (uint8_t*)crypto_alloc(sizeof(null_cipher_ctx_t) + sizeof(cipher_t));
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  if (pointer == NULL)
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    return err_status_alloc_fail;
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set pointers */
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  *c = (cipher_t *)pointer;
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (*c)->type = &null_cipher;
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (*c)->state = pointer + sizeof(cipher_t);
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set key size */
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (*c)->key_len = key_len;
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* increment ref_count */
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  null_cipher.ref_count++;
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_ok;
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_dealloc(cipher_t *c) {
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  extern cipher_type_t null_cipher;
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* zeroize entire state*/
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  octet_string_set_to_zero((uint8_t *)c,
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari			   sizeof(null_cipher_ctx_t) + sizeof(cipher_t));
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* free memory of type null_cipher */
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  crypto_free(c);
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* decrement reference count */
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  null_cipher.ref_count--;
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_ok;
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_init(null_cipher_ctx_t *ctx, const uint8_t *key) {
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  debug_print(mod_cipher, "initializing null cipher", NULL);
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_ok;
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_set_iv(null_cipher_ctx_t *c, void *iv) {
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_ok;
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_encrypt(null_cipher_ctx_t *c,
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari		    unsigned char *buf, unsigned int *bytes_to_encr) {
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return err_status_ok;
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_description[] = "null cipher";
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaricipher_test_case_t
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarinull_cipher_test_0 = {
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0,                 /* octets in key            */
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  NULL,              /* key                      */
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0,                 /* packet index             */
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0,                 /* octets in plaintext      */
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  NULL,              /* plaintext                */
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  0,                 /* octets in plaintext      */
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  NULL,              /* ciphertext               */
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  NULL               /* pointer to next testcase */
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note: the decrypt function is idential to the encrypt function
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaricipher_type_t null_cipher = {
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_alloc_func_t)         null_cipher_alloc,
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_dealloc_func_t)       null_cipher_dealloc,
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_init_func_t)          null_cipher_init,
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_encrypt_func_t)       null_cipher_encrypt,
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_decrypt_func_t)       null_cipher_encrypt,
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_set_iv_func_t)        null_cipher_set_iv,
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (char *)                      null_cipher_description,
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (int)                         0,
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (cipher_test_case_t *)       &null_cipher_test_0,
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  (debug_module_t *)            NULL
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
153