2016-04-22 23:05:54 +03:00
/*
Unix SMB / CIFS implementation .
Minimal ktutil for selftest
Copyright ( C ) Ralph Boehme < slow @ samba . org > 2016
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "krb5_wrap/krb5_samba.h"
static void smb_krb5_err ( TALLOC_CTX * mem_ctx ,
krb5_context context ,
int exit_code ,
krb5_error_code code ,
const char * msg )
{
char * krb5_err_str = smb_get_krb5_error_message ( context ,
code ,
mem_ctx ) ;
printf ( " %s: %s \n " , msg , krb5_err_str ? krb5_err_str : " UNKOWN " ) ;
talloc_free ( mem_ctx ) ;
exit ( exit_code ) ;
}
int main ( int argc , char * * argv )
{
TALLOC_CTX * mem_ctx = talloc_init ( " ktutil " ) ;
krb5_context context ;
krb5_keytab keytab ;
krb5_kt_cursor cursor ;
krb5_keytab_entry entry ;
krb5_error_code ret ;
char * keytab_name = NULL ;
if ( mem_ctx = = NULL ) {
printf ( " talloc_init() failed \n " ) ;
exit ( 1 ) ;
}
if ( argc ! = 2 ) {
printf ( " Usage: %s KEYTAB \n " , argv [ 0 ] ) ;
exit ( 1 ) ;
}
keytab_name = argv [ 1 ] ;
initialize_krb5_error_table ( ) ;
ret = krb5_init_context ( & context ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_context " ) ;
}
2016-08-29 11:42:57 +03:00
ret = smb_krb5_kt_open_relative ( context , keytab_name , false , & keytab ) ;
2016-04-22 23:05:54 +03:00
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " open keytab " ) ;
}
ret = krb5_kt_start_seq_get ( context , keytab , & cursor ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_kt_start_seq_get " ) ;
}
for ( ret = krb5_kt_next_entry ( context , keytab , & entry , & cursor ) ;
ret = = 0 ;
ret = krb5_kt_next_entry ( context , keytab , & entry , & cursor ) )
{
char * principal = NULL ;
char * enctype_str = NULL ;
2016-08-29 10:17:37 +03:00
krb5_enctype enctype = smb_krb5_kt_get_enctype_from_entry ( & entry ) ;
2016-04-22 23:05:54 +03:00
ret = smb_krb5_unparse_name ( mem_ctx ,
context ,
entry . principal ,
& principal ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_enctype_to_string " ) ;
}
ret = smb_krb5_enctype_to_string ( context ,
enctype ,
& enctype_str ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_enctype_to_string " ) ;
}
printf ( " %s (%s) \n " , principal , enctype_str ) ;
TALLOC_FREE ( principal ) ;
SAFE_FREE ( enctype_str ) ;
smb_krb5_kt_free_entry ( context , & entry ) ;
}
ret = krb5_kt_end_seq_get ( context , keytab , & cursor ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_kt_end_seq_get " ) ;
}
ret = krb5_kt_close ( context , keytab ) ;
if ( ret ) {
smb_krb5_err ( mem_ctx , context , 1 , ret , " krb5_kt_close " ) ;
}
krb5_free_context ( context ) ;
talloc_free ( mem_ctx ) ;
return 0 ;
}