diff --git a/jpos/src/main/java/org/jpos/security/KeyUsage.java b/jpos/src/main/java/org/jpos/security/KeyUsage.java
index 9ea5399661..aa915de193 100644
--- a/jpos/src/main/java/org/jpos/security/KeyUsage.java
+++ b/jpos/src/main/java/org/jpos/security/KeyUsage.java
@@ -1,6 +1,6 @@
/*
* jPOS Project [http://jpos.org]
- * Copyright (C) 2000-2023 jPOS Software SRL
+ * Copyright (C) 2000-2024 jPOS Software SRL
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@@ -18,6 +18,7 @@
package org.jpos.security;
+import java.io.Serializable;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -27,9 +28,11 @@
/**
* Defines the primary usage of the key contained in the key block.
*
- * Each value repesents bytes 5-6 of the Keyblok Header.
+ * Each value repesents bytes 5-6 of the keyblock header.
*/
-public class KeyUsage {
+public class KeyUsage implements Serializable {
+
+ private static final long serialVersionUID = -5504819939017756749L;
protected static final Map TR31MAP = new LinkedHashMap<>();
diff --git a/jpos/src/test/java/org/jpos/security/SecureKeyBlockTest.java b/jpos/src/test/java/org/jpos/security/SecureKeyBlockTest.java
index 87a855d224..f01f77edb8 100644
--- a/jpos/src/test/java/org/jpos/security/SecureKeyBlockTest.java
+++ b/jpos/src/test/java/org/jpos/security/SecureKeyBlockTest.java
@@ -1,6 +1,6 @@
/*
* jPOS Project [http://jpos.org]
- * Copyright (C) 2000-2023 jPOS Software SRL
+ * Copyright (C) 2000-2024 jPOS Software SRL
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@@ -18,10 +18,16 @@
package org.jpos.security;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.io.PrintStream;
+import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
+
import org.jpos.iso.ISOUtil;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -29,9 +35,6 @@
import static org.junit.jupiter.api.Assertions.*;
-/**
- *
- */
public class SecureKeyBlockTest {
private static final String NL = System.getProperty("line.separator");
@@ -227,4 +230,26 @@ public void testDumpWithNameAndOptHeader() {
assertEquals(sb.toString(), os.toString());
}
+ @Test
+ public void testSerialization() throws IOException, ClassNotFoundException {
+ String tr31 = "C0088P0TN00E000054CF02CF89CCC36897E3D4AC22D7BBECA1CBD08296A315A47228274A2FAE03EA699AF35F";
+ SecureKeyBlock key = SecureKeyBlockBuilder.newBuilder().build(tr31);
+ key.dump(System.out, " ");
+ // Serialize instance.
+ Object obj = key;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream os = new ObjectOutputStream(baos);
+ os.writeObject(obj); // This call errors out if 'obj' is not serializable.
+ byte[] img = baos.toByteArray();
+ // Deserialize.
+ ByteArrayInputStream bais = new ByteArrayInputStream(img);
+ ObjectInputStream is = new ObjectInputStream(bais);
+ SecureKeyBlock key2 = (SecureKeyBlock) is.readObject();
+ key2.dump(System.out, " ");
+ assertEquals(key.getKeyName(), key2.getKeyName());
+ assertEquals(key.getModeOfUse(), key2.getModeOfUse());
+ assertEquals(key.getKeyUsage().getCode(), key2.getKeyUsage().getCode());
+ assertEquals(key.getAlgorithm().getCode(), key2.getAlgorithm().getCode());
+ assertTrue(Arrays.equals(key.getKeyBytes(), key2.getKeyBytes()));
+ }
}