/****************************************************************************** * * 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 /******************************************************************************* ** ** 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); }