16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cryptoalg.h 36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * API for authenticated encryption crypto algorithms 56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew 76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc. 86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright (c) 2001-2006 Cisco Systems, Inc. 126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved. 136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without 156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions 166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met: 176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistributions of source code must retain the above copyright 196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * notice, this list of conditions and the following disclaimer. 206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistributions in binary form must reproduce the above 226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * copyright notice, this list of conditions and the following 236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * disclaimer in the documentation and/or other materials provided 246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * with the distribution. 256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Neither the name of the Cisco Systems, Inc. nor the names of its 276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * contributors may be used to endorse or promote products derived 286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * from this software without specific prior written permission. 296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE. 426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef CRYPTOALG_H 466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define CRYPTOALG_H 476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "err.h" 496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/** 516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @defgroup Crypto Cryptography 526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Zed uses a simple interface to a cryptographic transform. 546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @{ 566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/** 596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @brief applies a crypto algorithm 606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * The function pointer cryptoalg_func_t points to a function that 626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * implements a crypto transform, and provides a uniform API for 636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * accessing crypto mechanisms. 646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param key location of secret key 666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param clear data to be authenticated but not encrypted 686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param clear_len length of data to be authenticated but not encrypted 706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param iv location to write the Initialization Vector (IV) 726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param protect location of the data to be encrypted and 746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * authenticated (before the function call), and the ciphertext 756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and authentication tag (after the call) 766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @param protected_len location of the length of the data to be 786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * encrypted and authenticated (before the function call), and the 796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * length of the ciphertext (after the call) 806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cryptoalg_func_t) 846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (void *key, 856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org const void *clear, 866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned clear_len, 876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org void *iv, 886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org void *protect, 896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned *protected_len); 906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef 926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t (*cryptoalg_inv_t) 936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org (void *key, /* location of secret key */ 946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org const void *clear, /* data to be authenticated only */ 956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned clear_len, /* length of data to be authenticated only */ 966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org void *iv, /* location of iv */ 976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org void *opaque, /* data to be decrypted and authenticated */ 986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned *opaque_len /* location of the length of data to be 996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * decrypted and authd (before and after) 1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org ); 1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cryptoalg_ctx_t { 1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org cryptoalg_func_t enc; 1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org cryptoalg_inv_t dec; 1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned key_len; 1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned iv_len; 1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned auth_tag_len; 1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org unsigned max_expansion; 1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} cryptoalg_ctx_t; 1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef cryptoalg_ctx_t *cryptoalg_t; 1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cryptoalg_get_key_len(cryptoalg) ((cryptoalg)->key_len) 1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cryptoalg_get_iv_len(cryptoalg) ((cryptoalg)->iv_len) 1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cryptoalg_get_auth_tag_len(cryptoalg) ((cryptoalg)->auth_tag_len) 1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint 1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcryptoalg_get_id(cryptoalg_t c); 1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcryptoalg_t 1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcryptoalg_find_by_id(int id); 1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/** 1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @} 1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* CRYPTOALG_H */ 1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 134