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}