1c19800e8SDoug Rabson /* 2*ae771770SStanislav Sedov * Copyright (c) 2006 Kungliga Tekniska Högskolan 3c19800e8SDoug Rabson * (Royal Institute of Technology, Stockholm, Sweden). 4c19800e8SDoug Rabson * All rights reserved. 5c19800e8SDoug Rabson * 6c19800e8SDoug Rabson * Redistribution and use in source and binary forms, with or without 7c19800e8SDoug Rabson * modification, are permitted provided that the following conditions 8c19800e8SDoug Rabson * are met: 9c19800e8SDoug Rabson * 10c19800e8SDoug Rabson * 1. Redistributions of source code must retain the above copyright 11c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer. 12c19800e8SDoug Rabson * 13c19800e8SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 14c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer in the 15c19800e8SDoug Rabson * documentation and/or other materials provided with the distribution. 16c19800e8SDoug Rabson * 17c19800e8SDoug Rabson * 3. Neither the name of KTH nor the names of its contributors may be 18c19800e8SDoug Rabson * used to endorse or promote products derived from this software without 19c19800e8SDoug Rabson * specific prior written permission. 20c19800e8SDoug Rabson * 21c19800e8SDoug Rabson * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22c19800e8SDoug Rabson * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c19800e8SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24c19800e8SDoug Rabson * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25c19800e8SDoug Rabson * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26c19800e8SDoug Rabson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27c19800e8SDoug Rabson * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28c19800e8SDoug Rabson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29c19800e8SDoug Rabson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30c19800e8SDoug Rabson * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31c19800e8SDoug Rabson * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 32c19800e8SDoug Rabson 33c19800e8SDoug Rabson #include "krb5_locl.h" 34c19800e8SDoug Rabson #include <getarg.h> 35c19800e8SDoug Rabson 36c19800e8SDoug Rabson static void 37c19800e8SDoug Rabson test_int8(krb5_context context, krb5_storage *sp) 38c19800e8SDoug Rabson { 39c19800e8SDoug Rabson krb5_error_code ret; 40c19800e8SDoug Rabson int i; 41c19800e8SDoug Rabson int8_t val[] = { 42c19800e8SDoug Rabson 0, 1, -1, 128, -127 43c19800e8SDoug Rabson }, v; 44c19800e8SDoug Rabson 45*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 46*ae771770SStanislav Sedov 47c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 48c19800e8SDoug Rabson 49c19800e8SDoug Rabson ret = krb5_store_int8(sp, val[i]); 50c19800e8SDoug Rabson if (ret) 51c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_int8"); 52c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 53c19800e8SDoug Rabson ret = krb5_ret_int8(sp, &v); 54c19800e8SDoug Rabson if (ret) 55c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_int8"); 56c19800e8SDoug Rabson if (v != val[i]) 57c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 58c19800e8SDoug Rabson } 59c19800e8SDoug Rabson } 60c19800e8SDoug Rabson 61c19800e8SDoug Rabson static void 62c19800e8SDoug Rabson test_int16(krb5_context context, krb5_storage *sp) 63c19800e8SDoug Rabson { 64c19800e8SDoug Rabson krb5_error_code ret; 65c19800e8SDoug Rabson int i; 66c19800e8SDoug Rabson int16_t val[] = { 67c19800e8SDoug Rabson 0, 1, -1, 32768, -32767 68c19800e8SDoug Rabson }, v; 69c19800e8SDoug Rabson 70*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 71*ae771770SStanislav Sedov 72c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 73c19800e8SDoug Rabson 74c19800e8SDoug Rabson ret = krb5_store_int16(sp, val[i]); 75c19800e8SDoug Rabson if (ret) 76c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_int16"); 77c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 78c19800e8SDoug Rabson ret = krb5_ret_int16(sp, &v); 79c19800e8SDoug Rabson if (ret) 80c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_int16"); 81c19800e8SDoug Rabson if (v != val[i]) 82c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 83c19800e8SDoug Rabson } 84c19800e8SDoug Rabson } 85c19800e8SDoug Rabson 86c19800e8SDoug Rabson static void 87c19800e8SDoug Rabson test_int32(krb5_context context, krb5_storage *sp) 88c19800e8SDoug Rabson { 89c19800e8SDoug Rabson krb5_error_code ret; 90c19800e8SDoug Rabson int i; 91c19800e8SDoug Rabson int32_t val[] = { 92c19800e8SDoug Rabson 0, 1, -1, 2147483647, -2147483646 93c19800e8SDoug Rabson }, v; 94c19800e8SDoug Rabson 95*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 96*ae771770SStanislav Sedov 97c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 98c19800e8SDoug Rabson 99c19800e8SDoug Rabson ret = krb5_store_int32(sp, val[i]); 100c19800e8SDoug Rabson if (ret) 101c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_int32"); 102c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 103c19800e8SDoug Rabson ret = krb5_ret_int32(sp, &v); 104c19800e8SDoug Rabson if (ret) 105c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_int32"); 106c19800e8SDoug Rabson if (v != val[i]) 107c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 108c19800e8SDoug Rabson } 109c19800e8SDoug Rabson } 110c19800e8SDoug Rabson 111c19800e8SDoug Rabson static void 112c19800e8SDoug Rabson test_uint8(krb5_context context, krb5_storage *sp) 113c19800e8SDoug Rabson { 114c19800e8SDoug Rabson krb5_error_code ret; 115c19800e8SDoug Rabson int i; 116c19800e8SDoug Rabson uint8_t val[] = { 117c19800e8SDoug Rabson 0, 1, 255 118c19800e8SDoug Rabson }, v; 119c19800e8SDoug Rabson 120*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 121*ae771770SStanislav Sedov 122c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 123c19800e8SDoug Rabson 124c19800e8SDoug Rabson ret = krb5_store_uint8(sp, val[i]); 125c19800e8SDoug Rabson if (ret) 126c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_uint8"); 127c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 128c19800e8SDoug Rabson ret = krb5_ret_uint8(sp, &v); 129c19800e8SDoug Rabson if (ret) 130c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_uint8"); 131c19800e8SDoug Rabson if (v != val[i]) 132c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 133c19800e8SDoug Rabson } 134c19800e8SDoug Rabson } 135c19800e8SDoug Rabson 136c19800e8SDoug Rabson static void 137c19800e8SDoug Rabson test_uint16(krb5_context context, krb5_storage *sp) 138c19800e8SDoug Rabson { 139c19800e8SDoug Rabson krb5_error_code ret; 140c19800e8SDoug Rabson int i; 141c19800e8SDoug Rabson uint16_t val[] = { 142c19800e8SDoug Rabson 0, 1, 65535 143c19800e8SDoug Rabson }, v; 144c19800e8SDoug Rabson 145*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 146*ae771770SStanislav Sedov 147c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 148c19800e8SDoug Rabson 149c19800e8SDoug Rabson ret = krb5_store_uint16(sp, val[i]); 150c19800e8SDoug Rabson if (ret) 151c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_uint16"); 152c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 153c19800e8SDoug Rabson ret = krb5_ret_uint16(sp, &v); 154c19800e8SDoug Rabson if (ret) 155c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_uint16"); 156c19800e8SDoug Rabson if (v != val[i]) 157c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 158c19800e8SDoug Rabson } 159c19800e8SDoug Rabson } 160c19800e8SDoug Rabson 161c19800e8SDoug Rabson static void 162c19800e8SDoug Rabson test_uint32(krb5_context context, krb5_storage *sp) 163c19800e8SDoug Rabson { 164c19800e8SDoug Rabson krb5_error_code ret; 165c19800e8SDoug Rabson int i; 166c19800e8SDoug Rabson uint32_t val[] = { 167c19800e8SDoug Rabson 0, 1, 4294967295UL 168c19800e8SDoug Rabson }, v; 169c19800e8SDoug Rabson 170*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 171*ae771770SStanislav Sedov 172c19800e8SDoug Rabson for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { 173c19800e8SDoug Rabson 174c19800e8SDoug Rabson ret = krb5_store_uint32(sp, val[i]); 175c19800e8SDoug Rabson if (ret) 176c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_store_uint32"); 177c19800e8SDoug Rabson krb5_storage_seek(sp, 0, SEEK_SET); 178c19800e8SDoug Rabson ret = krb5_ret_uint32(sp, &v); 179c19800e8SDoug Rabson if (ret) 180c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_ret_uint32"); 181c19800e8SDoug Rabson if (v != val[i]) 182c19800e8SDoug Rabson krb5_errx(context, 1, "store and ret mismatch"); 183c19800e8SDoug Rabson } 184c19800e8SDoug Rabson } 185c19800e8SDoug Rabson 186c19800e8SDoug Rabson 187c19800e8SDoug Rabson static void 188*ae771770SStanislav Sedov test_storage(krb5_context context, krb5_storage *sp) 189c19800e8SDoug Rabson { 190c19800e8SDoug Rabson test_int8(context, sp); 191c19800e8SDoug Rabson test_int16(context, sp); 192c19800e8SDoug Rabson test_int32(context, sp); 193c19800e8SDoug Rabson test_uint8(context, sp); 194c19800e8SDoug Rabson test_uint16(context, sp); 195c19800e8SDoug Rabson test_uint32(context, sp); 196*ae771770SStanislav Sedov } 197c19800e8SDoug Rabson 198*ae771770SStanislav Sedov 199*ae771770SStanislav Sedov static void 200*ae771770SStanislav Sedov test_truncate(krb5_context context, krb5_storage *sp, int fd) 201*ae771770SStanislav Sedov { 202*ae771770SStanislav Sedov struct stat sb; 203*ae771770SStanislav Sedov 204*ae771770SStanislav Sedov krb5_store_string(sp, "hej"); 205*ae771770SStanislav Sedov krb5_storage_truncate(sp, 2); 206*ae771770SStanislav Sedov 207*ae771770SStanislav Sedov if (fstat(fd, &sb) != 0) 208*ae771770SStanislav Sedov krb5_err(context, 1, errno, "fstat"); 209*ae771770SStanislav Sedov if (sb.st_size != 2) 210*ae771770SStanislav Sedov krb5_errx(context, 1, "length not 2"); 211*ae771770SStanislav Sedov 212*ae771770SStanislav Sedov krb5_storage_truncate(sp, 1024); 213*ae771770SStanislav Sedov 214*ae771770SStanislav Sedov if (fstat(fd, &sb) != 0) 215*ae771770SStanislav Sedov krb5_err(context, 1, errno, "fstat"); 216*ae771770SStanislav Sedov if (sb.st_size != 1024) 217*ae771770SStanislav Sedov krb5_errx(context, 1, "length not 2"); 218*ae771770SStanislav Sedov } 219*ae771770SStanislav Sedov 220*ae771770SStanislav Sedov static void 221*ae771770SStanislav Sedov check_too_large(krb5_context context, krb5_storage *sp) 222*ae771770SStanislav Sedov { 223*ae771770SStanislav Sedov uint32_t too_big_sizes[] = { INT_MAX, INT_MAX / 2, INT_MAX / 4, INT_MAX / 8 + 1}; 224*ae771770SStanislav Sedov krb5_error_code ret; 225*ae771770SStanislav Sedov krb5_data data; 226*ae771770SStanislav Sedov size_t n; 227*ae771770SStanislav Sedov 228*ae771770SStanislav Sedov for (n = 0; n < sizeof(too_big_sizes) / sizeof(too_big_sizes); n++) { 229*ae771770SStanislav Sedov krb5_storage_truncate(sp, 0); 230*ae771770SStanislav Sedov krb5_store_uint32(sp, too_big_sizes[n]); 231*ae771770SStanislav Sedov krb5_storage_seek(sp, 0, SEEK_SET); 232*ae771770SStanislav Sedov ret = krb5_ret_data(sp, &data); 233*ae771770SStanislav Sedov if (ret != HEIM_ERR_TOO_BIG) 234*ae771770SStanislav Sedov errx(1, "not too big: %lu", (unsigned long)n); 235*ae771770SStanislav Sedov } 236c19800e8SDoug Rabson } 237c19800e8SDoug Rabson 238c19800e8SDoug Rabson /* 239c19800e8SDoug Rabson * 240c19800e8SDoug Rabson */ 241c19800e8SDoug Rabson 242c19800e8SDoug Rabson static int version_flag = 0; 243c19800e8SDoug Rabson static int help_flag = 0; 244c19800e8SDoug Rabson 245c19800e8SDoug Rabson static struct getargs args[] = { 246c19800e8SDoug Rabson {"version", 0, arg_flag, &version_flag, 247c19800e8SDoug Rabson "print version", NULL }, 248c19800e8SDoug Rabson {"help", 0, arg_flag, &help_flag, 249c19800e8SDoug Rabson NULL, NULL } 250c19800e8SDoug Rabson }; 251c19800e8SDoug Rabson 252c19800e8SDoug Rabson static void 253c19800e8SDoug Rabson usage (int ret) 254c19800e8SDoug Rabson { 255c19800e8SDoug Rabson arg_printusage (args, 256c19800e8SDoug Rabson sizeof(args)/sizeof(*args), 257c19800e8SDoug Rabson NULL, 258c19800e8SDoug Rabson ""); 259c19800e8SDoug Rabson exit (ret); 260c19800e8SDoug Rabson } 261c19800e8SDoug Rabson 262c19800e8SDoug Rabson int 263c19800e8SDoug Rabson main(int argc, char **argv) 264c19800e8SDoug Rabson { 265c19800e8SDoug Rabson krb5_context context; 266c19800e8SDoug Rabson krb5_error_code ret; 267*ae771770SStanislav Sedov int fd, optidx = 0; 268*ae771770SStanislav Sedov krb5_storage *sp; 269*ae771770SStanislav Sedov const char *fn = "test-store-data"; 270c19800e8SDoug Rabson 271c19800e8SDoug Rabson setprogname(argv[0]); 272c19800e8SDoug Rabson 273c19800e8SDoug Rabson if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 274c19800e8SDoug Rabson usage(1); 275c19800e8SDoug Rabson 276c19800e8SDoug Rabson if (help_flag) 277c19800e8SDoug Rabson usage (0); 278c19800e8SDoug Rabson 279c19800e8SDoug Rabson if(version_flag){ 280c19800e8SDoug Rabson print_version(NULL); 281c19800e8SDoug Rabson exit(0); 282c19800e8SDoug Rabson } 283c19800e8SDoug Rabson 284c19800e8SDoug Rabson argc -= optidx; 285c19800e8SDoug Rabson argv += optidx; 286c19800e8SDoug Rabson 287c19800e8SDoug Rabson ret = krb5_init_context (&context); 288c19800e8SDoug Rabson if (ret) 289c19800e8SDoug Rabson errx (1, "krb5_init_context failed: %d", ret); 290c19800e8SDoug Rabson 291*ae771770SStanislav Sedov /* 292*ae771770SStanislav Sedov * Test encoding/decoding of primotive types on diffrent backends 293*ae771770SStanislav Sedov */ 294*ae771770SStanislav Sedov 295*ae771770SStanislav Sedov sp = krb5_storage_emem(); 296*ae771770SStanislav Sedov if (sp == NULL) 297*ae771770SStanislav Sedov krb5_errx(context, 1, "krb5_storage_emem: no mem"); 298*ae771770SStanislav Sedov 299*ae771770SStanislav Sedov test_storage(context, sp); 300*ae771770SStanislav Sedov check_too_large(context, sp); 301*ae771770SStanislav Sedov krb5_storage_free(sp); 302*ae771770SStanislav Sedov 303*ae771770SStanislav Sedov 304*ae771770SStanislav Sedov fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0600); 305*ae771770SStanislav Sedov if (fd < 0) 306*ae771770SStanislav Sedov krb5_err(context, 1, errno, "open(%s)", fn); 307*ae771770SStanislav Sedov 308*ae771770SStanislav Sedov sp = krb5_storage_from_fd(fd); 309*ae771770SStanislav Sedov close(fd); 310*ae771770SStanislav Sedov if (sp == NULL) 311*ae771770SStanislav Sedov krb5_errx(context, 1, "krb5_storage_from_fd: %s no mem", fn); 312*ae771770SStanislav Sedov 313*ae771770SStanislav Sedov test_storage(context, sp); 314*ae771770SStanislav Sedov krb5_storage_free(sp); 315*ae771770SStanislav Sedov unlink(fn); 316*ae771770SStanislav Sedov 317*ae771770SStanislav Sedov /* 318*ae771770SStanislav Sedov * test truncate behavior 319*ae771770SStanislav Sedov */ 320*ae771770SStanislav Sedov 321*ae771770SStanislav Sedov fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0600); 322*ae771770SStanislav Sedov if (fd < 0) 323*ae771770SStanislav Sedov krb5_err(context, 1, errno, "open(%s)", fn); 324*ae771770SStanislav Sedov 325*ae771770SStanislav Sedov sp = krb5_storage_from_fd(fd); 326*ae771770SStanislav Sedov if (sp == NULL) 327*ae771770SStanislav Sedov krb5_errx(context, 1, "krb5_storage_from_fd: %s no mem", fn); 328*ae771770SStanislav Sedov 329*ae771770SStanislav Sedov test_truncate(context, sp, fd); 330*ae771770SStanislav Sedov krb5_storage_free(sp); 331*ae771770SStanislav Sedov close(fd); 332*ae771770SStanislav Sedov unlink(fn); 333c19800e8SDoug Rabson 334c19800e8SDoug Rabson krb5_free_context(context); 335c19800e8SDoug Rabson 336c19800e8SDoug Rabson return 0; 337c19800e8SDoug Rabson } 338