[22624] in Kerberos
Help with Heimdal to MIT conversion of code
daemon@ATHENA.MIT.EDU (ronnie sahlberg)
Wed Oct 6 04:56:49 2004
Message-ID: <c9a3e454041006015349074c73@mail.gmail.com>
Date: Wed, 6 Oct 2004 18:53:59 +1000
From: ronnie sahlberg <ronniesahlberg@gmail.com>
To: kerberos@mit.edu
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_12_21653957.1097052839312"
Reply-To: ronnie sahlberg <ronniesahlberg@gmail.com>
Errors-To: kerberos-bounces@mit.edu
------=_Part_12_21653957.1097052839312
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Hi list
I am the guy that implemented Kerberos support in Ethereal to allow
users (given the keytab file is available) to decrypt the content of
tickets.
I would like to add support for MIT kerberos as well so that users can
select at compile time which particular version of kerberos they use
and get ethereal to compile for it.
I am not really a kerberos hacker and i am lazy.
Would anyone out there want to give me a hand in implementing a
MITized version of the small test program I have attached? If i get
this small proggie MITized I should be able to figure out how to merge
it into ethereal myself (modulo questions like how would I find out
the proper -l -L and -I directives to the gcc commandline)
The attached file is a program for Heimdal.
The idea is that the program reads a binary file containing an
encrypted blob (no asn1 encapsulation) then it opens the keytab file
and iterates over every single secret key in it and tries to decrypt
the blob.
If the decryption was successful, it writes it out again to a file.
any takers?
best regards
ronnie sahlberg
------=_Part_12_21653957.1097052839312
Content-Type: text/plain; name="decrypt.c"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="decrypt.c"
#include <sys/types.h>
#include <sys/stat.h>
#include <err.h>
#include <fcntl.h>
#include <krb5.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
readfile(const char *fn, krb5_data *data)
{
struct stat sb;
ssize_t ret;
int fd;
=20
fd =3D open(fn, O_RDONLY);
if (fd < 0)
=09err(1, "open");
=20
ret =3D fstat(fd, &sb);
if (ret < 0)
=09err(1, "fstat");
data->length =3D sb.st_size;
data->data =3D malloc(sb.st_size);
if (data->data =3D=3D NULL)
=09err(1, "malloc");
ret =3D read(fd, data->data, data->length);
if (ret < 0)
=09err(1, "read");
else if (ret !=3D data->length)
=09errx(1, "read complete early");
close(fd);
}
static void
writefile(const char *fn, krb5_data *data)
{
ssize_t ret;
int fd;
=20
fd =3D open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666);
if (fd < 0)
=09err(1, "open");
=20
ret =3D write(fd, data->data, data->length);
if (ret < 0)
=09err(1, "write");
else if (ret !=3D data->length)
=09errx(1, "write complete early");
close(fd);
}
static void
decrypt_krb5_data(krb5_context context,
=09=09 const char *name,
=09=09 krb5_keyusage usage,
=09=09 const krb5_data *encdata,
=09=09 krb5_data *data)
{
krb5_error_code ret;
krb5_keytab keytab;
krb5_keytab_entry entry;
krb5_kt_cursor cursor;
int ok =3D 0;
=20
ret =3D krb5_kt_resolve(context, name, &keytab);
if (ret)
=09krb5_err(context, 1, ret, "resolving keytab %s", name);
ret =3D krb5_kt_start_seq_get(context, keytab, &cursor);
if(ret)
=09krb5_err(context, 1, ret, "krb5_kt_start_seq_get %s", name);
while((ret =3D krb5_kt_next_entry(context, keytab, &entry, &cursor)) =
=3D=3D 0){
=09krb5_crypto crypto;
=09ret =3D krb5_crypto_init(context, &entry.keyblock, 0, &crypto);
=09if (ret)
=09 krb5_err(context, 1, ret, "krb5_crypto_init");
=09ret =3D krb5_decrypt_ivec(context, crypto, usage,=20
=09=09=09=09encdata->data, encdata->length,=20
=09=09=09=09data,=20
=09=09=09=09NULL);
=09if (ret =3D=3D 0) {
=09 char *principal;
=09 krb5_unparse_name(context, entry.principal, &principal);
=09 printf("%s\n", principal);
=09 ok =3D 1;
=09}
=09krb5_kt_free_entry(context, &entry);
=09krb5_crypto_destroy(context, crypto);
=09if (ok)
=09 break;
}
ret =3D krb5_kt_end_seq_get(context, keytab, &cursor);
if(ret)
=09krb5_err(context, 1, ret, "krb5_kt_end_seq_get %s", name);
krb5_kt_close(context, keytab);
if (!ok)
=09krb5_errx(context, 1, "didn't decrypt ok");
}
int
main(int argc, char **argv)
{
krb5_context context;
krb5_error_code ret;
krb5_data encdata, data;
ret =3D krb5_init_context(&context);
if (ret)
=09errx(1, "krb5_init_context: %d\n", ret);
=20
if (argc !=3D 4)
=09errx(1, "argc !=3D 4");
readfile(argv[2], &encdata);
decrypt_krb5_data(context, argv[1], 2, &encdata, &data);
writefile(argv[3], &data);
return 0;
}
------=_Part_12_21653957.1097052839312
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
________________________________________________
Kerberos mailing list Kerberos@mit.edu
https://mailman.mit.edu/mailman/listinfo/kerberos
------=_Part_12_21653957.1097052839312--