gpg: The option --passphrase= can be empty.
[gnupg.git] / scd / iso7816.c
1 /* iso7816.c - ISO 7816 commands
2  * Copyright (C) 2003, 2004, 2008, 2009 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 3 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, see <https://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <errno.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #if defined(GNUPG_MAJOR_VERSION)
27 # include "scdaemon.h"
28 #endif /*GNUPG_MAJOR_VERSION*/
29
30 #include "iso7816.h"
31 #include "apdu.h"
32
33
34 #define CMD_SELECT_FILE 0xA4
35 #define CMD_VERIFY                ISO7816_VERIFY
36 #define CMD_CHANGE_REFERENCE_DATA ISO7816_CHANGE_REFERENCE_DATA
37 #define CMD_RESET_RETRY_COUNTER   ISO7816_RESET_RETRY_COUNTER
38 #define CMD_GET_DATA    0xCA
39 #define CMD_PUT_DATA    0xDA
40 #define CMD_MSE         0x22
41 #define CMD_PSO         0x2A
42 #define CMD_GENERAL_AUTHENTICATE  0x87
43 #define CMD_INTERNAL_AUTHENTICATE 0x88
44 #define CMD_GENERATE_KEYPAIR      0x47
45 #define CMD_GET_CHALLENGE         0x84
46 #define CMD_READ_BINARY 0xB0
47 #define CMD_READ_RECORD 0xB2
48
49 static gpg_error_t
50 map_sw (int sw)
51 {
52   gpg_err_code_t ec;
53
54   switch (sw)
55     {
56     case SW_EEPROM_FAILURE: ec = GPG_ERR_HARDWARE; break;
57     case SW_TERM_STATE:     ec = GPG_ERR_OBJ_TERM_STATE; break;
58     case SW_WRONG_LENGTH:   ec = GPG_ERR_INV_VALUE; break;
59     case SW_ACK_TIMEOUT:    ec = GPG_ERR_TIMEOUT; break;
60     case SW_SM_NOT_SUP:     ec = GPG_ERR_NOT_SUPPORTED; break;
61     case SW_CC_NOT_SUP:     ec = GPG_ERR_NOT_SUPPORTED; break;
62     case SW_CHV_WRONG:      ec = GPG_ERR_BAD_PIN; break;
63     case SW_CHV_BLOCKED:    ec = GPG_ERR_PIN_BLOCKED; break;
64     case SW_USE_CONDITIONS: ec = GPG_ERR_USE_CONDITIONS; break;
65     case SW_NOT_SUPPORTED:  ec = GPG_ERR_NOT_SUPPORTED; break;
66     case SW_BAD_PARAMETER:  ec = GPG_ERR_INV_VALUE; break;
67     case SW_FILE_NOT_FOUND: ec = GPG_ERR_ENOENT; break;
68     case SW_RECORD_NOT_FOUND:ec= GPG_ERR_NOT_FOUND; break;
69     case SW_REF_NOT_FOUND:  ec = GPG_ERR_NO_OBJ; break;
70     case SW_BAD_P0_P1:      ec = GPG_ERR_INV_VALUE; break;
71     case SW_EXACT_LENGTH:   ec = GPG_ERR_INV_VALUE; break;
72     case SW_INS_NOT_SUP:    ec = GPG_ERR_CARD; break;
73     case SW_CLA_NOT_SUP:    ec = GPG_ERR_CARD; break;
74     case SW_SUCCESS:        ec = 0; break;
75
76     case SW_HOST_OUT_OF_CORE: ec = GPG_ERR_ENOMEM; break;
77     case SW_HOST_INV_VALUE:   ec = GPG_ERR_INV_VALUE; break;
78     case SW_HOST_INCOMPLETE_CARD_RESPONSE: ec = GPG_ERR_CARD; break;
79     case SW_HOST_NOT_SUPPORTED: ec = GPG_ERR_NOT_SUPPORTED; break;
80     case SW_HOST_LOCKING_FAILED: ec = GPG_ERR_BUG; break;
81     case SW_HOST_BUSY:           ec = GPG_ERR_EBUSY; break;
82     case SW_HOST_NO_CARD:        ec = GPG_ERR_CARD_NOT_PRESENT; break;
83     case SW_HOST_CARD_INACTIVE:  ec = GPG_ERR_CARD_RESET; break;
84     case SW_HOST_CARD_IO_ERROR:  ec = GPG_ERR_EIO; break;
85     case SW_HOST_GENERAL_ERROR:  ec = GPG_ERR_GENERAL; break;
86     case SW_HOST_NO_READER:      ec = GPG_ERR_ENODEV; break;
87     case SW_HOST_ABORTED:        ec = GPG_ERR_INV_RESPONSE; break;
88     case SW_HOST_NO_PINPAD:      ec = GPG_ERR_NOT_SUPPORTED; break;
89     case SW_HOST_CANCELLED:      ec = GPG_ERR_CANCELED; break;
90
91     default:
92       if ((sw & 0x010000))
93         ec = GPG_ERR_GENERAL; /* Should not happen. */
94       else if ((sw & 0xff00) == SW_MORE_DATA)
95         ec = 0; /* This should actually never been seen here. */
96       else
97         ec = GPG_ERR_CARD;
98     }
99   return gpg_error (ec);
100 }
101
102 /* Map a status word from the APDU layer to a gpg-error code.  */
103 gpg_error_t
104 iso7816_map_sw (int sw)
105 {
106   /* All APDU functions should return 0x9000 on success but for
107      historical reasons of the implementation some return 0 to
108      indicate success.  We allow for that here. */
109   return sw? map_sw (sw) : 0;
110 }
111
112
113 /* This function is specialized version of the SELECT FILE command.
114    SLOT is the card and reader as created for example by
115    apdu_open_reader (), AID is a buffer of size AIDLEN holding the
116    requested application ID.  The function can't be used to enumerate
117    AIDs and won't return the AID on success.  The return value is 0
118    for okay or a GPG error code.  Note that ISO error codes are
119    internally mapped.  Bit 0 of FLAGS should be set if the card does
120    not understand P2=0xC0. */
121 gpg_error_t
122 iso7816_select_application (int slot, const char *aid, size_t aidlen,
123                             unsigned int flags)
124 {
125   int sw;
126   sw = apdu_send_simple (slot, 0, 0x00, CMD_SELECT_FILE, 4,
127                          (flags&1)? 0 :0x0c, aidlen, aid);
128   return map_sw (sw);
129 }
130
131
132 /* This is the same as iso7816_select_application but may return data
133  * at RESULT,RESULTLEN).  */
134 gpg_error_t
135 iso7816_select_application_ext (int slot, const char *aid, size_t aidlen,
136                                 unsigned int flags,
137                                 unsigned char **result, size_t *resultlen)
138 {
139   int sw;
140   sw = apdu_send (slot, 0, 0x00, CMD_SELECT_FILE, 4,
141                   (flags&1)? 0:0x0c, aidlen, aid,
142                   result, resultlen);
143   return map_sw (sw);
144 }
145
146
147 gpg_error_t
148 iso7816_select_file (int slot, int tag, int is_dir)
149 {
150   int sw, p0, p1;
151   unsigned char tagbuf[2];
152
153   tagbuf[0] = (tag >> 8) & 0xff;
154   tagbuf[1] = tag & 0xff;
155
156   p0 = (tag == 0x3F00)? 0: is_dir? 1:2;
157   p1 = 0x0c; /* No FC return. */
158   sw = apdu_send_simple (slot, 0, 0x00, CMD_SELECT_FILE,
159                          p0, p1, 2, (char*)tagbuf );
160   return map_sw (sw);
161 }
162
163
164 /* Do a select file command with a direct path. */
165 gpg_error_t
166 iso7816_select_path (int slot, const unsigned short *path, size_t pathlen)
167 {
168   int sw, p0, p1;
169   unsigned char buffer[100];
170   int buflen;
171
172   if (pathlen/2 >= sizeof buffer)
173     return gpg_error (GPG_ERR_TOO_LARGE);
174
175   for (buflen = 0; pathlen; pathlen--, path++)
176     {
177       buffer[buflen++] = (*path >> 8);
178       buffer[buflen++] = *path;
179     }
180
181   p0 = 0x08;
182   p1 = 0x0c; /* No FC return. */
183   sw = apdu_send_simple (slot, 0, 0x00, CMD_SELECT_FILE,
184                          p0, p1, buflen, (char*)buffer );
185   return map_sw (sw);
186 }
187
188
189 /* This is a private command currently only working for TCOS cards. */
190 gpg_error_t
191 iso7816_list_directory (int slot, int list_dirs,
192                         unsigned char **result, size_t *resultlen)
193 {
194   int sw;
195
196   if (!result || !resultlen)
197     return gpg_error (GPG_ERR_INV_VALUE);
198   *result = NULL;
199   *resultlen = 0;
200
201   sw = apdu_send (slot, 0, 0x80, 0xAA, list_dirs? 1:2, 0, -1, NULL,
202                   result, resultlen);
203   if (sw != SW_SUCCESS)
204     {
205       /* Make sure that pending buffers are released. */
206       xfree (*result);
207       *result = NULL;
208       *resultlen = 0;
209     }
210   return map_sw (sw);
211 }
212
213
214 /* Wrapper around apdu_send. RESULT can be NULL if no result is
215  * expected.  In addition to an gpg-error return code the actual
216  * status word is stored at R_SW unless that is NULL.  */
217 gpg_error_t
218 iso7816_send_apdu (int slot, int extended_mode,
219                    int class, int ins, int p0, int p1,
220                    int lc, const void *data,
221                    unsigned int *r_sw,
222                    unsigned char **result, size_t *resultlen)
223 {
224   int sw;
225
226   if (result)
227     {
228       *result = NULL;
229       *resultlen = 0;
230     }
231
232   sw = apdu_send (slot, extended_mode, class, ins, p0, p1, lc, data,
233                   result, resultlen);
234   if (sw != SW_SUCCESS && result)
235     {
236       /* Make sure that pending buffers are released. */
237       xfree (*result);
238       *result = NULL;
239       *resultlen = 0;
240     }
241   if (r_sw)
242     *r_sw = sw;
243   return map_sw (sw);
244 }
245
246
247 /* This function sends an already formatted APDU to the card.  With
248    HANDLE_MORE set to true a MORE DATA status will be handled
249    internally.  The return value is a gpg error code (i.e. a mapped
250    status word).  This is basically the same as apdu_send_direct but
251    it maps the status word and does not return it in the result
252    buffer.  However, it R_SW is not NULL the status word is stored
253    R_SW for closer inspection. */
254 gpg_error_t
255 iso7816_apdu_direct (int slot, const void *apdudata, size_t apdudatalen,
256                      int handle_more, unsigned int *r_sw,
257                      unsigned char **result, size_t *resultlen)
258 {
259   int sw, sw2;
260
261   if (result)
262     {
263       *result = NULL;
264       *resultlen = 0;
265     }
266
267   sw = apdu_send_direct (slot, 0, apdudata, apdudatalen, handle_more,
268                          &sw2, result, resultlen);
269   if (!sw)
270     {
271       if (!result)
272         sw = sw2;
273       else if (*resultlen < 2)
274         sw = SW_HOST_GENERAL_ERROR;
275       else
276         {
277           sw = ((*result)[*resultlen-2] << 8) | (*result)[*resultlen-1];
278           (*resultlen)--;
279           (*resultlen)--;
280         }
281     }
282   if (sw != SW_SUCCESS && result)
283     {
284       /* Make sure that pending buffers are released. */
285       xfree (*result);
286       *result = NULL;
287       *resultlen = 0;
288     }
289   if (r_sw)
290     *r_sw = sw;
291   return map_sw (sw);
292 }
293
294
295 /* Check whether the reader supports the ISO command code COMMAND on
296    the pinpad.  Returns 0 on success.  */
297 gpg_error_t
298 iso7816_check_pinpad (int slot, int command, pininfo_t *pininfo)
299 {
300   int sw;
301
302   sw = apdu_check_pinpad (slot, command, pininfo);
303   return iso7816_map_sw (sw);
304 }
305
306
307 /* Perform a VERIFY command on SLOT using the card holder verification
308    vector CHVNO.  With PININFO non-NULL the pinpad of the reader will
309    be used.  Returns 0 on success. */
310 gpg_error_t
311 iso7816_verify_kp (int slot, int chvno, pininfo_t *pininfo)
312 {
313   int sw;
314
315   sw = apdu_pinpad_verify (slot, 0x00, CMD_VERIFY, 0, chvno, pininfo);
316   return map_sw (sw);
317 }
318
319 /* Perform a VERIFY command on SLOT using the card holder verification
320    vector CHVNO with a CHV of length CHVLEN.  Returns 0 on success. */
321 gpg_error_t
322 iso7816_verify (int slot, int chvno, const char *chv, size_t chvlen)
323 {
324   int sw;
325
326   sw = apdu_send_simple (slot, 0, 0x00, CMD_VERIFY, 0, chvno, chvlen, chv);
327   return map_sw (sw);
328 }
329
330 /* Perform a CHANGE_REFERENCE_DATA command on SLOT for the card holder
331    verification vector CHVNO.  With PININFO non-NULL the pinpad of the
332    reader will be used.  If IS_EXCHANGE is 0, a "change reference
333    data" is done, otherwise an "exchange reference data".  */
334 gpg_error_t
335 iso7816_change_reference_data_kp (int slot, int chvno, int is_exchange,
336                                   pininfo_t *pininfo)
337 {
338   int sw;
339
340   sw = apdu_pinpad_modify (slot, 0x00, CMD_CHANGE_REFERENCE_DATA,
341                            is_exchange ? 1 : 0, chvno, pininfo);
342   return map_sw (sw);
343 }
344
345 /* Perform a CHANGE_REFERENCE_DATA command on SLOT for the card holder
346    verification vector CHVNO.  If the OLDCHV is NULL (and OLDCHVLEN
347    0), a "change reference data" is done, otherwise an "exchange
348    reference data".  The new reference data is expected in NEWCHV of
349    length NEWCHVLEN.  */
350 gpg_error_t
351 iso7816_change_reference_data (int slot, int chvno,
352                                const char *oldchv, size_t oldchvlen,
353                                const char *newchv, size_t newchvlen)
354 {
355   int sw;
356   char *buf;
357
358   if ((!oldchv && oldchvlen)
359       || (oldchv && !oldchvlen)
360       || !newchv || !newchvlen )
361     return gpg_error (GPG_ERR_INV_VALUE);
362
363   buf = xtrymalloc (oldchvlen + newchvlen);
364   if (!buf)
365     return gpg_error (gpg_err_code_from_errno (errno));
366   if (oldchvlen)
367     memcpy (buf, oldchv, oldchvlen);
368   memcpy (buf+oldchvlen, newchv, newchvlen);
369
370   sw = apdu_send_simple (slot, 0, 0x00, CMD_CHANGE_REFERENCE_DATA,
371                          oldchvlen? 0 : 1, chvno, oldchvlen+newchvlen, buf);
372   wipememory (buf, oldchvlen+newchvlen);
373   xfree (buf);
374   return map_sw (sw);
375
376 }
377
378
379 gpg_error_t
380 iso7816_reset_retry_counter_with_rc (int slot, int chvno,
381                                      const char *data, size_t datalen)
382 {
383   int sw;
384
385   if (!data || !datalen )
386     return gpg_error (GPG_ERR_INV_VALUE);
387
388   sw = apdu_send_simple (slot, 0, 0x00, CMD_RESET_RETRY_COUNTER,
389                          0, chvno, datalen, data);
390   return map_sw (sw);
391 }
392
393
394 gpg_error_t
395 iso7816_reset_retry_counter (int slot, int chvno,
396                              const char *newchv, size_t newchvlen)
397 {
398   int sw;
399
400   sw = apdu_send_simple (slot, 0, 0x00, CMD_RESET_RETRY_COUNTER,
401                          2, chvno, newchvlen, newchv);
402   return map_sw (sw);
403 }
404
405
406
407 /* Perform a GET DATA command requesting TAG and storing the result in
408    a newly allocated buffer at the address passed by RESULT.  Return
409    the length of this data at the address of RESULTLEN. */
410 gpg_error_t
411 iso7816_get_data (int slot, int extended_mode, int tag,
412                   unsigned char **result, size_t *resultlen)
413 {
414   int sw;
415   int le;
416
417   if (!result || !resultlen)
418     return gpg_error (GPG_ERR_INV_VALUE);
419   *result = NULL;
420   *resultlen = 0;
421
422   if (extended_mode > 0 && extended_mode < 256)
423     le = 65534; /* Not 65535 in case it is used as some special flag.  */
424   else if (extended_mode > 0)
425     le = extended_mode;
426   else
427     le = 256;
428
429   sw = apdu_send_le (slot, extended_mode, 0x00, CMD_GET_DATA,
430                      ((tag >> 8) & 0xff), (tag & 0xff), -1, NULL, le,
431                      result, resultlen);
432   if (sw != SW_SUCCESS)
433     {
434       /* Make sure that pending buffers are released. */
435       xfree (*result);
436       *result = NULL;
437       *resultlen = 0;
438       return map_sw (sw);
439     }
440
441   return 0;
442 }
443
444
445 /* Perform a GET DATA command requesting TAG and storing the result in
446  * a newly allocated buffer at the address passed by RESULT.  Return
447  * the length of this data at the address of RESULTLEN.  This variant
448  * is needed for long (3 octet) tags. */
449 gpg_error_t
450 iso7816_get_data_odd (int slot, int extended_mode, unsigned int tag,
451                       unsigned char **result, size_t *resultlen)
452 {
453   int sw;
454   int le;
455   int datalen;
456   unsigned char data[5];
457
458   if (!result || !resultlen)
459     return gpg_error (GPG_ERR_INV_VALUE);
460   *result = NULL;
461   *resultlen = 0;
462
463   if (extended_mode > 0 && extended_mode < 256)
464     le = 65534; /* Not 65535 in case it is used as some special flag.  */
465   else if (extended_mode > 0)
466     le = extended_mode;
467   else
468     le = 256;
469
470   data[0] = 0x5c;
471   if (tag <= 0xff)
472     {
473       data[1] = 1;
474       data[2] = tag;
475       datalen = 3;
476     }
477   else if (tag <= 0xffff)
478     {
479       data[1] = 2;
480       data[2] = (tag >> 8);
481       data[3] = tag;
482       datalen = 4;
483     }
484   else
485     {
486       data[1] = 3;
487       data[2] = (tag >> 16);
488       data[3] = (tag >> 8);
489       data[4] = tag;
490       datalen = 5;
491     }
492
493   sw = apdu_send_le (slot, extended_mode, 0x00, CMD_GET_DATA + 1,
494                      0x3f, 0xff, datalen, data, le,
495                      result, resultlen);
496   if (sw != SW_SUCCESS)
497     {
498       /* Make sure that pending buffers are released. */
499       xfree (*result);
500       *result = NULL;
501       *resultlen = 0;
502       return map_sw (sw);
503     }
504
505   return 0;
506 }
507
508
509 /* Perform a PUT DATA command on card in SLOT.  Write DATA of length
510    DATALEN to TAG.  EXTENDED_MODE controls whether extended length
511    headers or command chaining is used instead of single length
512    bytes. */
513 gpg_error_t
514 iso7816_put_data (int slot, int extended_mode, int tag,
515                   const void *data, size_t datalen)
516 {
517   int sw;
518
519   sw = apdu_send_simple (slot, extended_mode, 0x00, CMD_PUT_DATA,
520                          ((tag >> 8) & 0xff), (tag & 0xff),
521                          datalen, (const char*)data);
522   return map_sw (sw);
523 }
524
525 /* Same as iso7816_put_data but uses an odd instruction byte.  */
526 gpg_error_t
527 iso7816_put_data_odd (int slot, int extended_mode, int tag,
528                       const void *data, size_t datalen)
529 {
530   int sw;
531
532   sw = apdu_send_simple (slot, extended_mode, 0x00, CMD_PUT_DATA+1,
533                          ((tag >> 8) & 0xff), (tag & 0xff),
534                          datalen, (const char*)data);
535   return map_sw (sw);
536 }
537
538 /* Manage Security Environment.  This is a weird operation and there
539    is no easy abstraction for it.  Furthermore, some card seem to have
540    a different interpretation of 7816-8 and thus we resort to let the
541    caller decide what to do. */
542 gpg_error_t
543 iso7816_manage_security_env (int slot, int p1, int p2,
544                              const unsigned char *data, size_t datalen)
545 {
546   int sw;
547
548   if (p1 < 0 || p1 > 255 || p2 < 0 || p2 > 255 )
549     return gpg_error (GPG_ERR_INV_VALUE);
550
551   sw = apdu_send_simple (slot, 0, 0x00, CMD_MSE, p1, p2,
552                          data? datalen : -1, (const char*)data);
553   return map_sw (sw);
554 }
555
556
557 /* Perform the security operation COMPUTE DIGITAL SIGANTURE.  On
558    success 0 is returned and the data is available in a newly
559    allocated buffer stored at RESULT with its length stored at
560    RESULTLEN.  For LE see do_generate_keypair. */
561 gpg_error_t
562 iso7816_compute_ds (int slot, int extended_mode,
563                     const unsigned char *data, size_t datalen, int le,
564                     unsigned char **result, size_t *resultlen)
565 {
566   int sw;
567
568   if (!data || !datalen || !result || !resultlen)
569     return gpg_error (GPG_ERR_INV_VALUE);
570   *result = NULL;
571   *resultlen = 0;
572
573   if (!extended_mode)
574     le = 256;  /* Ignore provided Le and use what apdu_send uses. */
575   else if (le >= 0 && le < 256)
576     le = 256;
577
578   sw = apdu_send_le (slot, extended_mode,
579                      0x00, CMD_PSO, 0x9E, 0x9A,
580                      datalen, (const char*)data,
581                      le,
582                      result, resultlen);
583   if (sw != SW_SUCCESS)
584     {
585       /* Make sure that pending buffers are released. */
586       xfree (*result);
587       *result = NULL;
588       *resultlen = 0;
589       return map_sw (sw);
590     }
591
592   return 0;
593 }
594
595
596 /* Perform the security operation DECIPHER.  PADIND is the padding
597    indicator to be used.  It should be 0 if no padding is required, a
598    value of -1 suppresses the padding byte.  On success 0 is returned
599    and the plaintext is available in a newly allocated buffer stored
600    at RESULT with its length stored at RESULTLEN.  For LE see
601    do_generate_keypair. */
602 gpg_error_t
603 iso7816_decipher (int slot, int extended_mode,
604                   const unsigned char *data, size_t datalen, int le,
605                   int padind, unsigned char **result, size_t *resultlen)
606 {
607   int sw;
608   unsigned char *buf;
609
610   if (!data || !datalen || !result || !resultlen)
611     return gpg_error (GPG_ERR_INV_VALUE);
612   *result = NULL;
613   *resultlen = 0;
614
615   if (!extended_mode)
616     le = 256;  /* Ignore provided Le and use what apdu_send uses. */
617   else if (le >= 0 && le < 256)
618     le = 256;
619
620   if (padind >= 0)
621     {
622       /* We need to prepend the padding indicator. */
623       buf = xtrymalloc (datalen + 1);
624       if (!buf)
625         return gpg_error (gpg_err_code_from_errno (errno));
626
627       *buf = padind; /* Padding indicator. */
628       memcpy (buf+1, data, datalen);
629       sw = apdu_send_le (slot, extended_mode,
630                          0x00, CMD_PSO, 0x80, 0x86,
631                          datalen+1, (char*)buf, le,
632                          result, resultlen);
633       xfree (buf);
634     }
635   else
636     {
637       sw = apdu_send_le (slot, extended_mode,
638                          0x00, CMD_PSO, 0x80, 0x86,
639                          datalen, (const char *)data, le,
640                          result, resultlen);
641     }
642   if (sw != SW_SUCCESS)
643     {
644       /* Make sure that pending buffers are released. */
645       xfree (*result);
646       *result = NULL;
647       *resultlen = 0;
648       return map_sw (sw);
649     }
650
651   return 0;
652 }
653
654
655 /* For LE see do_generate_keypair.  */
656 gpg_error_t
657 iso7816_internal_authenticate (int slot, int extended_mode,
658                                const unsigned char *data, size_t datalen,
659                                int le,
660                                unsigned char **result, size_t *resultlen)
661 {
662   int sw;
663
664   if (!data || !datalen || !result || !resultlen)
665     return gpg_error (GPG_ERR_INV_VALUE);
666   *result = NULL;
667   *resultlen = 0;
668
669   if (!extended_mode)
670     le = 256;  /* Ignore provided Le and use what apdu_send uses. */
671   else if (le >= 0 && le < 256)
672     le = 256;
673
674   sw = apdu_send_le (slot, extended_mode,
675                      0x00, CMD_INTERNAL_AUTHENTICATE, 0, 0,
676                      datalen, (const char*)data,
677                      le,
678                      result, resultlen);
679   if (sw != SW_SUCCESS)
680     {
681       /* Make sure that pending buffers are released. */
682       xfree (*result);
683       *result = NULL;
684       *resultlen = 0;
685       return map_sw (sw);
686     }
687
688   return 0;
689 }
690
691
692 /* For LE see do_generate_keypair.  */
693 gpg_error_t
694 iso7816_general_authenticate (int slot, int extended_mode,
695                               int algoref, int keyref,
696                               const unsigned char *data, size_t datalen,
697                               int le,
698                               unsigned char **result, size_t *resultlen)
699 {
700   int sw;
701
702   if (!data || !datalen || !result || !resultlen)
703     return gpg_error (GPG_ERR_INV_VALUE);
704   *result = NULL;
705   *resultlen = 0;
706
707   if (!extended_mode)
708     le = 256;  /* Ignore provided Le and use what apdu_send uses. */
709   else if (le >= 0 && le < 256)
710     le = 256;
711
712   sw = apdu_send_le (slot, extended_mode,
713                      0x00, CMD_GENERAL_AUTHENTICATE, algoref, keyref,
714                      datalen, (const char*)data,
715                      le,
716                      result, resultlen);
717   if (sw != SW_SUCCESS)
718     {
719       /* Make sure that pending buffers are released. */
720       xfree (*result);
721       *result = NULL;
722       *resultlen = 0;
723       return map_sw (sw);
724     }
725
726   return 0;
727 }
728
729
730 /* LE is the expected return length.  This is usually 0 except if
731    extended length mode is used and more than 256 byte will be
732    returned.  In that case a value of -1 uses a large default
733    (e.g. 4096 bytes), a value larger 256 used that value.  */
734 static gpg_error_t
735 do_generate_keypair (int slot, int extended_mode, int p1, int p2,
736                      const char *data, size_t datalen, int le,
737                      unsigned char **result, size_t *resultlen)
738 {
739   int sw;
740
741   if (!data || !datalen || !result || !resultlen)
742     return gpg_error (GPG_ERR_INV_VALUE);
743   *result = NULL;
744   *resultlen = 0;
745
746   sw = apdu_send_le (slot, extended_mode,
747                      0x00, CMD_GENERATE_KEYPAIR, p1, p2,
748                      datalen, data,
749                      le >= 0 && le < 256? 256:le,
750                      result, resultlen);
751   if (sw != SW_SUCCESS)
752     {
753       /* Make sure that pending buffers are released. */
754       xfree (*result);
755       *result = NULL;
756       *resultlen = 0;
757       return map_sw (sw);
758     }
759
760   return 0;
761 }
762
763
764 gpg_error_t
765 iso7816_generate_keypair (int slot, int extended_mode, int p1, int p2,
766                           const char *data, size_t datalen,
767                           int le,
768                           unsigned char **result, size_t *resultlen)
769 {
770   return do_generate_keypair (slot, extended_mode, p1, p2,
771                               data, datalen, le, result, resultlen);
772 }
773
774
775 gpg_error_t
776 iso7816_read_public_key (int slot, int extended_mode,
777                          const char *data, size_t datalen,
778                          int le,
779                          unsigned char **result, size_t *resultlen)
780 {
781   return do_generate_keypair (slot, extended_mode, 0x81, 0,
782                               data, datalen, le, result, resultlen);
783 }
784
785
786
787 gpg_error_t
788 iso7816_get_challenge (int slot, int length, unsigned char *buffer)
789 {
790   int sw;
791   unsigned char *result;
792   size_t resultlen, n;
793
794   if (!buffer || length < 1)
795     return gpg_error (GPG_ERR_INV_VALUE);
796
797   do
798     {
799       result = NULL;
800       n = length > 254? 254 : length;
801       sw = apdu_send_le (slot, 0,
802                          0x00, CMD_GET_CHALLENGE, 0, 0, -1, NULL, n,
803                          &result, &resultlen);
804       if (sw != SW_SUCCESS)
805         {
806           /* Make sure that pending buffers are released. */
807           xfree (result);
808           return map_sw (sw);
809         }
810       if (resultlen > n)
811         resultlen = n;
812       memcpy (buffer, result, resultlen);
813       buffer += resultlen;
814       length -= resultlen;
815       xfree (result);
816     }
817   while (length > 0);
818
819   return 0;
820 }
821
822 /* Perform a READ BINARY command requesting a maximum of NMAX bytes
823    from OFFSET.  With NMAX = 0 the entire file is read. The result is
824    stored in a newly allocated buffer at the address passed by RESULT.
825    Returns the length of this data at the address of RESULTLEN. */
826 gpg_error_t
827 iso7816_read_binary (int slot, size_t offset, size_t nmax,
828                      unsigned char **result, size_t *resultlen)
829 {
830   int sw;
831   unsigned char *buffer;
832   size_t bufferlen;
833   int read_all = !nmax;
834   size_t n;
835
836   if (!result || !resultlen)
837     return gpg_error (GPG_ERR_INV_VALUE);
838   *result = NULL;
839   *resultlen = 0;
840
841   /* We can only encode 15 bits in p0,p1 to indicate an offset. Thus
842      we check for this limit. */
843   if (offset > 32767)
844     return gpg_error (GPG_ERR_INV_VALUE);
845
846   do
847     {
848       buffer = NULL;
849       bufferlen = 0;
850       n = read_all? 0 : nmax;
851       sw = apdu_send_le (slot, 0, 0x00, CMD_READ_BINARY,
852                          ((offset>>8) & 0xff), (offset & 0xff) , -1, NULL,
853                          n, &buffer, &bufferlen);
854       if ( SW_EXACT_LENGTH_P(sw) )
855         {
856           n = (sw & 0x00ff);
857           sw = apdu_send_le (slot, 0, 0x00, CMD_READ_BINARY,
858                              ((offset>>8) & 0xff), (offset & 0xff) , -1, NULL,
859                              n, &buffer, &bufferlen);
860         }
861
862       if (*result && sw == SW_BAD_P0_P1)
863         {
864           /* Bad Parameter means that the offset is outside of the
865              EF. When reading all data we take this as an indication
866              for EOF.  */
867           break;
868         }
869
870       if (sw != SW_SUCCESS && sw != SW_EOF_REACHED)
871         {
872           /* Make sure that pending buffers are released. */
873           xfree (buffer);
874           xfree (*result);
875           *result = NULL;
876           *resultlen = 0;
877           return map_sw (sw);
878         }
879       if (*result) /* Need to extend the buffer. */
880         {
881           unsigned char *p = xtryrealloc (*result, *resultlen + bufferlen);
882           if (!p)
883             {
884               gpg_error_t err = gpg_error_from_syserror ();
885               xfree (buffer);
886               xfree (*result);
887               *result = NULL;
888               *resultlen = 0;
889               return err;
890             }
891           *result = p;
892           memcpy (*result + *resultlen, buffer, bufferlen);
893           *resultlen += bufferlen;
894           xfree (buffer);
895           buffer = NULL;
896         }
897       else /* Transfer the buffer into our result. */
898         {
899           *result = buffer;
900           *resultlen = bufferlen;
901         }
902       offset += bufferlen;
903       if (offset > 32767)
904         break; /* We simply truncate the result for too large
905                   files. */
906       if (nmax > bufferlen)
907         nmax -= bufferlen;
908       else
909         nmax = 0;
910     }
911   while ((read_all && sw != SW_EOF_REACHED) || (!read_all && nmax));
912
913   return 0;
914 }
915
916 /* Perform a READ RECORD command. RECNO gives the record number to
917    read with 0 indicating the current record.  RECCOUNT must be 1 (not
918    all cards support reading of more than one record).  SHORT_EF
919    should be 0 to read the current EF or contain a short EF. The
920    result is stored in a newly allocated buffer at the address passed
921    by RESULT.  Returns the length of this data at the address of
922    RESULTLEN. */
923 gpg_error_t
924 iso7816_read_record (int slot, int recno, int reccount, int short_ef,
925                      unsigned char **result, size_t *resultlen)
926 {
927   int sw;
928   unsigned char *buffer;
929   size_t bufferlen;
930
931   if (!result || !resultlen)
932     return gpg_error (GPG_ERR_INV_VALUE);
933   *result = NULL;
934   *resultlen = 0;
935
936   /* We can only encode 15 bits in p0,p1 to indicate an offset. Thus
937      we check for this limit. */
938   if (recno < 0 || recno > 255 || reccount != 1
939       || short_ef < 0 || short_ef > 254 )
940     return gpg_error (GPG_ERR_INV_VALUE);
941
942   buffer = NULL;
943   bufferlen = 0;
944   sw = apdu_send_le (slot, 0, 0x00, CMD_READ_RECORD,
945                      recno,
946                      short_ef? short_ef : 0x04,
947                      -1, NULL,
948                      0, &buffer, &bufferlen);
949
950   if (sw != SW_SUCCESS && sw != SW_EOF_REACHED)
951     {
952       /* Make sure that pending buffers are released. */
953       xfree (buffer);
954       xfree (*result);
955       *result = NULL;
956       *resultlen = 0;
957       return map_sw (sw);
958     }
959   *result = buffer;
960   *resultlen = bufferlen;
961
962   return 0;
963 }