1 |
/* key.c - Key and keyList objects |
/* key.c - Key objects |
2 |
* Copyright (C) 2000, 2001 Werner Koch (dd9jn), g10 Code GmbH |
* Copyright (C) 2000, 2001 Werner Koch (dd9jn), g10 Code GmbH |
3 |
* Copyright (C) 2001-2004 Timo Schulz |
* Copyright (C) 2001-2005 Timo Schulz |
4 |
* |
* |
5 |
* This file is part of MyGPGME. |
* This file is part of MyGPGME. |
6 |
* |
* |
31 |
#include "key.h" |
#include "key.h" |
32 |
|
|
33 |
static const char * |
static const char * |
34 |
pkalgo_to_string( int algo ) |
pkalgo_to_string (int algo) |
35 |
{ |
{ |
36 |
switch( algo ) { |
switch (algo) { |
37 |
case 0: |
case 0: |
38 |
case 1: |
case 1: |
39 |
case 2: |
case 2: |
40 |
case 3: return "RSA"; |
case 3: return "RSA"; |
|
case 16: |
|
|
case 20: return "ElG"; |
|
41 |
case 17: return "DSA"; |
case 17: return "DSA"; |
42 |
default: return "Unknown"; |
case 16: |
43 |
|
case 20: return "ELG"; |
44 |
|
default: return "???"; |
45 |
} |
} |
46 |
} /* pkalgo_to_string */ |
} /* pkalgo_to_string */ |
47 |
|
|
48 |
|
|
49 |
static gpgme_error_t |
static gpgme_error_t |
50 |
key_new( gpgme_key_t *r_key, int secret ) |
key_new (gpgme_key_t *r_key, int secret) |
51 |
{ |
{ |
52 |
gpgme_key_t key; |
gpgme_key_t key; |
53 |
|
|
54 |
if( r_key ) |
if (r_key) |
55 |
*r_key = NULL; |
*r_key = NULL; |
56 |
key = calloc ( 1, sizeof *key ); |
key = calloc (1, sizeof *key); |
57 |
if (!key) |
if (!key) |
58 |
return mk_error (Out_Of_Core); |
return mk_error (Out_Of_Core); |
59 |
key->ref_count = 1; |
key->ref_count = 1; |
187 |
|
|
188 |
|
|
189 |
static char * |
static char * |
190 |
set_user_id_part( char *tail, const char *buf, size_t len ) |
set_user_id_part (char *tail, const char *buf, size_t len) |
191 |
{ |
{ |
192 |
while ( len && (buf[len-1] == ' ' || buf[len-1] == '\t') ) |
while (len && (buf[len-1] == ' ' || buf[len-1] == '\t')) |
193 |
len--; |
len--; |
194 |
for ( ; len; len--) |
for (; len; len--) |
195 |
*tail++ = *buf++; |
*tail++ = *buf++; |
196 |
*tail++ = 0; |
*tail++ = 0; |
197 |
return tail; |
return tail; |
306 |
uid->next = NULL; |
uid->next = NULL; |
307 |
dst = uid->name; |
dst = uid->name; |
308 |
|
|
309 |
_gpgme_decode_c_string( s, &dst, strlen( s )+1 ); |
_gpgme_decode_c_string (s, &dst, strlen (s)+1); |
310 |
dst += strlen( s ) + 1; |
dst += strlen (s) + 1; |
311 |
parse_user_id( uid, dst ); |
parse_user_id (uid, dst); |
312 |
|
|
313 |
if (!key->uids) |
if (!key->uids) |
314 |
key->uids = uid; |
key->uids = uid; |
336 |
"es", |
"es", |
337 |
"esc" |
"esc" |
338 |
}; |
}; |
339 |
return strings[ (!!k->flags.can_encrypt << 2) |
return strings[ (!!k->flags.can_encrypt << 2) |
340 |
| (!!k->flags.can_sign << 1) |
| (!!k->flags.can_sign << 1) |
341 |
| (!!k->flags.can_certify ) ]; |
| (!!k->flags.can_certify )]; |
342 |
} |
} |
343 |
|
|
344 |
const char * |
const char * |
345 |
gpgme_key_get_string_attr( gpgme_key_t key, gpgme_attr_t what, |
gpgme_key_get_string_attr (gpgme_key_t key, gpgme_attr_t what, |
346 |
void **reserved, int idx ) |
void **reserved, int idx) |
347 |
{ |
{ |
348 |
const char *val = NULL; |
const char *val = NULL; |
349 |
struct subkey_s * k; |
struct subkey_s * k; |
483 |
case GPGME_ATTR_KEYDAT_VAL: |
case GPGME_ATTR_KEYDAT_VAL: |
484 |
for( m=key->pkey; m && idx; m=m->next, idx-- ) |
for( m=key->pkey; m && idx; m=m->next, idx-- ) |
485 |
; |
; |
486 |
if( m ) |
if (m) |
487 |
val = m->hexval; |
val = m->hexval; |
488 |
break; |
break; |
489 |
|
|
511 |
|
|
512 |
|
|
513 |
unsigned long |
unsigned long |
514 |
gpgme_key_get_ulong_attr( gpgme_key_t key, gpgme_attr_t what, |
gpgme_key_get_ulong_attr (gpgme_key_t key, gpgme_attr_t what, |
515 |
void ** reserved, int idx ) |
void **reserved, int idx) |
516 |
{ |
{ |
517 |
unsigned long val = 0; |
unsigned long val = 0; |
518 |
struct subkey_s * k; |
struct subkey_s * k; |
522 |
struct mpi_s * m; |
struct mpi_s * m; |
523 |
int n=0; |
int n=0; |
524 |
|
|
525 |
if( !key ) |
if (!key || idx < 0) |
|
return 0; |
|
|
if( idx < 0 ) |
|
526 |
return 0; |
return 0; |
527 |
|
|
528 |
switch( what ) { |
switch( what ) { |
529 |
case GPGME_ATTR_ALGO: |
case GPGME_ATTR_ALGO: |
530 |
for (k=&key->keys; k && idx; k=k->next, idx-- ) |
for (k=&key->keys; k && idx; k=k->next, idx--) |
531 |
; |
; |
532 |
if (k) |
if (k) |
533 |
val = (unsigned long)k->key_algo; |
val = (unsigned long)k->key_algo; |
534 |
break; |
break; |
535 |
|
|
536 |
case GPGME_ATTR_LEN: |
case GPGME_ATTR_LEN: |
537 |
for (k=&key->keys; k && idx; k=k->next, idx-- ) |
for (k=&key->keys; k && idx; k=k->next, idx--) |
538 |
; |
; |
539 |
if (k) |
if (k) |
540 |
val = (unsigned long)k->key_len; |
val = (unsigned long)k->key_len; |
711 |
val = key->gloflags.disabled; |
val = key->gloflags.disabled; |
712 |
break; |
break; |
713 |
|
|
714 |
|
case GPGME_ATTR_VERSION: { |
715 |
|
char *fpr = key->keys.fingerprint; |
716 |
|
if (!fpr) |
717 |
|
val = 4; |
718 |
|
else if (key->keys.key_algo == GPGME_PK_RSA && |
719 |
|
strlen (fpr) == 32) |
720 |
|
val = 3; |
721 |
|
} |
722 |
|
break; |
723 |
|
|
724 |
case GPGME_ATTR_KEY_USABLE: |
case GPGME_ATTR_KEY_USABLE: |
725 |
n = 3; |
n = 4; |
726 |
for (k=&key->keys; k && idx; k=k->next, idx--) |
for (k=&key->keys; k && idx; k=k->next, idx--) |
727 |
; |
; |
728 |
if (k) |
if (k) { |
|
{ |
|
729 |
if (!k->flags.revoked) |
if (!k->flags.revoked) |
730 |
n--; |
n--; |
731 |
if (!k->flags.expired) |
if (!k->flags.expired) |
732 |
n--; |
n--; |
733 |
if (!k->flags.invalid) |
if (!k->flags.invalid) |
734 |
n--; |
n--; |
735 |
|
if (!key->gloflags.disabled && !k->flags.disabled) |
736 |
|
n--; |
737 |
} |
} |
738 |
if (n == 0) |
if (n == 0) |
739 |
val = 1; |
val = 1; |
747 |
|
|
748 |
|
|
749 |
const char* |
const char* |
750 |
gpgme_key_expand_attr( int what, unsigned long attr ) |
gpgme_key_expand_attr (int what, unsigned long attr) |
751 |
{ |
{ |
752 |
static char tmpbuf[16+1]; |
static char tmpbuf[16+1]; |
753 |
struct tm *iso_date; |
struct tm *iso_date; |
754 |
|
|
755 |
switch( what ) { |
switch( what ) { |
756 |
case GPGME_ATTR_ALGO: |
case GPGME_ATTR_ALGO: |
757 |
switch( attr ) { |
return pkalgo_to_string (attr); |
|
case 0: |
|
|
case 1: |
|
|
case 2: |
|
|
case 3: return "RSA"; |
|
|
case 16: |
|
|
case 20: return "ELG"; |
|
|
case 17: return "DSA"; |
|
|
} |
|
|
return "???"; |
|
758 |
|
|
759 |
case GPGME_ATTR_ALGO_SHORT: |
case GPGME_ATTR_ALGO_SHORT: |
760 |
switch( attr ) { |
switch( attr ) { |
819 |
|
|
820 |
|
|
821 |
int |
int |
822 |
gpgme_key_get_cability( gpgme_key_t key, int attr, int keyidx ) |
gpgme_key_get_cability (gpgme_key_t key, int attr, int keyidx) |
823 |
{ |
{ |
824 |
struct subkey_s *s; |
struct subkey_s *s; |
825 |
|
|
846 |
return 0; |
return 0; |
847 |
} /* gpgme_key_get_cability */ |
} /* gpgme_key_get_cability */ |
848 |
|
|
849 |
|
|
850 |
int |
int |
851 |
gpgme_key_count_items (gpgme_key_t key, int what) |
gpgme_key_count_items (gpgme_key_t key, int what) |
852 |
{ |
{ |
858 |
} dat; |
} dat; |
859 |
int count = 0; |
int count = 0; |
860 |
|
|
861 |
if( !key ) |
if (!key) |
862 |
return 0; |
return 0; |
863 |
switch( what ) { |
switch( what ) { |
864 |
case GPGME_ATTR_USERID: |
case GPGME_ATTR_USERID: |
877 |
return count; |
return count; |
878 |
|
|
879 |
case GPGME_ATTR_SIG_KEYID: |
case GPGME_ATTR_SIG_KEYID: |
880 |
for( dat.s = key->sigs; dat.s; dat.s = dat.s->next ) |
for (dat.s = key->sigs; dat.s; dat.s = dat.s->next) |
881 |
count++; |
count++; |
882 |
return count; |
return count; |
883 |
} |
} |
903 |
int |
int |
904 |
gpgme_key_cability_from_algo (gpgme_pk_cipher_t algo) |
gpgme_key_cability_from_algo (gpgme_pk_cipher_t algo) |
905 |
{ |
{ |
906 |
switch( algo ) { |
switch (algo) { |
907 |
case GPGME_PK_DSA: |
case GPGME_PK_DSA: |
908 |
case GPGME_PK_RSA_S: |
case GPGME_PK_RSA_S: |
909 |
return GPGME_KEY_CANSIGN; |
return GPGME_KEY_CANSIGN; |
921 |
} /* gpgme_key_cability_from_algo */ |
} /* gpgme_key_cability_from_algo */ |
922 |
|
|
923 |
|
|
924 |
int |
gpgme_error_t |
925 |
gpgme_key_append (gpgme_key_t dst, gpgme_key_t src, int idx) |
gpgme_key_append (gpgme_key_t dst, gpgme_key_t src, int idx) |
926 |
{ |
{ |
927 |
struct subkey_s *s, *key; |
struct subkey_s *s, *key; |