Changes needed to support smartcards. Well, only _support_. There is
[gnupg.git] / common / maperror.c
1 /* maperror.c - Error mapping
2  *      Copyright (C) 2001, 2002 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG 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  * GnuPG 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 <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <unistd.h>
28
29 #include <ksba.h>
30
31 #include "util.h"
32 #include "errors.h"
33 #include "../assuan/assuan.h"
34
35 /* Note: we might want to wrap this in a macro to get our hands on
36    the line and file where the error occired */
37 int
38 map_ksba_err (int err)
39 {
40   switch (err)
41     {
42     case -1:
43     case 0:
44       break;
45
46     case KSBA_Unsupported_Algorithm: err = GNUPG_Unsupported_Algorithm; break;
47     case KSBA_Invalid_Index: err = GNUPG_Invalid_Index; break;
48       
49     default:
50       err = seterr (General_Error);
51       break;
52     }
53   return err;
54 }
55
56
57 int 
58 map_gcry_err (int err)
59 {
60   switch (err)
61     {
62     case GCRYERR_EOF:
63     case -1:
64       err = -1;
65       break;
66
67     case 0:
68       break;
69
70     case GCRYERR_WRONG_PK_ALGO:
71     case GCRYERR_INV_PK_ALGO:
72     case GCRYERR_INV_MD_ALGO:
73     case GCRYERR_INV_CIPHER_ALGO:
74       err = GNUPG_Unsupported_Algorithm;
75       break;
76     case GCRYERR_INV_KEYLEN:
77     case GCRYERR_WEAK_KEY:
78     case GCRYERR_BAD_PUBLIC_KEY: err = GNUPG_Bad_Public_Key; break;
79     case GCRYERR_BAD_SECRET_KEY: err = GNUPG_Bad_Secret_Key; break;
80     case GCRYERR_BAD_SIGNATURE:  err = GNUPG_Bad_Signature; break;
81
82     case GCRYERR_BAD_MPI:
83       err = GNUPG_Bad_Data;
84       break;
85       
86     case GCRYERR_INV_ARG:
87     case GCRYERR_INV_OP:
88     case GCRYERR_INTERNAL:
89     case GCRYERR_INV_CIPHER_MODE:
90       err = GNUPG_Invalid_Value;
91       break;
92
93     case GCRYERR_SELFTEST: 
94       err = GNUPG_Bug;
95       break;
96
97     case GCRYERR_NO_MEM: err = GNUPG_Out_Of_Core; break;
98
99     case GCRYERR_NOT_IMPL:  err = GNUPG_Not_Implemented; break;
100     case GCRYERR_CONFLICT:  err = GNUPG_Conflict; break;
101       
102     case GCRYERR_INV_OBJ:   /* an object is not valid */
103     case GCRYERR_TOO_SHORT: /* provided buffer too short */
104     case GCRYERR_TOO_LARGE: /* object is too large */
105     case GCRYERR_NO_OBJ:    /* Missing item in an object */
106     default:
107       err = seterr (General_Error);
108       break;
109     }
110   return err;
111 }
112
113 int 
114 map_kbx_err (int err)
115 {
116   switch (err)
117     {
118     case -1:
119     case 0:
120       break;
121       
122     default:
123       err = seterr (General_Error);
124       break;
125     }
126   return err;
127 }
128
129
130 int 
131 map_assuan_err (int err)
132 {
133   switch (err)
134     {
135     case -1:
136     case 0:
137       break;
138
139     case ASSUAN_Canceled:        err = GNUPG_Canceled; break;
140     case ASSUAN_Invalid_Index:   err = GNUPG_Invalid_Index; break;
141
142     case ASSUAN_Not_Implemented: err = GNUPG_Not_Implemented; break;
143     case ASSUAN_Server_Fault:    err = GNUPG_Assuan_Server_Fault; break;
144     case ASSUAN_No_Public_Key:   err = GNUPG_No_Public_Key; break;
145     case ASSUAN_No_Secret_Key:   err = GNUPG_No_Secret_Key; break;
146
147     case ASSUAN_Cert_Revoked:    err = GNUPG_Certificate_Revoked; break;
148     case ASSUAN_No_CRL_For_Cert: err = GNUPG_No_CRL_Known; break;       
149     case ASSUAN_CRL_Too_Old:     err = GNUPG_CRL_Too_Old; break;        
150
151     case ASSUAN_Not_Trusted:     err = GNUPG_Not_Trusted; break;
152
153     case ASSUAN_Card_Error:      err = GNUPG_Card_Error; break;
154     case ASSUAN_Invalid_Card:    err = GNUPG_Invalid_Card; break;
155     case ASSUAN_No_PKCS15_App:   err = GNUPG_No_PKCS15_App; break;
156     case ASSUAN_Card_Not_Present: err= GNUPG_Card_Not_Present; break;
157     case ASSUAN_Not_Confirmed:   err = GNUPG_Not_Confirmed; break;
158     case ASSUAN_Invalid_Id:      err = GNUPG_Invalid_Id; break;
159
160     default:
161       err = err < 100? GNUPG_Assuan_Server_Fault : GNUPG_Assuan_Error;
162       break;
163     }
164   return err;
165 }
166
167 /* Map GNUPG_xxx error codes to Assuan status codes */
168 int
169 map_to_assuan_status (int rc)
170 {
171   switch (rc)
172     {
173     case 0: break;
174     case GNUPG_Bad_Certificate:   rc = ASSUAN_Bad_Certificate; break;
175     case GNUPG_Bad_Certificate_Path: rc = ASSUAN_Bad_Certificate_Path; break;
176     case GNUPG_Missing_Certificate: rc = ASSUAN_Missing_Certificate; break;
177     case GNUPG_No_Data:           rc = ASSUAN_No_Data_Available; break;
178     case GNUPG_Bad_Signature:     rc = ASSUAN_Bad_Signature; break;
179     case GNUPG_Not_Implemented:   rc = ASSUAN_Not_Implemented; break;
180     case GNUPG_No_Agent:          rc = ASSUAN_No_Agent; break;
181     case GNUPG_Agent_Error:       rc = ASSUAN_Agent_Error; break;
182     case GNUPG_No_Public_Key:     rc = ASSUAN_No_Public_Key; break;
183     case GNUPG_No_Secret_Key:     rc = ASSUAN_No_Secret_Key; break;
184     case GNUPG_Invalid_Data:      rc = ASSUAN_Invalid_Data; break;
185     case GNUPG_Invalid_Name:      rc = ASSUAN_Invalid_Name; break;
186     case GNUPG_Not_Trusted:       rc = ASSUAN_Not_Trusted; break;
187     case GNUPG_Canceled:          rc = ASSUAN_Canceled; break;
188     case GNUPG_Invalid_Index:     rc = ASSUAN_Invalid_Index; break;
189
190     case GNUPG_Card_Error:      
191     case GNUPG_Card_Reset:      
192       rc = ASSUAN_Card_Error; 
193       break;
194     case GNUPG_Card_Removed:  
195     case GNUPG_Card_Not_Present:
196       rc = ASSUAN_Card_Not_Present;
197       break;
198     case GNUPG_Invalid_Card:      rc = ASSUAN_Invalid_Card; break;
199     case GNUPG_No_PKCS15_App:     rc = ASSUAN_No_PKCS15_App; break;
200     case GNUPG_Not_Confirmed:     rc = ASSUAN_Not_Confirmed; break;
201     case GNUPG_Invalid_Id:        rc = ASSUAN_Invalid_Id; break; 
202
203     case GNUPG_Bad_PIN:
204     case GNUPG_Bad_Passphrase:
205       rc = ASSUAN_No_Secret_Key;
206       break;
207
208     case GNUPG_Read_Error: 
209     case GNUPG_Write_Error:
210     case GNUPG_IO_Error: 
211       rc = ASSUAN_Server_IO_Error;
212       break;
213     case GNUPG_Out_Of_Core:    
214     case GNUPG_Resource_Limit: 
215       rc = ASSUAN_Server_Resource_Problem;
216       break;
217     case GNUPG_Bug: 
218     case GNUPG_Internal_Error:   
219       rc = ASSUAN_Server_Bug;
220       break;
221     default: 
222       rc = ASSUAN_Server_Fault;
223       break;
224     }
225   return rc;
226 }
227
228
229
230
231
232
233