> ## Documentation Index
> Fetch the complete documentation index at: https://docs.futurex.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Common operations

> Code examples for typical cryptographic operations using the Excrypt security module adapter with jPOS.

This appendix provides code examples demonstrating typical cryptographic operations performed using the Excrypt security module adapter with your HSM.

## Calculate CVV (Visa)

```java expandable lines wrap title="Java" theme={null}
SMAdapter<SecureKey> adapter = createAdapter();

SecureDESKey cvkA = new SecureDESKey(SMAdapter.LENGTH_DES, SMAdapter.TYPE_CVK,
"47569324523156ED", "000000");

SecureDESKey cvkB = new SecureDESKey(SMAdapter.LENGTH_DES, SMAdapter.TYPE_CVK,
"31EF061469307970", "000000");

String cvv = adapter.calculateCVD("4111111111111", cvkA, cvkB, "2512", "000");
```

## Validate CVV (Visa)

```java expandable lines wrap title="Java" theme={null}
String pan = "4111111111111";
String exp = "2512";
String serviceCode = "000";
String cvv = "588";

SecureDESKey cvkA = new SecureDESKey(SMAdapter.LENGTH_DES, SMAdapter.TYPE_CVK,
"47569324523156ED", "000000");

SecureDESKey cvkB = new SecureDESKey(SMAdapter.LENGTH_DES, SMAdapter.TYPE_CVK,
"31EF061469307970", "000000");

SMAdapter<SecureKey> adapter = createAdapter();

adapter.verifyCVD(pan, cvkA, cvkB, cvv, exp, serviceCode);
```

## Calculate CVC (Mastercard)

```java expandable lines wrap title="Java" theme={null}
String pan = "5555444433331111";
String exp = "2512";
String serviceCode = "000";
String cvk = "47569324523156ED31EF061469307970";
ExcryptAdapter adapter = createAdapter();
String cvv = adapter.calculateCVCMastercard(pan, exp, serviceCode, cvk);
```

## Validate CVC (Mastercard)

```java expandable lines wrap title="Java" theme={null}
String pan = "5555444433331111";
String exp = "2512";
String serviceCode = "000";
String cvk = "47569324523156ED31EF061469307970";
String cvv = "267";
ExcryptAdapter adapter = createAdapter();
adapter.verifyCVCMastercard(pan, exp, serviceCode, cvv, cvk);
```

## Generating a new working key

```java expandable lines wrap title="Java" theme={null}
String kek = "042FAEDF91FE6ED67F97982CE545401C"; // KEK under MFK.
ExcryptAdapter adapter = createAdapter();
String[] r = adapter.generateWorkingKey(kek, "PEK");
String keyUnderMFK = r[0]; // New key under MFK.
String keyUnderKEK = r[1]; // New key under KEK.
String kcv = r[2]; // Check digits.
```

## Translating a PIN block

```java expandable lines wrap title="Java" theme={null}
SMAdapter<SecureKey> adapter = createAdapter();

String pan = "5556543210123455";

// Get the last 12 digits, excluding the check digit.

pan = pan.substring(0, pan.length() - 1);
pan = ISOUtil.takeLastN(pan, 12);

EncryptedPIN pinUnderZPK1 = new EncryptedPIN();
pinUnderZPK1.setAccountNumber(pan);
pinUnderZPK1.setPINBlock(ISOUtil.hex2byte("0E3FCCB186078F16")); // Incoming PIN block.
pinUnderZPK1.setPINBlockFormat(SMAdapter.FORMAT01);

SecureDESKey zpk1 = new SecureDESKey(SMAdapter.LENGTH_DES3_2KEY, SMAdapter.TYPE_ZPK,
"69901BDF941207303B41D17AFF85D60C", "000000");

SecureDESKey zpk2 = new SecureDESKey(SMAdapter.LENGTH_DES3_2KEY, SMAdapter.TYPE_ZPK,
"BDA3222FF277198E87D994795F9C4902", "000000");

EncryptedPIN pinUnderZPK2 = adapter.translatePIN(pinUnderZPK1, zpk1, zpk2, SMAdapter.FORMAT01);

System.out.println(ISOUtil.byte2hex(pinUnderZPK2.getPINBlock())); // PIN block under ZPK 2.
```

## Encrypt a clear PIN under Key Encrypt Key ( KEK )

```java expandable lines wrap title="Java" theme={null}
String kek = "69901BDF941207303B41D17AFF85D60C";
String pan = "4111111111111111";
String pin = "1234";
ExcryptAdapter adapter = createAdapter();
String encPINBlk = adapter.encryptPIN(pan, pin, zpk1); // Returns PIN block in hex.
```

## ARQC validation

```java expandable lines wrap title="Java" theme={null}
String pan = "123456789012";
String psn = "10";

SecureDESKey imkac = new SecureDESKey(SMAdapter.LENGTH_DES3_2KEY, SMAdapter.TYPE_MK_AC,
"12345678901234561234567890123456", "000000");

byte[] atc = ISOUtil.hex2byte("ABCD");
byte[] txnData = ISOUtil.hex2byte("DEADBEEFDEADBEDEAD");
byte[] arqc = ISOUtil.hex2byte("A8F6741A34F1A6B2");
byte[] upn = ISOUtil.hex2byte("1234ABCD");

SMAdapter<SecureKey> adapter = createAdapter();

boolean isValid = adapter.verifyARQC(MKDMethod.OPTION_A, SKDMethod.MCHIP, imkac, pan, psn, arqc,atc, upn, txnData);
```

## ARQC validation and ARPC generation

```java expandable lines wrap title="Java" theme={null}
String pan = "123456789012"; // Last 12 bytes, excluding check digit.
String psn = "10";

SecureDESKey imkac = new SecureDESKey(SMAdapter.LENGTH_DES3_2KEY, SMAdapter.TYPE_MK_AC,"12345678901234561234567890123456", "000000");

byte[] atc = ISOUtil.hex2byte("ABCD");
byte[] txnData = ISOUtil.hex2byte("DEADBEEFDEADBEDEAD");
byte[] arqc = ISOUtil.hex2byte("A8F6741A34F1A6B2");
byte[] upn = ISOUtil.hex2byte("1234ABCD");

SMAdapter<SecureKey> adapter = createAdapter();

byte[] arpc = adapter.verifyARQCGenerateARPC(MKDMethod.OPTION_A, SKDMethod.MCHIP, imkac, pan, psn, arqc, atc, upn, txnData, ARPCMethod.METHOD_1, ISOUtil.hex2byte("0012"), null)
```
