Java tutorial
/* * Copyright (C) 2013 MILLAU Julien * * 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. */ package com.github.devnied.emvnfccard.iso7816emv; import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.StringUtils; import com.github.devnied.emvnfccard.model.enums.CountryCodeEnum; import com.github.devnied.emvnfccard.model.enums.CurrencyEnum; import com.github.devnied.emvnfccard.model.enums.TransactionTypeEnum; import fr.devnied.bitlib.BytesUtils; /** * Factory to create Tag value * * @author Millau Julien * */ public final class EmvTerminal { /** * Random */ private static final SecureRandom random = new SecureRandom(); /** * Method used to construct value from tag and length * * @param pTagAndLength * tag and length value * @return tag value in byte */ public static byte[] constructValue(final TagAndLength pTagAndLength) { byte ret[] = new byte[pTagAndLength.getLength()]; byte val[] = null; if (pTagAndLength.getTag() == EmvTags.TERMINAL_TRANSACTION_QUALIFIERS) { TerminalTransactionQualifiers terminalQual = new TerminalTransactionQualifiers(); terminalQual.setContactlessEMVmodeSupported(true); terminalQual.setReaderIsOfflineOnly(true); val = terminalQual.getBytes(); } else if (pTagAndLength.getTag() == EmvTags.TERMINAL_COUNTRY_CODE) { val = BytesUtils.fromString(StringUtils.leftPad(String.valueOf(CountryCodeEnum.FR.getNumeric()), pTagAndLength.getLength() * 2, "0")); } else if (pTagAndLength.getTag() == EmvTags.TRANSACTION_CURRENCY_CODE) { val = BytesUtils.fromString(StringUtils.leftPad(String.valueOf(CurrencyEnum.EUR.getISOCodeNumeric()), pTagAndLength.getLength() * 2, "0")); } else if (pTagAndLength.getTag() == EmvTags.TRANSACTION_DATE) { SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); val = BytesUtils.fromString(sdf.format(new Date())); } else if (pTagAndLength.getTag() == EmvTags.TRANSACTION_TYPE) { val = new byte[] { (byte) TransactionTypeEnum.PURCHASE.getKey() }; } else if (pTagAndLength.getTag() == EmvTags.AMOUNT_AUTHORISED_NUMERIC) { val = BytesUtils.fromString("00"); } else if (pTagAndLength.getTag() == EmvTags.TERMINAL_TYPE) { val = new byte[] { 0x22 }; } else if (pTagAndLength.getTag() == EmvTags.TERMINAL_CAPABILITIES) { val = new byte[] { (byte) 0xE0, (byte) 0xA0, 0x00 }; } else if (pTagAndLength.getTag() == EmvTags.ADDITIONAL_TERMINAL_CAPABILITIES) { val = new byte[] { (byte) 0x8e, (byte) 0, (byte) 0xb0, 0x50, 0x05 }; } else if (pTagAndLength.getTag() == EmvTags.DS_REQUESTED_OPERATOR_ID) { val = BytesUtils.fromString("7345123215904501"); } else if (pTagAndLength.getTag() == EmvTags.UNPREDICTABLE_NUMBER) { random.nextBytes(ret); } if (val != null) { System.arraycopy(val, 0, ret, 0, Math.min(val.length, ret.length)); } return ret; } /** * Private Constructor */ private EmvTerminal() { } }