16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher.h
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * common interface to ciphers
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
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef CIPHER_H
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define CIPHER_H
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "datatypes.h"
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "rdbx.h"               /* for xtd_seq_num_t */
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "err.h"                /* for error codes  */
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "crypto.h"		/* for cipher_type_id_t */
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "crypto_types.h"	/* for values of cipher_type_id_t */
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/**
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * @brief cipher_direction_t defines a particular cipher operation.
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * A cipher_direction_t is an enum that describes a particular cipher
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * operation, i.e. encryption or decryption.  For some ciphers, this
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * distinction does not matter, but for others, it is essential.
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef enum {
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  direction_encrypt, /**< encryption (convert plaintext to ciphertext) */
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  direction_decrypt, /**< decryption (convert ciphertext to plaintext) */
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  direction_any      /**< encryption or decryption                     */
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} cipher_direction_t;
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the cipher_pointer and cipher_type_pointer definitions are needed
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * as cipher_t and cipher_type_t are not yet defined
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cipher_type_t *cipher_type_pointer_t;
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cipher_t      *cipher_pointer_t;
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *  a cipher_alloc_func_t allocates (but does not initialize) a cipher_t
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_alloc_func_t)
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (cipher_pointer_t *cp, int key_len);
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * a cipher_init_func_t [re-]initializes a cipher_t with a given key
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and direction (i.e., encrypt or decrypt)
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_init_func_t)
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org(void *state, const uint8_t *key, int key_len, cipher_direction_t dir);
926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* a cipher_dealloc_func_t de-allocates a cipher_t */
946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_dealloc_func_t)(cipher_pointer_t cp);
966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* a cipher_set_segment_func_t sets the segment index of a cipher_t */
986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_set_segment_func_t)
1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, xtd_seq_num_t idx);
1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* a cipher_encrypt_func_t encrypts data in-place */
1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_encrypt_func_t)
1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, uint8_t *buffer, unsigned int *octets_to_encrypt);
1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* a cipher_decrypt_func_t decrypts data in-place */
1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_decrypt_func_t)
1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, uint8_t *buffer, unsigned int *octets_to_decrypt);
1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * a cipher_set_iv_func_t function sets the current initialization vector
1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*cipher_set_iv_func_t)
1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (cipher_pointer_t cp, void *iv);
1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher_test_case_t is a (list of) key, salt, xtd_seq_num_t,
1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * plaintext, and ciphertext values that are known to be correct for a
1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * particular cipher.  this data can be used to test an implementation
1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * in an on-the-fly self test of the correcness of the implementation.
1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (see the cipher_type_self_test() function below)
1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cipher_test_case_t {
1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int key_length_octets;                      /* octets in key            */
1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *key;                               /* key                      */
1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *idx;                               /* packet index             */
1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int plaintext_length_octets;                /* octets in plaintext      */
1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *plaintext;                         /* plaintext                */
1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int ciphertext_length_octets;               /* octets in plaintext      */
1346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *ciphertext;                        /* ciphertext               */
1356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  struct cipher_test_case_t *next_test_case;  /* pointer to next testcase */
1366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} cipher_test_case_t;
1376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* cipher_type_t defines the 'metadata' for a particular cipher type */
1396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cipher_type_t {
1416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_alloc_func_t         alloc;
1426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_dealloc_func_t       dealloc;
1436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_init_func_t          init;
1446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_encrypt_func_t       encrypt;
1456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_encrypt_func_t       decrypt;
1466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_set_iv_func_t        set_iv;
1476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  char                       *description;
1486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int                         ref_count;
1496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_test_case_t         *test_data;
1506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  debug_module_t             *debug;
1516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_type_id_t            id;
1526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} cipher_type_t;
1536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher_t defines an instantiation of a particular cipher, with fixed
1566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * key length, key and salt values
1576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct cipher_t {
1606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  cipher_type_t *type;
1616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  void          *state;
1626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int            key_len;
1636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef FORCE_64BIT_ALIGN
1646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int            pad;
1656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
1666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} cipher_t;
1676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* some syntactic sugar on these function types */
1696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_type_alloc(ct, c, klen) ((ct)->alloc((c), (klen)))
1716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_dealloc(c) (((c)->type)->dealloc(c))
1736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_init(c, k, dir) (((c)->type)->init(((c)->state), (k), ((c)->key_len), (dir)))
1756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_encrypt(c, buf, len) \
1776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        (((c)->type)->encrypt(((c)->state), (buf), (len)))
1786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_decrypt(c, buf, len) \
1806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        (((c)->type)->decrypt(((c)->state), (buf), (len)))
1816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define cipher_set_iv(c, n)                           \
1836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  ((c) ? (((c)->type)->set_iv(((cipher_pointer_t)(c)->state), (n))) :   \
1846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                                err_status_no_such_op)
1856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_output(cipher_t *c, uint8_t *buffer, int num_octets_to_output);
1886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* some bookkeeping functions */
1916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
1936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_get_key_length(const cipher_t *c);
1946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher_type_self_test() tests a cipher against test cases provided in
1986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * an array of values of key/xtd_seq_num_t/plaintext/ciphertext
1996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * that is known to be good
2006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
2016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
2036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_type_self_test(const cipher_type_t *ct);
2046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
2076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher_type_test() tests a cipher against external test cases provided in
2086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * an array of values of key/xtd_seq_num_t/plaintext/ciphertext
2096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * that is known to be good
2106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
2116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
2136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_type_test(const cipher_type_t *ct, const cipher_test_case_t *test_data);
2146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
2176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * cipher_bits_per_second(c, l, t) computes (and estimate of) the
2186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * number of bits that a cipher implementation can encrypt in a second
2196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
2206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * c is a cipher (which MUST be allocated and initialized already), l
2216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * is the length in octets of the test data to be encrypted, and t is
2226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * the number of trials
2236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
2246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * if an error is encountered, then the value 0 is returned
2256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
2266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orguint64_t
2286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcipher_bits_per_second(cipher_t *c, int octets_in_buffer, int num_trials);
2296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
2306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* CIPHER_H */
231