16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * kernel_driver.c
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * a test driver for the crypto_kernel
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#include <stdio.h>           /* for printf() */
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include <unistd.h>          /* for getopt() */
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "crypto_kernel.h"
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgvoid
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgusage(char *prog_name) {
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  printf("usage: %s [ -v ][ -d debug_module ]*\n", prog_name);
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  exit(255);
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgint
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgmain (int argc, char *argv[]) {
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  extern char *optarg;
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int q;
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  int do_validation      = 0;
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  err_status_t status;
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  if (argc == 1)
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    usage(argv[0]);
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* initialize kernel - we need to do this before anything else */
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  status = crypto_kernel_init();
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  if (status) {
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    printf("error: crypto_kernel init failed\n");
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    exit(1);
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  }
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  printf("crypto_kernel successfully initalized\n");
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* process input arguments */
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  while (1) {
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    q = getopt(argc, argv, "vd:");
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    if (q == -1)
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      break;
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    switch (q) {
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    case 'v':
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      do_validation = 1;
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      break;
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    case 'd':
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      status = crypto_kernel_set_debug_module(optarg, 1);
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      if (status) {
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org	printf("error: set debug module (%s) failed\n", optarg);
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org	exit(1);
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      }
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      break;
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    default:
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      usage(argv[0]);
926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  }
946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  if (do_validation) {
966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    printf("checking crypto_kernel status...\n");
976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    status = crypto_kernel_status();
986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    if (status) {
996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      printf("failed\n");
1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org      exit(1);
1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    printf("crypto_kernel passed self-tests\n");
1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  }
1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  status = crypto_kernel_shutdown();
1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  if (status) {
1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    printf("error: crypto_kernel shutdown failed\n");
1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    exit(1);
1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  }
1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  printf("crypto_kernel successfully shut down\n");
1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return 0;
1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * crypto_kernel_cipher_test() is a test of the cipher interface
1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * of the crypto_kernel
1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgcrypto_kernel_cipher_test(void) {
1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  /* not implemented yet! */
1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org  return err_status_ok;
1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org}
127