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