diff options
Diffstat (limited to 'base/native-tools/src/tkstool/list.c')
-rw-r--r-- | base/native-tools/src/tkstool/list.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/base/native-tools/src/tkstool/list.c b/base/native-tools/src/tkstool/list.c new file mode 100644 index 000000000..44173fa36 --- /dev/null +++ b/base/native-tools/src/tkstool/list.c @@ -0,0 +1,181 @@ +/* --- BEGIN COPYRIGHT BLOCK --- + * 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; version 2 of the License. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Copyright (C) 2007 Red Hat, Inc. + * All rights reserved. + * --- END COPYRIGHT BLOCK --- + */ + +#include "tkstool.h" + +/* callback for listing keys through pkcs11 */ +static SECStatus +PrintSymKey( struct PRFileDesc *out, + int count, + char *keyname, + PK11SymKey *key ) +{ + char *name = NULL; + SECStatus rv = SECFailure; + + name = PK11_GetSymKeyNickname( /* symmetric key */ key ); + if( name == NULL ) { + name = PORT_Strdup( "\t< orphaned >" ); + } + + if( keyname != NULL ) { + /* ONLY print this name if it is the requested key */ + if( PL_strcmp( keyname, name ) == 0 ) { + PR_fprintf( out, + "\t<%d> %s\n", + count, + name ); + + rv = SECSuccess; + } + } else { + PR_fprintf( out, + "\t<%d> %s\n", + count, + name ); + + rv = SECSuccess; + } + + PORT_Free( name ); + + return rv; +} + + +static SECStatus +listKeys( char *progName, + PK11SlotInfo *slot, + char *keyname, + void *pwdata ) +{ + int count = 0; + int keys_found = 0; + PK11SymKey *symKey = NULL; + PK11SymKey *nextSymKey = NULL; + SECStatus rvPrint = SECFailure; + + if( PK11_NeedLogin( /* slot */ slot ) ) { + PK11_Authenticate( + /* slot */ slot, + /* load certs */ PR_TRUE, + /* wincx */ pwdata ); + } + + /* Initialize the symmetric key list. */ + symKey = PK11_ListFixedKeysInSlot( + /* slot */ slot, + /* nickname */ NULL, + /* wincx */ ( void *) pwdata ); + + /* Iterate through the symmetric key list. */ + while( symKey != NULL ) { + rvPrint = PrintSymKey( PR_STDOUT, + count, + keyname, + symKey ); + if( rvPrint != SECFailure ) { + keys_found++; + } + + nextSymKey = PK11_GetNextSymKey( /* symmetric key */ symKey ); + PK11_FreeSymKey( /* symmetric key */ symKey ); + symKey = nextSymKey; + + count++; + } + + /* case 1: the token is empty */ + if( count == 0 ) { + PR_fprintf( PR_STDOUT, + "\t%s: the specified token is empty\n", + progName ); + + return SECFailure; + } + + /* case 2: the specified key is not on this token */ + if( ( keyname != NULL ) && + ( keys_found == 0 ) ) { + PR_fprintf( PR_STDOUT, + "\t%s: the key called \"%s\" could not be found\n", + progName, + keyname ); + + return SECFailure; + } + + return SECSuccess; +} + + +SECStatus +TKS_ListKeys( char *progName, + PK11SlotInfo *slot, + char *keyname, + int index, + PRBool dopriv, + secuPWData *pwdata ) +{ + SECStatus rv = SECSuccess; + + if( slot == NULL ) { + PK11SlotList *list; + PK11SlotListElement *le; + + list = PK11_GetAllTokens( + /* mechanism type */ CKM_INVALID_MECHANISM, + /* need R/W */ PR_FALSE, + /* load certs */ PR_FALSE, + /* wincx */ pwdata ); + + if( list ) { + for( le = list->head ; le ; le = le->next ) { + PR_fprintf( PR_STDOUT, + "\n slot: %s\n", + PK11_GetSlotName( /* slot */ le->slot ) ); + + PR_fprintf( PR_STDOUT, + "token: %s\n\n", + PK11_GetTokenName( /* slot */ le->slot ) ); + + rv = listKeys( progName, + le->slot, + keyname, + pwdata ); + } + } + } else { + PR_fprintf( PR_STDOUT, + "\n slot: %s\n", + PK11_GetSlotName( /* slot */ slot ) ); + + PR_fprintf( PR_STDOUT, + "token: %s\n\n", + PK11_GetTokenName( /* slot */ slot ) ); + + rv = listKeys( progName, + slot, + keyname, + pwdata ); + } + + return rv; +} + |