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