/ lib / gssapi / krb5 / test_cfx.c
test_cfx.c
  1  /*
  2   * Copyright (c) 2006 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  
 34  #include "gsskrb5_locl.h"
 35  
 36  struct range {
 37      size_t lower;
 38      size_t upper;
 39  };
 40  
 41  struct range tests[] = {
 42      { 0, 1040 },
 43      { 2040, 2080 },
 44      { 4080, 5000 },
 45      { 8180, 8292 },
 46      { 9980, 10010 }
 47  };
 48  
 49  static void
 50  test_range(const struct range *r, int integ,
 51  	   krb5_context context, krb5_crypto crypto)
 52  {
 53      krb5_error_code ret;
 54      size_t size, rsize;
 55      struct gsskrb5_crypto ctx;
 56  
 57      for (size = r->lower; size < r->upper; size++) {
 58  	size_t cksumsize;
 59  	uint16_t padsize;
 60  	OM_uint32 minor;
 61  	OM_uint32 max_wrap_size;
 62  
 63  	ctx.crypto = crypto;
 64  
 65  	ret = _gssapi_wrap_size_cfx(&minor,
 66  				    &ctx,
 67  				    context,
 68  				    integ,
 69  				    0,
 70  				    size,
 71  				    &max_wrap_size);
 72  	if (ret)
 73  	    krb5_errx(context, 1, "_gsskrb5cfx_max_wrap_length_cfx: %d", ret);
 74  	if (max_wrap_size == 0)
 75  	    continue;
 76  
 77  	ret = _gsskrb5cfx_wrap_length_cfx(context,
 78  					  crypto,
 79  					  integ,
 80  					  max_wrap_size,
 81  					  &rsize, &cksumsize, &padsize);
 82  	if (ret)
 83  	    krb5_errx(context, 1, "_gsskrb5cfx_wrap_length_cfx: %d", ret);
 84  
 85  	if (size < rsize)
 86  	    krb5_errx(context, 1,
 87  		      "size (%d) < rsize (%d) for max_wrap_size %d",
 88  		      (int)size, (int)rsize, (int)max_wrap_size);
 89      }
 90  }
 91  
 92  static void
 93  test_special(krb5_context context, krb5_crypto crypto,
 94  	     int integ, size_t testsize)
 95  {
 96      krb5_error_code ret;
 97      size_t rsize;
 98      OM_uint32 max_wrap_size;
 99      size_t cksumsize;
100      uint16_t padsize;
101      struct gsskrb5_crypto ctx;
102      OM_uint32 minor;
103  
104      ctx.crypto = crypto;
105  
106      ret = _gssapi_wrap_size_cfx(&minor,
107  				&ctx,
108  				context,
109  				integ,
110  				0,
111  				testsize,
112  				&max_wrap_size);
113      if (ret)
114        krb5_errx(context, 1, "_gsskrb5cfx_max_wrap_length_cfx: %d", ret);
115      if (ret)
116  	krb5_errx(context, 1, "_gsskrb5cfx_max_wrap_length_cfx: %d", ret);
117  
118      ret = _gsskrb5cfx_wrap_length_cfx(context,
119  				      crypto,
120  				      integ,
121  				      max_wrap_size,
122  				      &rsize, &cksumsize, &padsize);
123      if (ret)
124  	krb5_errx(context, 1, "_gsskrb5cfx_wrap_length_cfx: %d", ret);
125  
126      if (testsize < rsize)
127  	krb5_errx(context, 1,
128  		  "testsize (%d) < rsize (%d) for max_wrap_size %d",
129  		  (int)testsize, (int)rsize, (int)max_wrap_size);
130  }
131  
132  
133  
134  
135  int
136  main(int argc, char **argv)
137  {
138      krb5_keyblock keyblock;
139      krb5_error_code ret;
140      krb5_context context;
141      krb5_crypto crypto;
142      int i;
143  
144      ret = krb5_init_context(&context);
145      if (ret)
146  	errx(1, "krb5_context_init: %d", ret);
147  
148      ret = krb5_generate_random_keyblock(context,
149  					KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96,
150  					&keyblock);
151      if (ret)
152  	krb5_err(context, 1, ret, "krb5_generate_random_keyblock");
153  
154      ret = krb5_crypto_init(context, &keyblock, 0, &crypto);
155      if (ret)
156  	krb5_err(context, 1, ret, "krb5_crypto_init");
157  
158      test_special(context, crypto, 1, 60);
159      test_special(context, crypto, 0, 60);
160  
161      for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
162  	test_range(&tests[i], 1, context, crypto);
163  	test_range(&tests[i], 0, context, crypto);
164      }
165  
166      krb5_free_keyblock_contents(context, &keyblock);
167      krb5_crypto_destroy(context, crypto);
168      krb5_free_context(context);
169  
170      return 0;
171  }