#ifndef _ISO_SM_H
#define _ISO_SM_H
#include "libopensc/opensc.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_SM_APDU_RESP_SIZE 223
#define MAX_SM_APDU_DATA_SIZE 239
#define SM_ISO_PADDING 0x01
#define SM_NO_PADDING 0x02
struct iso_sm_ctx {
void *priv_data;
u8 padding_indicator;
size_t block_length;
int (*authenticate)(sc_card_t *card, const struct iso_sm_ctx *ctx,
const u8 *data, size_t datalen, u8 **outdata);
int (*verify_authentication)(sc_card_t *card, const struct iso_sm_ctx *ctx,
const u8 *mac, size_t maclen,
const u8 *macdata, size_t macdatalen);
int (*encrypt)(sc_card_t *card, const struct iso_sm_ctx *ctx,
const u8 *data, size_t datalen, u8 **enc);
int (*decrypt)(sc_card_t *card, const struct iso_sm_ctx *ctx,
const u8 *enc, size_t enclen, u8 **data);
int (*pre_transmit)(sc_card_t *card, const struct iso_sm_ctx *ctx,
sc_apdu_t *apdu);
int (*post_transmit)(sc_card_t *card, const struct iso_sm_ctx *ctx,
sc_apdu_t *sm_apdu);
int (*finish)(sc_card_t *card, const struct iso_sm_ctx *ctx,
sc_apdu_t *apdu);
void (*clear_free)(const struct iso_sm_ctx *ctx);
};
void iso_sm_ctx_clear_free(struct iso_sm_ctx *sctx);
struct iso_sm_ctx *iso_sm_ctx_create(void);
int iso_sm_start(struct sc_card *card, struct iso_sm_ctx *sctx);
int iso_sm_close(struct sc_card *card);
#ifdef __cplusplus
}
#endif
#endif