You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2019/12/08 08:41:33 UTC

[sling-org-apache-sling-commons-crypto] branch master updated (def23b1 -> 1cc4e03)

This is an automated email from the ASF dual-hosted git repository.

olli pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-crypto.git.


    from def23b1  SLING-8885 Provide an extensible crypto implementation based on Jasypt
     new ef071dc  SLING-8885 Provide an extensible crypto implementation based on Jasypt
     new 1cc4e03  SLING-8886 Provide a Web Console plugin to encrypt messages

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 bnd.bnd                                            |  27 +++
 pom.xml                                            |  18 ++
 .../crypto/internal/EncryptWebConsolePlugin.java   | 190 +++++++++++++++++++++
 ...yptRandomIvGeneratorRegistrarConfiguration.java |   2 +-
 ...tRandomSaltGeneratorRegistrarConfiguration.java |   2 +-
 .../JasyptStandardPBEStringCryptoService.java      |   8 +-
 ...tandardPBEStringCryptoServiceConfiguration.java |  28 +--
 .../commons/crypto/it/tests/CryptoTestSupport.java |   1 -
 .../it/tests/jasypt/JasyptCryptoTestSupport.java}  |  19 ++-
 .../JasyptStandardPBEStringCryptoServiceIT.java    |   3 +-
 10 files changed, 268 insertions(+), 30 deletions(-)
 create mode 100644 src/main/java/org/apache/sling/commons/crypto/internal/EncryptWebConsolePlugin.java
 copy src/{main/java/org/apache/sling/commons/crypto/CryptoService.java => test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptCryptoTestSupport.java} (55%)


[sling-org-apache-sling-commons-crypto] 02/02: SLING-8886 Provide a Web Console plugin to encrypt messages

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-crypto.git

commit 1cc4e03bfea4a24898093a35cc3d72eaa15958d0
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Dec 8 09:40:56 2019 +0100

    SLING-8886 Provide a Web Console plugin to encrypt messages
---
 bnd.bnd                                            |   4 +
 pom.xml                                            |   6 +
 .../crypto/internal/EncryptWebConsolePlugin.java   | 190 +++++++++++++++++++++
 3 files changed, 200 insertions(+)

diff --git a/bnd.bnd b/bnd.bnd
index ba06157..a714ebc 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -1,10 +1,14 @@
 DynamicImport-Package:\
+  javax.servlet,\
+  javax.servlet.http,\
   org.jasypt.encryption.pbe,\
   org.jasypt.iv,\
   org.jasypt.registry,\
   org.jasypt.salt
 
 Import-Package:\
+  javax.servlet;resolution:=optional,\
+  javax.servlet.http;resolution:=optional,\
   org.jasypt.encryption.pbe;resolution:=optional,\
   org.jasypt.iv;resolution:=optional,\
   org.jasypt.registry;resolution:=optional,\
diff --git a/pom.xml b/pom.xml
index 95b97c0..daa9cdb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -111,6 +111,12 @@
       <artifactId>javax.inject</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
     <!-- OSGi -->
     <dependency>
       <groupId>org.osgi</groupId>
diff --git a/src/main/java/org/apache/sling/commons/crypto/internal/EncryptWebConsolePlugin.java b/src/main/java/org/apache/sling/commons/crypto/internal/EncryptWebConsolePlugin.java
new file mode 100644
index 0000000..cff31ae
--- /dev/null
+++ b/src/main/java/org/apache/sling/commons/crypto/internal/EncryptWebConsolePlugin.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.crypto.internal;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Objects;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.commons.crypto.CryptoService;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.util.tracker.ServiceTracker;
+
+import static org.osgi.service.component.ComponentConstants.COMPONENT_ID;
+
+@Component(
+    service = Servlet.class,
+    property = {
+        "felix.webconsole.label=sling-commons-crypto-encrypt",
+        "felix.webconsole.title=Sling Commons Crypto Encrypt",
+        "felix.webconsole.category=Crypto"
+    }
+)
+public class EncryptWebConsolePlugin extends HttpServlet {
+
+    private BundleContext bundleContext;
+
+    private ServiceTracker<CryptoService, CryptoService> tracker;
+
+    private static final String PARAMETER_ID = "id";
+
+    private static final String PARAMETER_MESSAGE = "message";
+
+    private static final String ATTRIBUTE_CIPHERTEXT = "org.apache.sling.commons.crypto.internal.EncryptWebConsolePlugin.ciphertext";
+
+    public EncryptWebConsolePlugin() {
+    }
+
+    @Activate
+    private void activate(final BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+        tracker = new ServiceTracker<>(bundleContext, CryptoService.class, null);
+        tracker.open();
+    }
+
+    @Deactivate
+    private void deactivate() {
+        this.bundleContext = null;
+        if (Objects.nonNull(tracker)) {
+            tracker.close();
+            tracker = null;
+        }
+    }
+
+    @Override
+    protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+        final ServiceReference<CryptoService>[] references = tracker.getServiceReferences();
+        final PrintWriter writer = response.getWriter();
+        if (Objects.nonNull(references) && references.length > 0) {
+            final String form = buildForm(references);
+            writer.println(form);
+        } else {
+            writer.println("<p>No crypto service available</p>");
+        }
+
+        final String forwardRequestUri = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
+        if (Objects.nonNull(forwardRequestUri) && forwardRequestUri.equals(request.getRequestURI())) {
+            final String ciphertext = (String) request.getAttribute(ATTRIBUTE_CIPHERTEXT);
+            if (Objects.nonNull(ciphertext)) {
+                final String html = String.format("<p>Encrypted message: %s</p>", ciphertext);
+                writer.println(html);
+            }
+        }
+    }
+
+    @Override
+    protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+        request.removeAttribute(ATTRIBUTE_CIPHERTEXT);
+        final String id = request.getParameter(PARAMETER_ID);
+        final String message = request.getParameter(PARAMETER_MESSAGE); // do NOT log SECRET message
+        if (Objects.isNull(id)) {
+            handleParameterMissing(response, PARAMETER_ID);
+            return;
+        }
+        if (Objects.isNull(message)) {
+            handleParameterMissing(response, PARAMETER_MESSAGE);
+            return;
+        }
+        final CryptoService cryptoService = findCryptoService(id);
+        if (Objects.isNull(cryptoService)) {
+            handleCryptoServiceNotFound(response, id);
+            return;
+        }
+        final String ciphertext = cryptoService.encrypt(message);
+        request.setAttribute(ATTRIBUTE_CIPHERTEXT, ciphertext);
+        final GetHttpServletRequestWrapper wrapper = new GetHttpServletRequestWrapper(request);
+        request.getRequestDispatcher(request.getRequestURI()).forward(wrapper, response);
+    }
+
+    private void handleParameterMissing(final HttpServletResponse response, final String parameter) throws IOException {
+        final String message = String.format("Parameter %s is missing", parameter);
+        response.sendError(400, message);
+    }
+
+    private void handleCryptoServiceNotFound(final HttpServletResponse response, final String id) throws IOException {
+        final String message = String.format("Crypto service with component id %s not found", id);
+        response.sendError(404, message);
+    }
+
+    private @NotNull String buildForm(final ServiceReference<CryptoService>[] references) {
+        final StringBuilder builder = new StringBuilder();
+        builder.append("<form method=\"POST\">");
+        builder.append("<label for=\"message\">Message to encrypt</label>");
+        builder.append("<br>");
+        builder.append("<input type=\"text\" name=\"message\" id=\"message\">");
+        builder.append("<br>");
+        builder.append("<label>Available crypto services");
+        builder.append("<br>");
+        builder.append("<select name=\"id\">");
+        for (final ServiceReference<CryptoService> reference : references) {
+            final String id = reference.getProperty(COMPONENT_ID).toString();
+            final String[] names = (String[]) reference.getProperty("names");
+            final String algorithm = reference.getProperty("algorithm").toString();
+            final String label = String.format("Component id %s, names: %s, algorithm: %s", id, Arrays.toString(names), algorithm);
+            builder.append("<option value=\"").append(id).append("\">");
+            builder.append(label);
+            builder.append("</option>");
+        }
+        builder.append("</label>");
+        builder.append("</select>");
+        builder.append("<br>");
+        builder.append("<button type=\"submit\">encrypt</button>");
+        builder.append("</form>");
+        return builder.toString();
+    }
+
+    private @Nullable CryptoService findCryptoService(@NotNull final String id) {
+        final ServiceReference<CryptoService>[] references = tracker.getServiceReferences();
+        for (final ServiceReference<CryptoService> reference : references) {
+            if (id.equals(reference.getProperty(COMPONENT_ID).toString())) {
+                return bundleContext.getService(reference);
+            }
+        }
+        return null;
+    }
+
+    private static class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+        GetHttpServletRequestWrapper(final HttpServletRequest request) {
+            super(request);
+        }
+
+        @Override
+        public String getMethod() {
+            return "GET";
+        }
+
+    }
+
+}


[sling-org-apache-sling-commons-crypto] 01/02: SLING-8885 Provide an extensible crypto implementation based on Jasypt

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-crypto.git

commit ef071dc17c9d9ded6d3220d87b9d41b1f43477bc
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Dec 8 01:25:45 2019 +0100

    SLING-8885 Provide an extensible crypto implementation based on Jasypt
    
    * Make Jasypt optional
    * Improve names and descriptions
    * Add configuration defaults
---
 bnd.bnd                                            | 23 ++++++++++++++++++
 pom.xml                                            | 12 ++++++++++
 ...yptRandomIvGeneratorRegistrarConfiguration.java |  2 +-
 ...tRandomSaltGeneratorRegistrarConfiguration.java |  2 +-
 .../JasyptStandardPBEStringCryptoService.java      |  8 +++----
 ...tandardPBEStringCryptoServiceConfiguration.java | 28 +++++++++++-----------
 .../commons/crypto/it/tests/CryptoTestSupport.java |  1 -
 .../it/tests/jasypt/JasyptCryptoTestSupport.java}  | 27 ++++++++++-----------
 .../JasyptStandardPBEStringCryptoServiceIT.java    |  3 +--
 9 files changed, 69 insertions(+), 37 deletions(-)

diff --git a/bnd.bnd b/bnd.bnd
index e36a0d6..ba06157 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -1,3 +1,26 @@
+DynamicImport-Package:\
+  org.jasypt.encryption.pbe,\
+  org.jasypt.iv,\
+  org.jasypt.registry,\
+  org.jasypt.salt
+
+Import-Package:\
+  org.jasypt.encryption.pbe;resolution:=optional,\
+  org.jasypt.iv;resolution:=optional,\
+  org.jasypt.registry;resolution:=optional,\
+  org.jasypt.salt;resolution:=optional,\
+  *
+
+Require-Capability:\
+  osgi.service;filter:="(objectClass=org.apache.sling.commons.crypto.PasswordProvider)";effective:=active;resolution:=optional,\
+  osgi.service;filter:="(objectClass=org.jasypt.iv.IvGenerator)";effective:=active;resolution:=optional
+
+-plugin:\
+  org.apache.sling.bnd.plugin.headers.parameters.remove.Plugin;\
+    'Require-Capability'='osgi.service;filter:="(objectClass=org.apache.sling.commons.crypto.PasswordProvider)";effective:=active',\
+  org.apache.sling.bnd.plugin.headers.parameters.remove.Plugin;\
+    'Require-Capability'='osgi.service;filter:="(objectClass=org.jasypt.iv.IvGenerator)";effective:=active'
+
 -removeheaders:\
   Include-Resource,\
   Private-Package
diff --git a/pom.xml b/pom.xml
index 77afcb2..95b97c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,17 @@
     <plugins>
       <plugin>
         <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.bnd.plugin.headers.parameters.remove</artifactId>
+            <version>1.0.0</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
         <artifactId>bnd-baseline-maven-plugin</artifactId>
         <configuration>
           <failOnMissing>false</failOnMissing>
@@ -171,6 +182,7 @@
       <artifactId>org.apache.servicemix.bundles.jasypt</artifactId>
       <version>1.9.3_1</version>
       <scope>provided</scope>
+      <optional>true</optional>
     </dependency>
     <!-- JSR 305-->
     <dependency>
diff --git a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java
index 6483950..90981c8 100644
--- a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java
+++ b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java
@@ -24,7 +24,7 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 @ObjectClassDefinition(
     name = "Apache Sling Commons Crypto “Jasypt Random IV Generator Registrar”",
-    description = "TODO"
+    description = "Registers a Jasypt RandomIvGenerator as service"
 )
 @interface JasyptRandomIvGeneratorRegistrarConfiguration {
 
diff --git a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomSaltGeneratorRegistrarConfiguration.java b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomSaltGeneratorRegistrarConfiguration.java
index 68c8793..baba6ea 100644
--- a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomSaltGeneratorRegistrarConfiguration.java
+++ b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomSaltGeneratorRegistrarConfiguration.java
@@ -24,7 +24,7 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 @ObjectClassDefinition(
     name = "Apache Sling Commons Crypto “Jasypt Random Salt Generator Registrar”",
-    description = "TODO"
+    description = "Registers a Jasypt RandomSaltGenerator as service"
 )
 @interface JasyptRandomSaltGeneratorRegistrarConfiguration {
 
diff --git a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoService.java b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoService.java
index 46e5107..c78e385 100644
--- a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoService.java
+++ b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoService.java
@@ -63,7 +63,7 @@ public class JasyptStandardPBEStringCryptoService implements CryptoService {
     @Reference(
         cardinality = ReferenceCardinality.OPTIONAL
     )
-    private volatile Provider provider;
+    private volatile Provider securityProvider;
 
     @Reference(
         cardinality = ReferenceCardinality.OPTIONAL
@@ -111,10 +111,10 @@ public class JasyptStandardPBEStringCryptoService implements CryptoService {
         // optional
         encryptor.setKeyObtentionIterations(configuration.keyObtentionIterations());
         encryptor.setStringOutputType(configuration.stringOutputType());
-        if (StringUtils.isNotBlank(configuration.providerName())) {
-            encryptor.setProviderName(configuration.providerName());
+        if (StringUtils.isNotBlank(configuration.securityProviderName())) {
+            encryptor.setProviderName(configuration.securityProviderName());
         }
-        final Provider provider = this.provider;
+        final Provider provider = this.securityProvider;
         if (Objects.nonNull(provider)) {
             encryptor.setProvider(provider);
         }
diff --git a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoServiceConfiguration.java b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoServiceConfiguration.java
index 9968645..37f020a 100644
--- a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoServiceConfiguration.java
+++ b/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptStandardPBEStringCryptoServiceConfiguration.java
@@ -28,7 +28,7 @@ import static org.jasypt.encryption.pbe.StandardPBEByteEncryptor.DEFAULT_KEY_OBT
 
 @ObjectClassDefinition(
     name = "Apache Sling Commons Crypto “Jasypt Standard PBE String Crypto Service”",
-    description = "TODO"
+    description = "Crypto service which uses Jasypt StandardPBEStringEncryptor for encryption and decryption"
 )
 @interface JasyptStandardPBEStringCryptoServiceConfiguration {
 
@@ -40,7 +40,7 @@ import static org.jasypt.encryption.pbe.StandardPBEByteEncryptor.DEFAULT_KEY_OBT
 
     @AttributeDefinition(
         name = "Algorithm",
-        description = "TODO"
+        description = "crypto algorithm"
     )
     String algorithm() default "PBEWITHHMACSHA512ANDAES_256";
 
@@ -51,14 +51,14 @@ import static org.jasypt.encryption.pbe.StandardPBEByteEncryptor.DEFAULT_KEY_OBT
     int keyObtentionIterations() default DEFAULT_KEY_OBTENTION_ITERATIONS;
 
     @AttributeDefinition(
-        name = "Provider Name",
-        description = "TODO"
+        name = "Security Provider Name",
+        description = "name of the Security Provider"
     )
-    String providerName();
+    String securityProviderName();
 
     @AttributeDefinition(
         name = "String Output Type",
-        description = "TODO",
+        description = "encoding format of the encrypted string output",
         options = {
             @Option(label = "Base16 (hexadecimal)", value = STRING_OUTPUT_TYPE_HEXADECIMAL),
             @Option(label = "Base64", value = STRING_OUTPUT_TYPE_BASE64)
@@ -67,27 +67,27 @@ import static org.jasypt.encryption.pbe.StandardPBEByteEncryptor.DEFAULT_KEY_OBT
     String stringOutputType() default STRING_OUTPUT_TYPE_BASE64;
 
     @AttributeDefinition(
-        name = "Provider Name",
-        description = "TODO"
+        name = "Password Provider Target",
+        description = "filter expression to target a Password Provider"
     )
-    String passwordProvider_target();
+    String passwordProvider_target() default "*";
 
     @AttributeDefinition(
-        name = "Provider Name",
+        name = "Security Provider Target",
         description = "filter expression to target a Security Provider"
     )
-    String provider_target();
+    String securityProvider_target() default "*";
 
     @AttributeDefinition(
         name = "IV Generator Target",
         description = "filter expression to target an IV Generator"
     )
-    String ivGenerator_target();
+    String ivGenerator_target() default "*";
 
     @AttributeDefinition(
-        name = "Provider Name",
+        name = "Salt Generator Target",
         description = "filter expression to target a Salt Generator"
     )
-    String saltGenerator_target();
+    String saltGenerator_target() default "*";
 
 }
diff --git a/src/test/java/org/apache/sling/commons/crypto/it/tests/CryptoTestSupport.java b/src/test/java/org/apache/sling/commons/crypto/it/tests/CryptoTestSupport.java
index 34a61f7..d77f586 100644
--- a/src/test/java/org/apache/sling/commons/crypto/it/tests/CryptoTestSupport.java
+++ b/src/test/java/org/apache/sling/commons/crypto/it/tests/CryptoTestSupport.java
@@ -36,7 +36,6 @@ public abstract class CryptoTestSupport extends TestSupport {
             // Sling Commons Crypto
             testBundle("bundle.filename"),
             mavenBundle().groupId("org.apache.commons").artifactId("commons-lang3").versionAsInProject(),
-            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.jasypt").versionAsInProject(),
             scr(),
             // testing
             junitBundles(),
diff --git a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java b/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptCryptoTestSupport.java
similarity index 55%
copy from src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java
copy to src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptCryptoTestSupport.java
index 6483950..6500f80 100644
--- a/src/main/java/org/apache/sling/commons/crypto/jasypt/internal/JasyptRandomIvGeneratorRegistrarConfiguration.java
+++ b/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptCryptoTestSupport.java
@@ -16,22 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.commons.crypto.jasypt.internal;
+package org.apache.sling.commons.crypto.it.tests.jasypt;
 
-import org.jasypt.iv.RandomIvGenerator;
-import org.osgi.service.metatype.annotations.AttributeDefinition;
-import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.apache.sling.commons.crypto.it.tests.CryptoTestSupport;
+import org.ops4j.pax.exam.options.ModifiableCompositeOption;
 
-@ObjectClassDefinition(
-    name = "Apache Sling Commons Crypto “Jasypt Random IV Generator Registrar”",
-    description = "TODO"
-)
-@interface JasyptRandomIvGeneratorRegistrarConfiguration {
+import static org.ops4j.pax.exam.CoreOptions.composite;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 
-    @AttributeDefinition(
-        name = "Algorithm",
-        description = "secure random number generation algorithm"
-    )
-    String algorithm() default RandomIvGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM;
+public abstract class JasyptCryptoTestSupport extends CryptoTestSupport {
+
+    public ModifiableCompositeOption baseConfiguration() {
+        return composite(
+            super.baseConfiguration(),
+            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.jasypt").versionAsInProject()
+        );
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptStandardPBEStringCryptoServiceIT.java b/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptStandardPBEStringCryptoServiceIT.java
index ba44b92..52b1c59 100644
--- a/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptStandardPBEStringCryptoServiceIT.java
+++ b/src/test/java/org/apache/sling/commons/crypto/it/tests/jasypt/JasyptStandardPBEStringCryptoServiceIT.java
@@ -21,7 +21,6 @@ package org.apache.sling.commons.crypto.it.tests.jasypt;
 import javax.inject.Inject;
 
 import org.apache.sling.commons.crypto.CryptoService;
-import org.apache.sling.commons.crypto.it.tests.CryptoTestSupport;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -38,7 +37,7 @@ import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfigurati
 
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
-public class JasyptStandardPBEStringCryptoServiceIT extends CryptoTestSupport {
+public class JasyptStandardPBEStringCryptoServiceIT extends JasyptCryptoTestSupport {
 
     @Inject
     private CryptoService cryptoService;