diff options
Diffstat (limited to 'base/native-tools/src/tkstool/retrieve.c')
-rw-r--r-- | base/native-tools/src/tkstool/retrieve.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/base/native-tools/src/tkstool/retrieve.c b/base/native-tools/src/tkstool/retrieve.c new file mode 100644 index 000000000..44cf3c069 --- /dev/null +++ b/base/native-tools/src/tkstool/retrieve.c @@ -0,0 +1,114 @@ +/* --- 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" + +PK11SymKey * +TKS_RetrieveSymKey( PK11SlotInfo *slot, + char *keyname, + void *pwdata ) +{ + char *name = NULL; + int count = 0; + int keys_found = 0; + PK11SymKey *symKey = NULL; + PK11SymKey *nextSymKey = NULL; + PK11SymKey *rvSymKey = NULL; + + 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 ) { + name = PK11_GetSymKeyNickname( /* symmetric key */ symKey ); + if( name != NULL ) { + if( keyname != NULL ) { + if( PL_strcmp( keyname, name ) == 0 ) { + 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 ) { + /* the specified token is empty */ + rvSymKey = NULL; + goto retrievedSymKey; + } + + /* case 2: the specified key is not on this token */ + if( ( keyname != NULL ) && + ( keys_found == 0 ) ) { + /* the key called "keyname" could not be found */ + rvSymKey = NULL; + goto retrievedSymKey; + } + + /* case 3: the specified key exists more than once on this token */ + if( keys_found != 1 ) { + /* more than one key called "keyname" was found on this token */ + rvSymKey = NULL; + goto retrievedSymKey; + } else { + /* Re-initialize the symmetric key list. */ + symKey = PK11_ListFixedKeysInSlot( + /* slot */ slot, + /* nickname */ NULL, + /* wincx */ ( void *) pwdata ); + + /* Reiterate through the symmetric key list once more, */ + /* this time returning an actual reference to the key. */ + while( symKey != NULL ) { + name = PK11_GetSymKeyNickname( /* symmetric key */ symKey ); + if( name != NULL ) { + if( keyname != NULL ) { + if( PL_strcmp( keyname, name ) == 0 ) { + rvSymKey = symKey; + goto retrievedSymKey; + } + } + } + + nextSymKey = PK11_GetNextSymKey( /* symmetric key */ symKey ); + PK11_FreeSymKey( /* symmetric key */ symKey ); + symKey = nextSymKey; + } + } + +retrievedSymKey: + return rvSymKey; +} + |