16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * auth.h
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * common interface to authentication functions
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 *
126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright (c) 2001-2006, Cisco Systems, Inc.
136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved.
146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without
166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions
176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met:
186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions of source code must retain the above copyright
206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   notice, this list of conditions and the following disclaimer.
216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions in binary form must reproduce the above
236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   copyright notice, this list of conditions and the following
246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   disclaimer in the documentation and/or other materials provided
256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   with the distribution.
266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Neither the name of the Cisco Systems, Inc. nor the names of its
286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   contributors may be used to endorse or promote products derived
296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   from this software without specific prior written permission.
306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE.
436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef AUTH_H
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define AUTH_H
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "datatypes.h"
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "err.h"                /* error codes    */
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "crypto.h"		/* for auth_type_id_t */
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "crypto_types.h"	/* for values of auth_type_id_t */
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct auth_type_t *auth_type_pointer;
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct auth_t      *auth_pointer_t;
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_alloc_func)
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (auth_pointer_t *ap, int key_len, int out_len);
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_init_func)
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, const uint8_t *key, int key_len);
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_dealloc_func)(auth_pointer_t ap);
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_compute_func)
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, uint8_t *buffer, int octets_to_auth,
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      int tag_len, uint8_t *tag);
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_update_func)
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *state, uint8_t *buffer, int octets_to_auth);
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*auth_start_func)(void *state);
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* some syntactic sugar on these function types */
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_type_alloc(at, a, klen, outlen)                        \
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                 ((at)->alloc((a), (klen), (outlen)))
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_init(a, key)                                           \
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                 (((a)->type)->init((a)->state, (key), ((a)->key_len)))
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_compute(a, buf, len, res)                              \
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org       (((a)->type)->compute((a)->state, (buf), (len), (a)->out_len, (res)))
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_update(a, buf, len)                                    \
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org       (((a)->type)->update((a)->state, (buf), (len)))
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_start(a)(((a)->type)->start((a)->state))
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define auth_dealloc(c) (((c)->type)->dealloc(c))
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* functions to get information about a particular auth_t */
936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_get_key_length(const struct auth_t *a);
966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_get_tag_length(const struct auth_t *a);
996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_get_prefix_length(const struct auth_t *a);
1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * auth_test_case_t is a (list of) key/message/tag values that are
1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * known to be correct for a particular cipher.  this data can be used
1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * to test an implementation in an on-the-fly self test of the
1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * correcness of the implementation.  (see the auth_type_self_test()
1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * function below)
1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct auth_test_case_t {
1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int key_length_octets;                    /* octets in key            */
1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *key;                             /* key                      */
1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int data_length_octets;                   /* octets in data           */
1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *data;                            /* data                     */
1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int tag_length_octets;                    /* octets in tag            */
1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  uint8_t *tag;                             /* tag                      */
1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  struct auth_test_case_t *next_test_case;  /* pointer to next testcase */
1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} auth_test_case_t;
1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* auth_type_t */
1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct auth_type_t {
1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_alloc_func      alloc;
1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_dealloc_func    dealloc;
1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_init_func       init;
1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_compute_func    compute;
1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_update_func     update;
1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_start_func      start;
1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  char                *description;
1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int                  ref_count;
1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_test_case_t    *test_data;
1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  debug_module_t      *debug;
1346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_type_id_t       id;
1356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} auth_type_t;
1366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct auth_t {
1386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  auth_type_t *type;
1396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  void        *state;
1406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int          out_len;           /* length of output tag in octets */
1416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int          key_len;           /* length of key in octets        */
1426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int          prefix_len;        /* length of keystream prefix     */
1436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} auth_t;
1446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * auth_type_self_test() tests an auth_type against test cases
1476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * provided in an array of values of key/message/tag that is known to
1486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * be good
1496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_type_self_test(const auth_type_t *at);
1536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * auth_type_test() tests an auth_type against external test cases
1566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * provided in an array of values of key/message/tag that is known to
1576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * be good
1586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_type_test(const auth_type_t *at, const auth_test_case_t *test_data);
1626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * auth_type_get_ref_count(at) returns the reference count (the number
1656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * of instantiations) of the auth_type_t at
1666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
1696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgauth_type_get_ref_count(const auth_type_t *at);
1706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* AUTH_H */
172