aboutsummaryrefslogtreecommitdiffstats
path: root/g10/ringedit.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1998-01-06 21:01:36 +0000
committerWerner Koch <[email protected]>1998-01-06 21:01:36 +0000
commit0d9ffec5efcafa9f6499a2c4e4e2784290faec2f (patch)
treed0fa2cef628b9f8c57753c5110ee2f6ad48cb66f /g10/ringedit.c
parentdistributed version 0.1.0 (diff)
downloadgnupg-0d9ffec5efcafa9f6499a2c4e4e2784290faec2f.tar.gz
gnupg-0d9ffec5efcafa9f6499a2c4e4e2784290faec2f.zip
Bug in blowfish behoben
Diffstat (limited to '')
-rw-r--r--g10/ringedit.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/g10/ringedit.c b/g10/ringedit.c
index 05a8bb299..8b7431961 100644
--- a/g10/ringedit.c
+++ b/g10/ringedit.c
@@ -58,6 +58,7 @@
struct resource_table_struct {
int used;
+ int secret; /* this is a secret keyring */
char *fname;
IOBUF iobuf;
};
@@ -94,7 +95,7 @@ check_pos( KBPOS *kbpos )
* Register a resource (which currently may ionly be a keyring file).
*/
int
-add_keyblock_resource( const char *filename, int force )
+add_keyblock_resource( const char *filename, int force, int secret )
{
IOBUF iobuf;
int i;
@@ -109,6 +110,7 @@ add_keyblock_resource( const char *filename, int force )
if( !iobuf && !force )
return G10ERR_OPEN_FILE;
resource_table[i].used = 1;
+ resource_table[i].secret = !!secret;
resource_table[i].fname = m_strdup(filename);
resource_table[i].iobuf = iobuf;
return 0;
@@ -120,12 +122,12 @@ add_keyblock_resource( const char *filename, int force )
* to get a handle for insert_keyblock for a new keyblock.
*/
int
-get_keyblock_handle( const char *filename, KBPOS *kbpos )
+get_keyblock_handle( const char *filename, int secret, KBPOS *kbpos )
{
int i;
for(i=0; i < MAX_RESOURCES; i++ )
- if( resource_table[i].used ) {
+ if( resource_table[i].used && !resource_table[i].secret == !secret ) {
/* fixme: dos needs case insensitive file compare */
if( !strcmp( resource_table[i].fname, filename ) ) {
memset( kbpos, 0, sizeof *kbpos );
@@ -148,12 +150,12 @@ get_keyblock_handle( const char *filename, KBPOS *kbpos )
* Returns: 0 if found, -1 if not found or an errorcode.
*/
int
-search_keyblock( PACKET *pkt, KBPOS *kbpos )
+search_keyblock( PACKET *pkt, KBPOS *kbpos, int secret )
{
int i, rc, last_rc=-1;
for(i=0; i < MAX_RESOURCES; i++ ) {
- if( resource_table[i].used ) {
+ if( resource_table[i].used && !resource_table[i].secret == !secret ) {
/* note: here we have to add different search functions,
* depending on the type of the resource */
rc = keyring_search( pkt, kbpos, resource_table[i].iobuf );
@@ -192,11 +194,36 @@ search_keyblock_byname( KBPOS *kbpos, const char *username )
init_packet( &pkt );
pkt.pkttype = PKT_PUBLIC_CERT;
pkt.pkt.public_cert = pkc;
- rc = search_keyblock( &pkt, kbpos );
+ rc = search_keyblock( &pkt, kbpos, 0 );
free_public_cert(pkc);
return rc;
}
+/****************
+ * Combined function to search for a username and get the position
+ * of the keyblock. This function does not unprotect the secret key.
+ */
+int
+search_secret_keyblock_byname( KBPOS *kbpos, const char *username )
+{
+ PACKET pkt;
+ PKT_secret_cert *skc = m_alloc_clear( sizeof *skc );
+ int rc;
+
+ rc = get_seckey_byname( skc, username, 0 );
+ if( rc ) {
+ free_secret_cert(skc);
+ return rc;
+ }
+
+ init_packet( &pkt );
+ pkt.pkttype = PKT_SECRET_CERT;
+ pkt.pkt.secret_cert = skc;
+ rc = search_keyblock( &pkt, kbpos, 1 );
+ free_secret_cert(skc);
+ return rc;
+}
+
/****************
* Lock the keyblock; wait until it's available