blob: 6f3e69004e8f5ea26e315b2719c6c449e7991771 [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2018 ST Microelectronics S.A.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
******************************************************************************/
#include "CommandApdu.h"
#include <string.h>
/*******************************************************************************
**
** Function CommandApdu_toByteArray
**
** Description Transforms a CommandApdu into a byte array.
**
** Parameters cmdApdu - input APDU struct.
** commandApduArray - output array bytes.
**
** Returns CommandApduArray size.
**
*******************************************************************************/
int CommandApdu_toByteArray(CommandApdu cmdApdu, char* commandApduArray) {
int commandApduArraySize = CommandApdu_getSize(cmdApdu);
if (cmdApdu.lc > MAX_CMD_APDU_DATA_LENGTH) {
return -1;
}
commandApduArray[0] = cmdApdu.cla;
commandApduArray[1] = cmdApdu.ins;
commandApduArray[2] = cmdApdu.p1;
commandApduArray[3] = cmdApdu.p2;
if (cmdApdu.lc > 0) {
commandApduArray[4] = cmdApdu.lc;
memcpy(commandApduArray + 5, cmdApdu.data, cmdApdu.lc);
}
if (cmdApdu.le >= 0) {
commandApduArray[commandApduArraySize - 1] = cmdApdu.le;
}
return commandApduArraySize;
}
/*******************************************************************************
**
** Function CommandApdu_getSize
**
** Description Get the size of a CommandApdu structure
**
** Parameters cmdApdu - input APDU struct.
**
** Returns cmdApdu size.
**
*******************************************************************************/
int CommandApdu_getSize(CommandApdu cmdApdu) {
// There will be always cla+ins+p1+p2
int size = 4;
if (cmdApdu.lc > 0) {
// Size of lc + data
size += 1 + cmdApdu.lc;
}
if (cmdApdu.le >= 0) {
size++;
}
return size;
}
/*******************************************************************************
**
** Function CommandApdu_formApduType4
**
** Description Forms an APDU
**
** Parameters
**
** Returns -1 if error 0 if ok
**
*******************************************************************************/
int CommandApdu_formApduType4(char cla, char ins, char p1, char p2, char lc,
char* cmdData, char le, CommandApdu* cmdApdu) {
if (lc > MAX_CMD_APDU_DATA_LENGTH) {
return -1;
}
cmdApdu->cla = cla;
cmdApdu->ins = ins;
cmdApdu->p1 = p1;
cmdApdu->p2 = p2;
cmdApdu->lc = lc;
if (lc > 0) {
memcpy(cmdApdu->data, cmdData, lc);
}
cmdApdu->le = le;
return CommandApdu_getSize(*cmdApdu);
}
/*******************************************************************************
**
** Function CommandApdu_formApduType2
**
** Description Forms an APDU
**
** Parameters
**
** Returns -1 if error 0 if ok
**
*******************************************************************************/
int CommandApdu_formApduType2(char cla, char ins, char p1, char p2, char le,
CommandApdu* cmdApdu) {
cmdApdu->cla = cla;
cmdApdu->ins = ins;
cmdApdu->p1 = p1;
cmdApdu->p2 = p2;
cmdApdu->le = le;
cmdApdu->lc = 0;
return CommandApdu_getSize(*cmdApdu);
}