16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * null_cipher.c
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * A null cipher implementation.  This cipher leaves the plaintext
56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * unchanged.
66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew
86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc.
96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright (c) 2001-2006, Cisco Systems, Inc.
146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved.
156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without
176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions
186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met:
196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions of source code must retain the above copyright
216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   notice, this list of conditions and the following disclaimer.
226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions in binary form must reproduce the above
246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   copyright notice, this list of conditions and the following
256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   disclaimer in the documentation and/or other materials provided
266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   with the distribution.
276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Neither the name of the Cisco Systems, Inc. nor the names of its
296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   contributors may be used to endorse or promote products derived
306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   from this software without specific prior written permission.
316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE.
446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "datatypes.h"
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "null_cipher.h"
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "alloc.h"
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* the null_cipher uses the cipher debug module  */
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgextern debug_module_t mod_cipher;
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_alloc(cipher_t **c, int key_len) {
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  extern cipher_type_t null_cipher;
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *pointer;
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  debug_print(mod_cipher,
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org	      "allocating cipher with key length %d", key_len);
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* allocate memory a cipher of type null_cipher */
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  pointer = (uint8_t*)crypto_alloc(sizeof(null_cipher_ctx_t) + sizeof(cipher_t));
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  if (pointer == NULL)
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    return err_status_alloc_fail;
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* set pointers */
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  *c = (cipher_t *)pointer;
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (*c)->type = &null_cipher;
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (*c)->state = pointer + sizeof(cipher_t);
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* set key size */
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (*c)->key_len = key_len;
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* increment ref_count */
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  null_cipher.ref_count++;
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_dealloc(cipher_t *c) {
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  extern cipher_type_t null_cipher;
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* zeroize entire state*/
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  octet_string_set_to_zero((uint8_t *)c,
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org			   sizeof(null_cipher_ctx_t) + sizeof(cipher_t));
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* free memory of type null_cipher */
926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  crypto_free(c);
936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* decrement reference count */
956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  null_cipher.ref_count--;
966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_init(null_cipher_ctx_t *ctx, const uint8_t *key, int key_len) {
1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  debug_print(mod_cipher, "initializing null cipher", NULL);
1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_set_iv(null_cipher_ctx_t *c, void *iv) {
1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_encrypt(null_cipher_ctx_t *c,
1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org		    unsigned char *buf, unsigned int *bytes_to_encr) {
1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgchar
1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_description[] = "null cipher";
1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_test_case_t
1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgnull_cipher_test_0 = {
1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  0,                 /* octets in key            */
1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  NULL,              /* key                      */
1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  0,                 /* packet index             */
1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  0,                 /* octets in plaintext      */
1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  NULL,              /* plaintext                */
1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  0,                 /* octets in plaintext      */
1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  NULL,              /* ciphertext               */
1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  NULL               /* pointer to next testcase */
1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org};
1346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * note: the decrypt function is idential to the encrypt function
1386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_type_t null_cipher = {
1416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_alloc_func_t)         null_cipher_alloc,
1426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_dealloc_func_t)       null_cipher_dealloc,
1436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_init_func_t)          null_cipher_init,
1446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_encrypt_func_t)       null_cipher_encrypt,
1456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_decrypt_func_t)       null_cipher_encrypt,
1466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_set_iv_func_t)        null_cipher_set_iv,
1476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (char *)                      null_cipher_description,
1486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (int)                         0,
1496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_test_case_t *)       &null_cipher_test_0,
1506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (debug_module_t *)            NULL,
1516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  (cipher_type_id_t)            NULL_CIPHER
1526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org};
1536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
154