]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - crypto/heimdal/lib/gssapi/krb5/test_cfx.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / crypto / heimdal / lib / gssapi / krb5 / 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 "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 }