bug fix release
[gnupg.git] / g10 / export.c
index 8440983..301cb5e 100644 (file)
 #include "util.h"
 #include "main.h"
 
+static int do_export( STRLIST users, int secret );
 
 /****************
- * Export the public keys (to standard out or --outout).
+ * Export the public keys (to standard out or --output).
  * Depending on opt.armor the output is armored.
- * If USERS is NULL, the complete ring wil. be exported.
+ * If USERS is NULL, the complete ring will be exported.
  */
 int
 export_pubkeys( STRLIST users )
 {
+    return do_export( users, 0 );
+}
+
+int
+export_seckeys( STRLIST users )
+{
+    return do_export( users, 1 );
+}
+
+static int
+do_export( STRLIST users, int secret )
+{
     int rc = 0;
     armor_filter_context_t afx;
     compress_filter_context_t zfx;
@@ -58,20 +71,19 @@ export_pubkeys( STRLIST users )
     memset( &zfx, 0, sizeof zfx);
     init_packet( &pkt );
 
-    if( !(out = open_outfile( NULL, 0 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    if( (rc = open_outfile( NULL, 0, &out )) )
        goto leave;
-    }
+
 
     if( opt.armor ) {
-       afx.what = 1;
+       afx.what = secret?5:1;
        iobuf_push_filter( out, armor_filter, &afx );
     }
-    if( opt.compress )
+    if( opt.compress_keys && opt.compress )
        iobuf_push_filter( out, compress_filter, &zfx );
 
     if( all ) {
-       rc = enum_keyblocks( 0, &kbpos, &keyblock );
+       rc = enum_keyblocks( secret?5:0, &kbpos, &keyblock );
        if( rc ) {
            if( rc != -1 )
                log_error("enum_keyblocks(open) failed: %s\n", g10_errstr(rc) );
@@ -80,7 +92,7 @@ export_pubkeys( STRLIST users )
        all = 2;
     }
 
-    /* use the correct sequence. strlist_last,prev do work correct with
+    /* use the correct sequence. strlist_last,prev do work correctly with
      * NULL pointers :-) */
     for( sl=strlist_last(users); sl || all ; sl=strlist_prev( users, sl )) {
        if( all ) { /* get the next user */
@@ -94,7 +106,8 @@ export_pubkeys( STRLIST users )
        }
        else {
            /* search the userid */
-           rc = find_keyblock_byname( &kbpos, sl->d );
+           rc = secret? find_secret_keyblock_byname( &kbpos, sl->d )
+                      : find_keyblock_byname( &kbpos, sl->d );
            if( rc ) {
                log_error("%s: user not found: %s\n", sl->d, g10_errstr(rc) );
                rc = 0;
@@ -111,6 +124,24 @@ export_pubkeys( STRLIST users )
 
        /* and write it */
        for( kbctx=NULL; (node = walk_kbnode( keyblock, &kbctx, 0 )); ) {
+           if( opt.do_not_export_rsa ) {
+               int algo;
+               switch( node->pkt->pkttype ) {
+                 /* note: we canĀ“ do this for subkeys here */
+                 case PKT_PUBLIC_KEY:
+                   algo = node->pkt->pkt.public_key->pubkey_algo;
+                   break;
+                 case PKT_SECRET_KEY:
+                   algo = node->pkt->pkt.secret_key->pubkey_algo;
+                   break;
+                 case PKT_SIGNATURE:
+                   algo = node->pkt->pkt.signature->pubkey_algo;
+                   break;
+                 default: algo = 0;
+               }
+               if( is_RSA(algo) )
+                   continue;
+           }
            if( (rc = build_packet( out, node->pkt )) ) {
                log_error("build_packet(%d) failed: %s\n",
                            node->pkt->pkttype, g10_errstr(rc) );