diff --git a/datasafe-business/pom.xml b/datasafe-business/pom.xml
index 2ea45d796..315a0f278 100644
--- a/datasafe-business/pom.xml
+++ b/datasafe-business/pom.xml
@@ -184,8 +184,13 @@
javax.xml.bind
jaxb-api
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ ${jackson.version}
+ test
+
-
@@ -226,6 +231,9 @@
javax.xml.bind:jaxb-api:jar
+ com.fasterxml.jackson.core:jackson-annotations
+ com.fasterxml.jackson.core:jackson-core
+ com.fasterxml.jackson.core:jackson-databind
javax.inject:javax.inject
com.amazonaws
org.bouncycastle
diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BasicFunctionalityIT.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BasicFunctionalityIT.java
index 511e7a50e..5dad99547 100644
--- a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BasicFunctionalityIT.java
+++ b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BasicFunctionalityIT.java
@@ -1,8 +1,14 @@
package de.adorsys.datasafe.business.impl.e2e;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import com.google.common.io.Resources;
import de.adorsys.datasafe.business.impl.service.DefaultDatasafeServices;
import de.adorsys.datasafe.encrypiton.api.types.UserID;
import de.adorsys.datasafe.encrypiton.api.types.UserIDAuth;
+import de.adorsys.datasafe.encrypiton.api.types.encryption.MutableEncryptionConfig;
import de.adorsys.datasafe.storage.api.StorageService;
import de.adorsys.datasafe.teststorage.WithStorageProvider;
import de.adorsys.datasafe.types.api.actions.ListRequest;
@@ -21,11 +27,11 @@
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
import org.testcontainers.shaded.com.google.common.collect.ImmutableSet;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
import java.security.UnrecoverableKeyException;
import java.util.Arrays;
import java.util.List;
@@ -54,6 +60,7 @@ class BasicFunctionalityIT extends BaseE2EIT {
private StorageService storage;
private Uri location;
+ private static ObjectMapper mapper = createMapper();
/**
@@ -277,6 +284,37 @@ void testWriteToPrivateListPrivateReadPrivateAndSendToAndReadFromInbox(
removeFromPrivate(jane, privateJane.getResource().asPrivate());
removeFromInbox(john, inboxJohn.getResource().asPrivate());
}
+ @ParameterizedTest
+ @MethodSource("allStorages")
+ void testWriteToPrivateListPrivateReadPrivateAndSendToAndReadFromInboxCustom( WithStorageProvider.StorageDescriptor descriptor) {
+ String yamlFixture = "config/mutable.yaml";
+ customInit(descriptor, yamlFixture);
+
+ registerJohnAndJane();
+
+ writeDataToPrivate(jane, PRIVATE_FILE_PATH, MESSAGE_ONE);
+
+ AbsoluteLocation privateJane = getFirstFileInPrivate(jane);
+
+ String privateContentJane = readPrivateUsingPrivateKey(jane, privateJane.getResource().asPrivate());
+
+ sendToInbox(jane, john.getUserID(), SHARED_FILE_PATH, privateContentJane);
+
+ AbsoluteLocation inboxJohn = getFirstFileInInbox(john);
+
+ String result = readInboxUsingPrivateKey(john, inboxJohn.getResource().asPrivate());
+
+ assertThat(result).isEqualTo(MESSAGE_ONE);
+ assertThat(privateJane.getResource().asPrivate().decryptedPath())
+ .extracting(Uri::toASCIIString).isEqualTo(PRIVATE_FILE_PATH);
+ assertThat(privateJane.getResource().asPrivate().encryptedPath())
+ .extracting(Uri::toASCIIString).isNotEqualTo(PRIVATE_FILE_PATH);
+ validateInboxStructAndEncryption(inboxJohn);
+ validatePrivateStructAndEncryption(privateJane);
+
+ removeFromPrivate(jane, privateJane.getResource().asPrivate());
+ removeFromInbox(john, inboxJohn.getResource().asPrivate());
+ }
@ParameterizedTest
@MethodSource("allStorages")
@@ -387,4 +425,28 @@ private void init(WithStorageProvider.StorageDescriptor descriptor) {
this.location = descriptor.getLocation();
this.storage = descriptor.getStorageService().get();
}
+ private void customInit(WithStorageProvider.StorageDescriptor descriptor, String yamlFixture) {
+ MutableEncryptionConfig config = readResource(mapper, yamlFixture, MutableEncryptionConfig.class);
+ DefaultDatasafeServices datasafeServices = DatasafeServicesProvider
+ .customConfigDatasafeServices(descriptor.getStorageService().get(), descriptor.getLocation(), config);
+ initialize(DatasafeServicesProvider.dfsConfig(descriptor.getLocation()), datasafeServices);
+
+ this.location = descriptor.getLocation();
+ this.storage = descriptor.getStorageService().get();
+ }
+
+ private static T readResource(ObjectMapper mapper, String path, Class type) {
+ try (Reader reader = Resources.asCharSource(Resources.getResource(path), StandardCharsets.UTF_8).openStream()) {
+ return mapper.readValue(reader, type);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static ObjectMapper createMapper() {
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ return mapper;
+ }
}
diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/DatasafeServicesProvider.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/DatasafeServicesProvider.java
index 2b06b3e91..6353bc7cd 100644
--- a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/DatasafeServicesProvider.java
+++ b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/DatasafeServicesProvider.java
@@ -6,6 +6,7 @@
import de.adorsys.datasafe.business.impl.service.VersionedDatasafeServices;
import de.adorsys.datasafe.directory.api.config.DFSConfig;
import de.adorsys.datasafe.directory.impl.profile.config.DefaultDFSConfig;
+import de.adorsys.datasafe.encrypiton.api.types.encryption.MutableEncryptionConfig;
import de.adorsys.datasafe.storage.api.StorageService;
import de.adorsys.datasafe.types.api.resource.Uri;
import de.adorsys.datasafe.types.api.types.ReadStorePassword;
@@ -26,6 +27,14 @@ public static DefaultDatasafeServices defaultDatasafeServices(StorageService sto
.storage(storageService)
.build();
}
+ public static DefaultDatasafeServices customConfigDatasafeServices(StorageService storageService, Uri systemRoot, MutableEncryptionConfig config) {
+ return DaggerDefaultDatasafeServices
+ .builder()
+ .config(dfsConfig(systemRoot))
+ .encryption(config.toEncryptionConfig())
+ .storage(storageService)
+ .build();
+ }
public static VersionedDatasafeServices versionedDatasafeServices(StorageService storageService, Uri systemRoot) {
return DaggerVersionedDatasafeServices
diff --git a/datasafe-business/src/test/resources/config/mutable.yaml b/datasafe-business/src/test/resources/config/mutable.yaml
new file mode 100644
index 000000000..61460e89b
--- /dev/null
+++ b/datasafe-business/src/test/resources/config/mutable.yaml
@@ -0,0 +1,30 @@
+---
+keystore:
+ type: BCFKS
+ encryptionAlgo: AES256_KWP
+ pbkdf:
+ scrypt:
+ cost: 16384
+ blockSize: 8
+ parallelization: 1
+ saltLength: 16
+ macAlgo: HmacSHA3_512
+ passwordKeysAlgo: PBEWithHmacSHA256AndAES_256
+keys:
+ encKeyNumber: 1
+ signKeyNumber: 2
+ secret:
+ algo: AES
+ size: 256
+ encrypting:
+ algo: RSA
+ size: 2048
+ sigAlgo: SHA256withRSA
+# curve:
+ signing:
+ algo: RSA
+ size: 2048
+ sigAlgo: SHA256withRSA
+# curve:
+cms:
+ algo: AES256_GCM
\ No newline at end of file
diff --git a/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/BucketAccessServiceImplTest.java b/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/BucketAccessServiceImplTest.java
index 2aa1091de..88c5d369f 100644
--- a/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/BucketAccessServiceImplTest.java
+++ b/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/BucketAccessServiceImplTest.java
@@ -4,6 +4,7 @@
import de.adorsys.datasafe.encrypiton.api.types.UserIDAuth;
import de.adorsys.datasafe.types.api.resource.BasePrivateResource;
import de.adorsys.datasafe.types.api.resource.BasePublicResource;
+import de.adorsys.datasafe.types.api.resource.Uri;
import de.adorsys.datasafe.types.api.shared.BaseMockitoTest;
import de.adorsys.datasafe.types.api.utils.ReadKeyPasswordTestFactory;
import org.junit.jupiter.api.Test;
@@ -35,4 +36,10 @@ void publicAccessFor() {
BasePublicResource.forAbsolutePublic(ABSOLUTE_BUCKET).getResource()).location().asURI()
).asString().isEqualTo(ABSOLUTE_BUCKET);
}
+ @Test
+ void withSystemAccess() {
+ assertThat(bucketAccessService.withSystemAccess(
+ BasePublicResource.forAbsolutePublic(ABSOLUTE_BUCKET)).location().asURI()
+ ).asString().isEqualTo(ABSOLUTE_BUCKET);
+ }
}
diff --git a/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/DefaultDFSConfigTest.java b/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/DefaultDFSConfigTest.java
index 95c9a57e1..d5916117a 100644
--- a/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/DefaultDFSConfigTest.java
+++ b/datasafe-directory/datasafe-directory-impl/src/test/java/de/adorsys/datasafe/directory/impl/profile/dfs/DefaultDFSConfigTest.java
@@ -1,7 +1,10 @@
package de.adorsys.datasafe.directory.impl.profile.dfs;
+import de.adorsys.datasafe.directory.api.types.CreateUserPublicProfile;
import de.adorsys.datasafe.directory.impl.profile.config.DefaultDFSConfig;
+import de.adorsys.datasafe.encrypiton.api.types.UserID;
import de.adorsys.datasafe.types.api.resource.Uri;
+import de.adorsys.datasafe.types.api.types.ReadStorePassword;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -38,5 +41,14 @@ public void checkUriWithSlash() {
Uri result2 = DefaultDFSConfig.addTrailingSlashIfNeeded(result1);
Assertions.assertEquals(new Uri(uriString + "/"), result2);
}
+ @Test
+ @SneakyThrows
+ public void createDefaultPublicTemplate() {
+ ReadStorePassword systemPassword = new ReadStorePassword("storePassword");
+ DefaultDFSConfig config = new DefaultDFSConfig(new URI(uriString), systemPassword);
+ CreateUserPublicProfile template = config.defaultPublicTemplate(new UserID("user1"));
+ Assertions.assertEquals(new UserID("user1"), template.getId());
+
+ }
}
diff --git a/datasafe-encryption/datasafe-encryption-api/src/main/java/de/adorsys/datasafe/encrypiton/api/types/encryption/MutableEncryptionConfig.java b/datasafe-encryption/datasafe-encryption-api/src/main/java/de/adorsys/datasafe/encrypiton/api/types/encryption/MutableEncryptionConfig.java
index 37f42ae24..7c13e358c 100644
--- a/datasafe-encryption/datasafe-encryption-api/src/main/java/de/adorsys/datasafe/encrypiton/api/types/encryption/MutableEncryptionConfig.java
+++ b/datasafe-encryption/datasafe-encryption-api/src/main/java/de/adorsys/datasafe/encrypiton/api/types/encryption/MutableEncryptionConfig.java
@@ -200,9 +200,9 @@ KeyCreationConfig.EncryptingKeyCreationCfg toEncryptingKeyCreationCfg() {
builder.sigAlgo(sigAlgo);
}
- if (null != curve) {
+
builder.curve(curve);
- }
+
return builder.build();
}
@@ -231,9 +231,9 @@ KeyCreationConfig.SigningKeyCreationCfg toSigningKeyCreationCfg() {
builder.sigAlgo(sigAlgo);
}
- if (null != curve) {
+
builder.curve(curve);
- }
+
return builder.build();
}
diff --git a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/cmsencryption/CmsEncryptionServiceImplTest.java b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/cmsencryption/CmsEncryptionServiceImplTest.java
index 3c0168b08..a46bd2a37 100644
--- a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/cmsencryption/CmsEncryptionServiceImplTest.java
+++ b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/cmsencryption/CmsEncryptionServiceImplTest.java
@@ -1,6 +1,11 @@
package de.adorsys.datasafe.encrypiton.impl.cmsencryption;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.google.common.io.ByteStreams;
+import com.google.common.io.Resources;
import de.adorsys.datasafe.encrypiton.api.cmsencryption.CMSEncryptionService;
import de.adorsys.datasafe.encrypiton.api.keystore.KeyStoreService;
import de.adorsys.datasafe.encrypiton.api.types.encryption.CmsEncryptionConfig;
@@ -28,17 +33,10 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
+import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.Key;
@@ -145,6 +143,48 @@ void cmsStreamEnvelopeEncryptAndDecryptTest() {
assertThat(TEST_MESSAGE_CONTENT).isEqualTo(new String(actualResult));
}
+ @Test
+ @SneakyThrows
+ void cmsStreamEnvelopeEncryptAndDecryptTestCustom() {
+ ReadKeyPassword readKeyPassword = ReadKeyPasswordTestFactory.getForString("readkeypassword");
+ ReadStorePassword readStorePassword = new ReadStorePassword("readstorepassword");
+
+ KeyStoreAuth keyStoreAuth = new KeyStoreAuth(readStorePassword, readKeyPassword);
+ KeyCreationConfig config = KeyCreationConfig.builder()
+ .signing(KeyCreationConfig.SigningKeyCreationCfg.builder().algo("RSA").size(2048).sigAlgo( "SHA256withRSA").curve(null).build())
+ .encrypting(KeyCreationConfig.EncryptingKeyCreationCfg.builder().algo("RSA").size(2048).sigAlgo("SHA256withRSA").curve(null).build())
+ .build();
+
+ KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, config);
+ KeyStoreAccess keyStoreAccess = new KeyStoreAccess(keyStore, keyStoreAuth);
+
+ PublicKeyIDWithPublicKey publicKeyIDWithPublicKey = keyStoreService.getPublicKeys(keyStoreAccess).get(0);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ KeyStoreAccess keyStoreAccessSender = getKeyStoreAccess("Sender");
+
+ OutputStream encryptionStream = cmsEncryptionService.buildEncryptionOutputStream(
+ outputStream,
+ Collections.singleton(new PublicKeyIDWithPublicKey(
+ publicKeyIDWithPublicKey.getKeyID(),
+ publicKeyIDWithPublicKey.getPublicKey()
+ )),
+ getKeyPair(keyStoreAccessSender, "Sender")
+ );
+
+ encryptionStream.write(TEST_MESSAGE_CONTENT.getBytes());
+ encryptionStream.close();
+
+ byte[] byteArray = outputStream.toByteArray();
+
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
+ InputStream decryptionStream = cmsEncryptionService.buildDecryptionInputStream(
+ inputStream, keyIds -> getKeys(keyIds, keyStoreAccess)
+ );
+ byte[] actualResult = toByteArray(decryptionStream);
+
+ assertThat(TEST_MESSAGE_CONTENT).isEqualTo(new String(actualResult));
+ }
@Test
@SneakyThrows
diff --git a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreAuthTest.java b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreAuthTest.java
index 0df5c8412..ba4ed0c55 100644
--- a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreAuthTest.java
+++ b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreAuthTest.java
@@ -13,8 +13,8 @@ class KeyStoreAuthTest extends BaseMockitoTest {
@Test
void noPasswords() {
KeyStoreAuth keyStoreAuth = new KeyStoreAuth(null, null);
- assertThrows(KeyStoreAuthException.class, () -> keyStoreAuth.getReadKeyPassword());
- assertThrows(KeyStoreAuthException.class, () -> keyStoreAuth.getReadKeyPassword());
+ assertThrows(KeyStoreAuthException.class, keyStoreAuth::getReadKeyPassword);
+ assertThrows(KeyStoreAuthException.class, keyStoreAuth::getReadStorePassword);
}
@Test
diff --git a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreServiceTest.java b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreServiceTest.java
index f6ac17bed..f61faf415 100644
--- a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreServiceTest.java
+++ b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/KeyStoreServiceTest.java
@@ -26,6 +26,7 @@
import javax.crypto.SecretKey;
import java.security.KeyStore;
import java.security.PrivateKey;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -69,7 +70,28 @@ void createKeyStoreEmptyConfig() throws Exception {
// One additional secret key being generated for path encryption and one for private doc encryption.
Assertions.assertEquals(4, list.size());
}
+ @Test
+ void serializeAndDeserializeKeyStore() {
+ KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, KeyCreationConfig.builder().build());
+ ReadStorePassword password = new ReadStorePassword("storepass");
+
+ byte[] serializedKeyStore = keyStoreService.serialize(keyStore, password);
+ KeyStore deserializedKeyStore = keyStoreService.deserialize(serializedKeyStore, password);
+
+ Assertions.assertEquals(keyStore.getType(), deserializedKeyStore.getType());
+ Assertions.assertEquals(keyStore.getProvider(), deserializedKeyStore.getProvider());
+ }
+ @Test
+ void addPasswordBasedSecretKey() {
+ KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, KeyCreationConfig.builder().build());
+ KeyStoreAccess keyStoreAccess = new KeyStoreAccess(keyStore, keyStoreAuth);
+
+ keyStoreService.addPasswordBasedSecretKey(keyStoreAccess, "alias", "secret".toCharArray());
+ SecretKey secretKey = keyStoreService.getSecretKey(keyStoreAccess, new KeyID("alias"));
+
+ Assertions.assertEquals("secret", new String(secretKey.getEncoded()));
+ }
@Test
void getPublicKeys() {
KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, KeyCreationConfig.builder().build());
@@ -119,4 +141,15 @@ void getSecretKey() {
SecretKey secretKey = keyStoreService.getSecretKey(keyStoreAccess, keyID);
Assertions.assertNotNull(secretKey);
}
+ @Test
+ void removeKey() {
+ KeyCreationConfig config = KeyCreationConfig.builder().signKeyNumber(1).encKeyNumber(0).build();
+ KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, config);
+ KeyStoreAccess keyStoreAccess = new KeyStoreAccess(keyStore, keyStoreAuth);
+
+ KeyID keyID = KeystoreUtil.keyIdByPrefix(keyStore, DOCUMENT_KEY_ID_PREFIX);
+ keyStoreService.removeKey(keyStoreAccess, keyID.getValue());
+ SecretKey secretKey = keyStoreService.getSecretKey(keyStoreAccess, keyID);
+ Assertions.assertNull(secretKey);
+ }
}
diff --git a/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/PublicKeySerdeImplTest.java b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/PublicKeySerdeImplTest.java
new file mode 100644
index 000000000..3d761cbdb
--- /dev/null
+++ b/datasafe-encryption/datasafe-encryption-impl/src/test/java/de/adorsys/datasafe/encrypiton/impl/keystore/PublicKeySerdeImplTest.java
@@ -0,0 +1,56 @@
+package de.adorsys.datasafe.encrypiton.impl.keystore;
+
+import de.adorsys.datasafe.encrypiton.api.keystore.KeyStoreService;
+import de.adorsys.datasafe.encrypiton.api.types.encryption.EncryptionConfig;
+import de.adorsys.datasafe.encrypiton.api.types.encryption.KeyCreationConfig;
+import de.adorsys.datasafe.encrypiton.api.types.keystore.KeyStoreAccess;
+import de.adorsys.datasafe.encrypiton.api.types.keystore.KeyStoreAuth;
+import de.adorsys.datasafe.encrypiton.api.types.keystore.PublicKeyIDWithPublicKey;
+import de.adorsys.datasafe.types.api.shared.BaseMockitoTest;
+import de.adorsys.datasafe.types.api.types.ReadKeyPassword;
+import de.adorsys.datasafe.types.api.types.ReadStorePassword;
+import de.adorsys.datasafe.types.api.utils.ReadKeyPasswordTestFactory;
+import de.adorsys.keymanagement.juggler.services.DaggerBCJuggler;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+import javax.inject.Inject;
+import java.security.KeyStore;
+import java.security.PublicKey;
+import java.util.Base64;
+import java.util.List;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.mockito.Mockito.mock;
+
+public class PublicKeySerdeImplTest extends BaseMockitoTest {
+ private final KeyStoreService keyStoreService = new KeyStoreServiceImpl(
+ EncryptionConfig.builder().build().getKeystore(),
+ DaggerBCJuggler.builder().build()
+ );
+
+ @Test
+ public void writeAndReadPubKey(){
+ ReadStorePassword readStorePassword = new ReadStorePassword("storepass");
+ ReadKeyPassword readKeyPassword = ReadKeyPasswordTestFactory.getForString("keypass");
+
+ KeyStoreAuth keyStoreAuth = new KeyStoreAuth(readStorePassword, readKeyPassword);
+ KeyCreationConfig config = KeyCreationConfig.builder().signKeyNumber(0).encKeyNumber(1).build();
+ KeyStore keyStore = keyStoreService.createKeyStore(keyStoreAuth, config);
+
+ KeyStoreAccess keyStoreAccess = new KeyStoreAccess(keyStore, keyStoreAuth);
+ PublicKeySerdeImpl publicKeySerde = new PublicKeySerdeImpl();
+
+ List publicKeys = keyStoreService.getPublicKeys(keyStoreAccess);
+
+ PublicKey publicKey = publicKeys.get(0).getPublicKey();
+ String encodedKey = publicKeySerde.writePubKey(publicKey);
+
+ assertThat(encodedKey).isEqualTo(Base64.getEncoder().encodeToString(publicKey.getEncoded()));
+
+ PublicKey readPublicKey = publicKeySerde.readPubKey(encodedKey);
+
+ assertThat(readPublicKey).isEqualTo(publicKey);
+ }
+}