partial DSA support
[gnupg.git] / g10 / getkey.c
index dd72f6d..300e33b 100644 (file)
@@ -168,6 +168,7 @@ cache_public_cert( PKT_public_cert *pkc )
     u32 keyid[2];
 
     if( pkc->pubkey_algo == PUBKEY_ALGO_ELGAMAL
+       || pkc->pubkey_algo == PUBKEY_ALGO_DSA
        || pkc->pubkey_algo == PUBKEY_ALGO_RSA ) {
        keyid_from_pkc( pkc, keyid );
     }
@@ -323,6 +324,8 @@ get_pubkey_byname( PKT_public_cert *pkc, const char *name )
        int i;
        char buf[9];
 
+       if( *s == '0' && s[1] == 'x' && isxdigit(s[2]) )
+           s += 2; /*kludge to allow 0x034343434 */
        for(i=0; isxdigit(s[i]); i++ )
            ;
        if( s[i] && !isspace(s[i]) ) /* not terminated by EOS or blank*/
@@ -419,6 +422,33 @@ get_seckey( PKT_secret_cert *skc, u32 *keyid )
 }
 
 /****************
+ * Check wether the secret key is available
+ * Returns: 0 := key is available
+ *         G10ERR_NO_SECKEY := not availabe
+ */
+int
+seckey_available( u32 *keyid )
+{
+    PKT_secret_cert *skc;
+    STRLIST sl;
+    int rc=0;
+
+    skc = m_alloc_clear( sizeof *skc );
+    for(sl = secret_keyrings; sl; sl = sl->next )
+       if( !(rc=scan_secret_keyring( skc, keyid, NULL, sl->d )) )
+           goto found;
+    /* fixme: look at other places */
+    goto leave;
+
+  found:
+  leave:
+    free_secret_cert( skc );
+    return rc;
+}
+
+
+
+/****************
  * Get a secret key by name and store it into skc
  * If NAME is NULL use the default certificate
  */
@@ -516,6 +546,7 @@ scan_keyring( PKT_public_cert *pkc, u32 *keyid,
        else if( keyid && pkt.pkttype == PKT_PUBLIC_CERT ) {
            switch( pkt.pkt.public_cert->pubkey_algo ) {
              case PUBKEY_ALGO_ELGAMAL:
+             case PUBKEY_ALGO_DSA:
              case PUBKEY_ALGO_RSA:
                keyid_from_pkc( pkt.pkt.public_cert, akeyid );
                if( (shortkeyid || akeyid[0] == keyid[0])
@@ -567,6 +598,7 @@ scan_keyring( PKT_public_cert *pkc, u32 *keyid,
                            pkt.pkt.user_id->len, pkt.pkt.user_id->name);
            else {
                if( last_pk->pubkey_algo == PUBKEY_ALGO_ELGAMAL
+                   || last_pk->pubkey_algo == PUBKEY_ALGO_DSA
                    || last_pk->pubkey_algo == PUBKEY_ALGO_RSA ) {
                     keyid_from_pkc( last_pk, akeyid );
                     cache_user_id( pkt.pkt.user_id, akeyid );
@@ -628,6 +660,7 @@ scan_secret_keyring( PKT_secret_cert *skc, u32 *keyid,
        else if( keyid && pkt.pkttype == PKT_SECRET_CERT ) {
            switch( pkt.pkt.secret_cert->pubkey_algo ) {
              case PUBKEY_ALGO_ELGAMAL:
+             case PUBKEY_ALGO_DSA:
              case PUBKEY_ALGO_RSA:
                if( get_first ) {
                    copy_secret_cert( skc, pkt.pkt.secret_cert );
@@ -683,6 +716,7 @@ scan_secret_keyring( PKT_secret_cert *skc, u32 *keyid,
                            pkt.pkt.user_id->len, pkt.pkt.user_id->name);
            else {
                if( last_pk->pubkey_algo == PUBKEY_ALGO_ELGAMAL
+                  || last_pk->pubkey_algo == PUBKEY_ALGO_DSA
                   || last_pk->pubkey_algo == PUBKEY_ALGO_RSA ) {
                    keyid_from_skc( last_pk, akeyid );
                    cache_user_id( pkt.pkt.user_id, akeyid );