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