/*
 * defines the entry point for the cac card. Only used by cac.c and
 * vcard_emul_type.c
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING file in the top-level directory.
 */
#ifndef CAC_H
#define CAC_H 1

#include "vcard.h"
#include "vreader.h"

#define CAC_GET_PROPERTIES                    0x56
#define CAC_GET_ACR                           0x4c
#define CAC_READ_BUFFER                       0x52 /* CACv2 */
#define CAC_UPDATE_BUFFER                     0x58
#define CAC_SIGN_DECRYPT                      0x42
#define CAC_GET_CERTIFICATE                   0x36 /* CACv1 */

/* read file TAGs for CACv2 */
#define CAC_FILE_TAG                          0x01
#define CAC_FILE_VALUE                        0x02

/* PKI applet tags */
#define CAC_PKI_TAG_CERTIFICATE               0x70
#define CAC_PKI_TAG_CERTINFO                  0x71
#define CAC_PKI_TAG_MSCUID                    0x72
#define CAC_PKI_TAG_ERROR_DETECTION_CODE      0xFE

/* ACA applet tags */
#define CAC_ACR_NUM_ENTRIES                   0xA1
#define CAC_ACR_ENTRY                         0xA0
#define CAC_ACR_NUM_APPLETS                   0x81
#define CAC_ACR_APPLET_ACR                    0x80
#define CAC_ACR_OBJECT_ACR                    0x82
#define CAC_ACR_AMP_NUM_ENTRIES               0x91
#define CAC_ACR_AMP_ENTRY                     0x90
#define CAC_ACR_AID                           0x92
#define CAC_ACR_SERVICE_NUM_ENTRIES           0x94
#define CAC_ACR_SERVICE_ENTRY                 0x93

/* CCC applet tags */
#define CAC_CCC_CARD_IDENTIFIER               0xF0
#define CAC_CCC_CAPABILITY_CONTAINER_VERSION  0xF1
#define CAC_CCC_CAPABILITY_GRAMMAR_VERSION    0xF2
#define CAC_CCC_APPLICATION_CARDURL           0xF3
#define CAC_CCC_PKCS15                        0xF4
#define CAC_CCC_REGISTERED_DATA_MODEL_NUMBER  0xF5
#define CAC_CCC_ACCESS_CONTROL_RULE_TABLE     0xF6
#define CAC_CCC_CARD_APDUS                    0xF7
#define CAC_CCC_REDIRECTION_TAG               0xFA
#define CAC_CCC_CAPABILITY_TUPLES             0xFB
#define CAC_CCC_STATUS_TUPLES                 0xFC
#define CAC_CCC_NEXT_CCC                      0xFD
#define CAC_CCC_ERROR_DETECTION_CODE          0xFE

/* Applet properties tags */
#define CAC_PROPERTIES_APPLET_INFORMATION     0x01
#define CAC_PROPERTIES_NUMBER_OBJECTS         0x40
#define CAC_PROPERTIES_OBJECT_ID              0x41
#define CAC_PROPERTIES_BUFFER_PROPERTIES      0x42
#define CAC_PROPERTIES_PKI_PROPERTIES         0x43
#define CAC_PROPERTIES_TV_OBJECT              0x50
#define CAC_PROPERTIES_PKI_OBJECT             0x51

/* Buffer formats */
#define CAC_FORMAT_SIMPLETLV                  1
#define CAC_FORMAT_EXTENDED                   2


/*
 * Initialize the cac card. This is the only public function in this file. All
 * the rest are connected through function pointers.
 */
VCardStatus cac_card_init(VReader *reader, VCard *card,
              unsigned char * const *cert, int cert_len[],
              VCardKey *key[] /* adopt the keys*/,
              int cert_count);
#endif
