001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.emv.cryptogram;
020
021import org.jpos.security.ARPCMethod;
022import org.jpos.security.MKDMethod;
023import org.jpos.security.SKDMethod;
024
025/**
026 * M/Chip Cryptogram Specification 
027 * 
028 * @author Rainer Reyes
029 */
030public class MChipCryptogram implements CryptogramSpec {
031
032    private final CVNMCDataBuilder dataBuilder;
033    private final SKDMethod skdMethod;
034
035
036    public MChipCryptogram(String cryptogramVersionNumber) {
037        byte data = (byte) Integer.parseInt(cryptogramVersionNumber, 16);
038        this.dataBuilder = new CVNMCDataBuilder((data & 1) == 1); // byte 1 = 1
039        // byte 3-2
040        if ((data >> 1 & 0x03) == 0x00) { // bits = 00
041            // byte 3-2 = 00
042            skdMethod = SKDMethod.MCHIP;
043        } else if ((data >> 1 & 0x03) == 0x02) { // bits = 10
044            // byte 3-2 = 10
045            skdMethod = SKDMethod.EMV_CSKD;
046        } else {
047            throw new IllegalArgumentException("Cryptogram version not supported");
048        }
049    }
050
051    @Override
052    public MKDMethod getMKDMethod() {
053        return MKDMethod.OPTION_A;
054    }
055
056    @Override
057    public SKDMethod getSKDMethod() {
058        return skdMethod;
059    }
060
061    @Override
062    public ARPCMethod getARPCMethod() {
063        return ARPCMethod.METHOD_1;
064    }
065
066    @Override
067    public CryptogramDataBuilder getDataBuilder() {
068        return dataBuilder;
069    }
070}