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