92bb59722e707104b71b47ab59e67ab7f5fee9bc
[gpgme.git] / gpgme / key.c
1 /* key.c - Key and keyList objects
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME 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  * GPGME 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 <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <assert.h>
25
26 #include "util.h"
27 #include "ops.h"
28 #include "key.h"
29
30 #define ALLOC_CHUNK 1024
31 #define my_isdigit(a) ( (a) >='0' && (a) <= '9' )
32
33
34 GpgmeError
35 _gpgme_key_new( GpgmeKey *r_key )
36 {
37     GpgmeKey key;
38
39     *r_key = NULL;
40     key = xtrycalloc ( 1, sizeof *key );
41     if (!key)
42         return mk_error (Out_Of_Core);
43
44     *r_key = key;
45     return 0;
46 }
47
48 void
49 _gpgme_key_release ( GpgmeKey key )
50 {
51     struct user_id_s *u, *u2;
52
53     if (!key)
54         return;
55
56     xfree (key->fingerprint);
57     for ( u = key->uids; u; u = u2 ) {
58         u2 = u->next;
59         xfree (u);
60     }
61     xfree (key);
62 }
63
64 /* 
65  * Take a name from the --with-colon listing, remove certain escape sequences
66  * sequences and put it into the list of UIDs
67  */
68 GpgmeError
69 _gpgme_key_append_name ( GpgmeKey key, const char *s )
70 {
71     struct user_id_s *uid;
72     char *d;
73
74     assert (key);
75     /* we can malloc a buffer of the same length, because the converted
76      * string will never be larger */
77     uid = xtrymalloc ( sizeof *uid + strlen (s) );
78     if ( !uid )
79         return mk_error (Out_Of_Core);
80     uid->validity = 0;
81     d = uid->name;
82
83     while ( *s ) {
84         if ( *s != '\\' )
85             *d++ = *s++;
86         else if ( s[1] == '\\' ) {
87             s++;
88             *d++ = *s++; 
89         }
90         else if ( s[1] == 'n' ) {
91             s += 2;
92             *d++ = '\n'; 
93         }
94         else if ( s[1] == 'r' ) {
95             s += 2;
96             *d++ = '\r'; 
97         }
98         else if ( s[1] == 'v' ) {
99             s += 2;
100             *d++ = '\v'; 
101         }
102         else if ( s[1] == 'b' ) {
103             s += 2;
104             *d++ = '\b'; 
105         }
106         else if ( s[1] == '0' ) {
107             /* Hmmm: no way to express this */
108             s += 2;
109             *d++ = '\\';
110             *d++ = '\0'; 
111         }
112         else if ( s[1] == 'x' && my_isdigit (s[2]) && my_isdigit (s[3]) ) {
113             unsigned int val = (s[2]-'0')*16 + (s[3]-'0');
114             if ( !val ) {
115                 *d++ = '\\';
116                 *d++ = '\0'; 
117             }
118             else 
119                 *(byte*)d++ = val;
120             s += 3;
121         }
122         else { /* should not happen */
123             s++;
124             *d++ = '\\'; 
125             *d++ = *s++;
126         } 
127     }
128
129     uid->next = key->uids;
130     key->uids = uid;
131     return 0;
132 }
133
134
135