/[winpt]/trunk/MyGPGME/getkey-openpgp.c
ViewVC logotype

Annotation of /trunk/MyGPGME/getkey-openpgp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (hide annotations)
Mon Apr 4 07:01:43 2005 UTC (19 years, 10 months ago) by twoaday
File MIME type: text/plain
File size: 3789 byte(s)
2005-03-22  Timo Schulz  <twoaday@freakmail.de>
                                                                                
        * editcard.c: Support new status-fd entries SC_OP_SUCCESS
        and SC_OP_FAILURE.
        * editkey.c (cmd_addrev_handler): Check if context != NULL.
        * import.c (import_command_handler): Wrong function signature.
        Noted by Kurt Fitzner.
        * types.h: Fixed encrypt_result_s. Noted by Kurt.
        * gpgme.h (gpgme_editkey_addrev_set): Changed return type.
        Kudos to Kurt.
        * key.c: Removed some unreachable code. By Kurt.
                                                                                


1 twoaday 2 /* getkey-openpgp.c - Kludge to use OpenPGP to emulate GPGME.
2     * Copyright (C) 2002, 2003 Timo Schulz
3     *
4     * This file is part of MyGPGME.
5     *
6     * MyGPGME is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * MyGPGME is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20    
21     #include <stdio.h>
22     #include <sys/types.h>
23     #include <string.h>
24     #include <stdlib.h>
25     #include <windows.h>
26    
27     #include "gpgme-config.h"
28     #ifdef WITH_OPENPGP
29     #include "context.h"
30     #include "ops.h"
31     #include "util.h"
32     #include "key.h"
33     #include "openpgp.h"
34    
35    
36     static void
37     set_subkey( struct subkey_s * s, PKT_public_key * pk )
38     {
39     s->key_algo = pk->pubkey_algo;
40     s->timestamp = pk->timestamp;
41     s->flags.can_encrypt = gpgme_key_cability_from_algo( s->key_algo ) & 0x02;
42     s->flags.can_certify = gpgme_key_cability_from_algo( s->key_algo ) & 0x01;
43     s->flags.can_sign = gpgme_key_cability_from_algo( s->key_algo ) & 0x01;
44     if( pk->expiredate )
45     s->flags.expired = pk->expiredate> pk->timestamp? 1 : 0;
46     s->flags.revoked = pk->is_revoked? 1 : 0;
47     }
48    
49    
50     static void
51     set_subkey_fprints( struct subkey_s * s, byte *fpr, size_t fprlen )
52     {
53     char skeyid[16+1], sfpr[40+1];
54     int i;
55    
56     for( i = 0; i < 8; i++ )
57     sprintf( skeyid + 2*i, "%02X", fpr[i+12] );
58     skeyid[16] = '\0';
59     memcpy( s->keyid, skeyid, 16 );
60     s->keyid[16] = '\0';
61     for( i = 0; i < 20; i++ )
62     sprintf( sfpr + 2*i, "%02X", fpr[i] );
63     sfpr[40] = '\0';
64     s->fingerprint = malloc( 41 );
65     if( s->fingerprint ) {
66     memcpy( s->fingerprint, sfpr, 40 );
67     s->fingerprint[40] = '\0';
68     }
69     }
70    
71    
72     int
73     gpgme_getkey_bykeyid( void *fd_handle, const char * keyid, gpgme_key_t *r_key )
74     {
75     PACKET * pkt = NULL;
76     gpg_kbnode_t key = NULL, ctx = NULL, n;
77     gpgme_key_t _key = NULL;
78     gpg_iobuf_t inp = fd_handle;
79     struct subkey_s * s;
80     u32 kid[2], pk_keyid;
81     byte fprint[21] = {0};
82     char buf[4];
83     size_t i;
84    
85     if( !fd_handle )
86     return mk_error( Invalid_Value );
87    
88     if( !strncmp( keyid, "0x", 2 ) )
89     keyid += 2;
90     for( i = 0; i < (strlen( keyid )+1) / 8; i++ ) {
91     strncpy( buf, keyid + 8*i, 8 );
92     kid[i] = strtoul( buf, NULL, 16 );
93     }
94     if( strlen( keyid ) == 8 ) {
95     kid[1] = kid[0];
96     kid[0] = 0;
97     }
98    
99     gpg_iobuf_seek( inp, 0 );
100     while( !gpg_read_keyblock( inp, &pkt, &key ) ) {
101 twoaday 7 while( (n = gpg_walk_kbnode( key, &ctx, 1 )) != NULL ) {
102 twoaday 2 switch( n->pkt->pkttype ) {
103     case PKT_PUBLIC_KEY:
104     case PKT_PUBLIC_SUBKEY:
105     pk_keyid = gpg_keyid_from_pk( n->pkt->pkt.public_key, fprint );
106     if( n->pkt->pkttype == PKT_PUBLIC_SUBKEY && _key )
107     ;
108     else if( pk_keyid != kid[1] )
109     break;
110     if( !_key )
111     _gpgme_key_new( &_key );
112     s = _gpgme_key_add_subkey( _key );
113     if( s ) {
114     set_subkey( s, n->pkt->pkt.public_key );
115     set_subkey_fprints( s, fprint, 20 );
116     }
117     break;
118    
119     case PKT_USER_ID:
120     if( !_key )
121     continue;
122     _gpgme_key_append_name( _key, n->pkt->pkt.user_id->name, NULL );
123     break;
124     }
125     }
126     gpg_release_kbnode( key );
127     key = NULL;
128     ctx = NULL;
129     if( _key )
130     break;
131     }
132     if( r_key )
133     *r_key = _key;
134     return 0;
135     }
136    
137    
138     #endif /*WITH_OPENPGP*/

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26