/ lib / krb5 / test_pkinit_dh2key.c
test_pkinit_dh2key.c
  1  /*
  2   * Copyright (c) 2005 Kungliga Tekniska Högskolan
  3   * (Royal Institute of Technology, Stockholm, Sweden).
  4   * All rights reserved.
  5   *
  6   * Redistribution and use in source and binary forms, with or without
  7   * modification, are permitted provided that the following conditions
  8   * are met:
  9   *
 10   * 1. Redistributions of source code must retain the above copyright
 11   *    notice, this list of conditions and the following disclaimer.
 12   *
 13   * 2. Redistributions in binary form must reproduce the above copyright
 14   *    notice, this list of conditions and the following disclaimer in the
 15   *    documentation and/or other materials provided with the distribution.
 16   *
 17   * 3. Neither the name of KTH nor the names of its contributors may be
 18   *    used to endorse or promote products derived from this software without
 19   *    specific prior written permission.
 20   *
 21   * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 22   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 24   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
 25   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 26   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 27   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 28   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 29   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 30   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 31   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
 32  
 33  #include "krb5_locl.h"
 34  #include <err.h>
 35  #include <getarg.h>
 36  
 37  static void
 38  test_dh2key(int i,
 39  	    krb5_context context,
 40  	    const heim_octet_string *dh,
 41  	    const heim_octet_string *c_n,
 42  	    const heim_octet_string *k_n,
 43  	    krb5_enctype etype,
 44  	    const heim_octet_string *result)
 45  {
 46      krb5_error_code ret;
 47      krb5_keyblock key;
 48  
 49      ret = _krb5_pk_octetstring2key(context,
 50  				   etype,
 51  				   dh->data, dh->length,
 52  				   c_n,
 53  				   k_n,
 54  				   &key);
 55      if (ret != 0)
 56  	krb5_err(context, 1, ret, "_krb5_pk_octetstring2key: %d", i);
 57  
 58      if (key.keyvalue.length != result->length ||
 59  	memcmp(key.keyvalue.data, result->data, result->length) != 0)
 60  	krb5_errx(context, 1, "resulting key wrong: %d", i);
 61  
 62      krb5_free_keyblock_contents(context, &key);
 63  }
 64  
 65  
 66  struct {
 67      krb5_enctype type;
 68      krb5_data X;
 69      krb5_data key;
 70  } tests[] = {
 71      /* 0 */
 72      {
 73  	ETYPE_AES256_CTS_HMAC_SHA1_96,
 74  	{
 75  	    256,
 76  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 77  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 78  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 79  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 80  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 81  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 82  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 83  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 84  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 85  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 86  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 87  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 88  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 89  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 90  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 91  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 92  	},
 93  	{
 94  	    32,
 95  	    "\x5e\xe5\x0d\x67\x5c\x80\x9f\xe5\x9e\x4a\x77\x62\xc5\x4b\x65\x83"
 96  	    "\x75\x47\xea\xfb\x15\x9b\xd8\xcd\xc7\x5f\xfc\xa5\x91\x1e\x4c\x41"
 97  	}
 98      },
 99      /* 1 */
100      {
101  	ETYPE_AES256_CTS_HMAC_SHA1_96,
102  	{
103  	    128,
104  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
105  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
106  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
107  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
108  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
109  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
110  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
111  	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
112  	},
113  	{
114  	    32,
115  	    "\xac\xf7\x70\x7c\x08\x97\x3d\xdf\xdb\x27\xcd\x36\x14\x42\xcc\xfb"
116  	    "\xa3\x55\xc8\x88\x4c\xb4\x72\xf3\x7d\xa6\x36\xd0\x7d\x56\x78\x7e"
117  	}
118      },
119      /* 2 */
120      {
121  	ETYPE_AES256_CTS_HMAC_SHA1_96,
122  	{
123  	    128,
124  	    "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
125  	    "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
126  	    "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
127  	    "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
128  	    "\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"
129  	    "\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
130  	    "\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
131  	    "\x0a\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08"
132  	},
133  	{
134  	    32,
135  	    "\xc4\x42\xda\x58\x5f\xcb\x80\xe4\x3b\x47\x94\x6f\x25\x40\x93\xe3"
136  	    "\x73\x29\xd9\x90\x01\x38\x0d\xb7\x83\x71\xdb\x3a\xcf\x5c\x79\x7e"
137  	}
138      },
139      /* 3 */
140      {
141  	ETYPE_AES256_CTS_HMAC_SHA1_96,
142  	{
143  	    77,
144  	    "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
145  	    "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
146  	    "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
147  	    "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
148  	    "\x0d\x0e\x0f\x10\x00\x01\x02\x03"
149  	    "\x04\x05\x06\x07\x08"
150  	},
151  	{
152  	    32,
153  	    "\x00\x53\x95\x3b\x84\xc8\x96\xf4\xeb\x38\x5c\x3f\x2e\x75\x1c\x4a"
154  	    "\x59\x0e\xd6\xff\xad\xca\x6f\xf6\x4f\x47\xeb\xeb\x8d\x78\x0f\xfc"
155  	}
156      }
157  };
158  
159  
160  static int version_flag = 0;
161  static int help_flag	= 0;
162  
163  static struct getargs args[] = {
164      {"version",	0,	arg_flag,	&version_flag,
165       "print version", NULL },
166      {"help",	0,	arg_flag,	&help_flag,
167       NULL, NULL }
168  };
169  
170  static void
171  usage (int ret)
172  {
173      arg_printusage (args,
174  		    sizeof(args)/sizeof(*args),
175  		    NULL,
176  		    "");
177      exit (ret);
178  }
179  
180  
181  int
182  main(int argc, char **argv)
183  {
184      krb5_context context;
185      krb5_error_code ret;
186      int i, optidx = 0;
187  
188      setprogname(argv[0]);
189  
190      if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
191  	usage(1);
192  
193      if (help_flag)
194  	usage (0);
195  
196      if(version_flag){
197  	print_version(NULL);
198  	exit(0);
199      }
200  
201      argc -= optidx;
202      argv += optidx;
203  
204      ret = krb5_init_context(&context);
205      if (ret)
206  	errx (1, "krb5_init_context failed: %d", ret);
207  
208      for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
209  	test_dh2key(i, context, &tests[i].X, NULL, NULL,
210  		    tests[i].type, &tests[i].key);
211      }
212  
213      krb5_free_context(context);
214  
215      return 0;
216  }