/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/* tests/test1.c - Regression tests for krb5 library */
/*
* Copyright 1990 by the Massachusetts Institute of Technology.
* All Rights Reserved.
*
* Export of this software from the United States of America may
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
*
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
* notice appear in all copies and that both that copyright notice and
* this permission notice appear in supporting documentation, and that
* the name of M.I.T. not be used in advertising or publicity pertaining
* to distribution of the software without specific, written prior
* permission. Furthermore if you modify this software you must label
* your software as modified software and not distribute it in such a
* fashion that it might be confused with the original M.I.T. software.
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
*/
#include "krb5.h"
unsigned char key_one[8] = { 0x10, 0x23, 0x32, 0x45, 0x54, 0x67, 0x76, 0x89 };
unsigned char key_two[8] = { 0xea, 0x89, 0x57, 0x76, 0x5b, 0xcd, 0x0d, 0x34 };
extern void dump_data();
tkt_test_1()
{
krb5_data *data;
krb5_ticket tk_in, *tk_out;
krb5_keyblock sess_k, serv_k, *nsess;
krb5_enc_tkt_part tk_in_enc;
int code;
krb5_address *addr_list[2];
krb5_address addr_1;
static krb5_octet ip_addr_1[4] = { 18, 72, 0, 122 };
char *out;
/*
* fill in some values on the "in" side of the ticket
*/
code = krb5_parse_name ("server/test/1@BOGUS.ORG", &tk_in.server);
if (code != 0) {
com_err("tkt_test_1", code, " parsing server principal");
return;
}
serv_k.enctype = 1; /* XXX symbolic constant */
serv_k.length = 8; /* XXX symbolic constant */
serv_k.contents = key_one;
sess_k.enctype = 1; /* XXX symbolic constant */
sess_k.length = 8; /* XXX symbolic constant */
sess_k.contents = key_two;
tk_in.etype = 1; /* XXX symbolic constant here */
tk_in.skvno = 4;
tk_in.enc_part2 = &tk_in_enc;
tk_in_enc.flags = 0x11;
tk_in_enc.session = &sess_k;
tk_in_enc.times.authtime = 42;
tk_in_enc.times.starttime = 43;
tk_in_enc.times.endtime = 44;
code = krb5_parse_name ("client/test/1@BOGUS.ORG", &tk_in_enc.client);
if (code != 0) {
com_err("tkt_test_1", code, " parsing client principal");
return;
}
tk_in_enc.transited.length = 0;
addr_1.addrtype = ADDRTYPE_INET; /* XXX should be KRB5_ADDR... */
addr_1.length = 4;
addr_1.contents = ip_addr_1;
addr_list[0] = &addr_1;
addr_list[1] = 0;
tk_in_enc.caddrs = addr_list;
tk_in_enc.authorization_data = 0;
code = krb5_encrypt_tkt_part(&serv_k, &tk_in);
if (code != 0) {
com_err ("tkt_test_1", code, " encrypting ticket");
return;
}
data = 0;
code = krb5_encode_ticket (&tk_in, &data);
if (code != 0) {
com_err ("tkt_test_1", code, " encoding ticket");
return;
}
dump_data(data);
tk_out = 0;
code = krb5_decode_ticket (data, &tk_out);
if (code != 0) {
com_err ("tkt_test_1", code, "decoding ticket");
return;
}
/* check the plaintext values */
if (tk_out->etype != 1) {
com_err ("tkt_test_1", 0, "wrong etype");
return;
}
if (tk_out->skvno != 4) {
com_err ("tkt_test_1", 0, "wrong kvno");
return;
}
code = krb5_unparse_name(tk_out->server, &out);
if (code != 0) {
com_err ("tkt_test_1", code, "couldn't unparse server principal");
return;
}
if (strcmp (out, "server/test/1@BOGUS.ORG") != 0) {
com_err("tkt_test_1", 0, "wrong server principal");
return;
}
free(out);
out = 0;
/* decode the ciphertext */
code = krb5_decrypt_tkt_part (&serv_k, tk_out);
if (code != 0) {
com_err ("tkt_test_1", code, "while decrypting ticket");
return;
}
/* check the contents */
if (tk_out->enc_part2->flags != 0x11) {
com_err("tkt_test_1", 0, "wrong flags");
return;
}
nsess = tk_out->enc_part2->session;
if (nsess->enctype != 1) {
com_err("tkt_test_1", 0, "wrong session key type");
return;
}
if (nsess->length != 8) {
com_err("tkt_test_1", 0, "wrong session key length");
return;
}
if (memcmp(nsess->contents, key_two, 8) != 0) {
com_err("tkt_test_1", 0, "wrong session key contents");
return;
}
code = krb5_unparse_name(tk_out->enc_part2->client, &out);
if (code != 0) {
com_err ("tkt_test_1", code, "couldn't unparse client principal");
return;
}
if (strcmp (out, "client/test/1@BOGUS.ORG") != 0) {
com_err("tkt_test_1", 0, "wrong client principal");
return;
}
free(out);
out = 0;
if (tk_out->enc_part2->transited.length != 0) {
com_err("tkt_test_1", 0, "wrong transited length");
return;
}
/* XXX should check address here, too */
/* XXX should check times here */
/* XXX should check auth. data here */
printf("test 1 passed\n");
}
main()
{
krb5_init_ets();
tkt_test_1();
}