p2p tls support (#2473)

* Added support for Devp2p-over-tls

Signed-off-by: Saravana Perumal Shanmugam <perusworld@linux.com>
pull/2506/head
Saravana Perumal Shanmugam 3 years ago committed by GitHub
parent 7ed88b70f3
commit a2767b6adc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      .circleci/config.yml
  2. 1
      ethereum/p2p/build.gradle
  3. 9
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetwork.java
  4. 22
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/RlpxAgent.java
  5. 108
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/NettyConnectionInitializer.java
  6. 64
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/NettyTLSConnectionInitializer.java
  7. 184
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSConfiguration.java
  8. 230
      ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactory.java
  9. 412
      ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactoryTest.java
  10. 27
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/crl.pem
  11. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/keys.p12
  12. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/keystore.jks
  13. 6
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/nss.cfg
  14. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/nssdb/cert8.db
  15. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/nssdb/key3.db
  16. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/nssdb/secmod.db
  17. 1
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/nsspin.txt
  18. 72
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/ssl-ca.pem
  19. 129
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/ssl.pem
  20. BIN
      ethereum/p2p/src/test/resources/keys/invalidpartner1client1/truststore.jks
  21. 27
      ethereum/p2p/src/test/resources/keys/partner1client1/crl.pem
  22. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/keys.p12
  23. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/keystore.jks
  24. 6
      ethereum/p2p/src/test/resources/keys/partner1client1/nss.cfg
  25. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/nssdb/cert8.db
  26. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/nssdb/key3.db
  27. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/nssdb/secmod.db
  28. 1
      ethereum/p2p/src/test/resources/keys/partner1client1/nsspin.txt
  29. 70
      ethereum/p2p/src/test/resources/keys/partner1client1/ssl-ca.pem
  30. 126
      ethereum/p2p/src/test/resources/keys/partner1client1/ssl.pem
  31. BIN
      ethereum/p2p/src/test/resources/keys/partner1client1/truststore.jks
  32. 27
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/crl.pem
  33. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/keys.p12
  34. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/keystore.jks
  35. 6
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/nss.cfg
  36. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/nssdb/cert8.db
  37. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/nssdb/key3.db
  38. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/nssdb/secmod.db
  39. 1
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/nsspin.txt
  40. 70
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/ssl-ca.pem
  41. 126
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/ssl.pem
  42. BIN
      ethereum/p2p/src/test/resources/keys/partner1client2rvk/truststore.jks
  43. 27
      ethereum/p2p/src/test/resources/keys/partner2client1/crl.pem
  44. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/keys.p12
  45. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/keystore.jks
  46. 6
      ethereum/p2p/src/test/resources/keys/partner2client1/nss.cfg
  47. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/nssdb/cert8.db
  48. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/nssdb/key3.db
  49. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/nssdb/secmod.db
  50. 1
      ethereum/p2p/src/test/resources/keys/partner2client1/nsspin.txt
  51. 70
      ethereum/p2p/src/test/resources/keys/partner2client1/ssl-ca.pem
  52. 126
      ethereum/p2p/src/test/resources/keys/partner2client1/ssl.pem
  53. BIN
      ethereum/p2p/src/test/resources/keys/partner2client1/truststore.jks
  54. 27
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/crl.pem
  55. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/keys.p12
  56. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/keystore.jks
  57. 6
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/nss.cfg
  58. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/nssdb/cert8.db
  59. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/nssdb/key3.db
  60. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/nssdb/secmod.db
  61. 1
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/nsspin.txt
  62. 70
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/ssl-ca.pem
  63. 126
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/ssl.pem
  64. BIN
      ethereum/p2p/src/test/resources/keys/partner2client2rvk/truststore.jks
  65. 2
      gradle/versions.gradle

@ -35,10 +35,10 @@ commands:
steps:
- checkout
- run:
name: Install Packages - LibSodium
name: Install Packages - LibSodium, nssdb
command: |
sudo apt-get update
sudo apt-get install -y libsodium23 libsodium-dev apt-transport-https haveged
sudo apt-get install -y libsodium23 libsodium-dev apt-transport-https haveged libnss3-tools
sudo service haveged restart
- restore_cache:
name: Restore cached gradle dependencies

@ -31,6 +31,7 @@ dependencies {
implementation project(':crypto')
implementation project(':ethereum:core')
implementation project(':ethereum:rlp')
implementation project(':pki')
implementation project(':metrics:core')
implementation project(':nat')

@ -39,6 +39,7 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.DisconnectCallback;
import org.hyperledger.besu.ethereum.p2p.rlpx.MessageCallback;
import org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.TLSConfiguration;
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability;
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason;
import org.hyperledger.besu.ethereum.storage.StorageProvider;
@ -455,6 +456,7 @@ public class DefaultP2PNetwork implements P2PNetwork {
private MetricsSystem metricsSystem;
private StorageProvider storageProvider;
private Supplier<List<Bytes>> forkIdSupplier;
private Optional<TLSConfiguration> p2pTLSConfiguration = Optional.empty();
public P2PNetwork build() {
validate();
@ -521,6 +523,7 @@ public class DefaultP2PNetwork implements P2PNetwork {
.localNode(localNode)
.metricsSystem(metricsSystem)
.randomPeerPriority(randomPeerPriority)
.p2pTLSConfiguration(p2pTLSConfiguration)
.build();
}
@ -605,5 +608,11 @@ public class DefaultP2PNetwork implements P2PNetwork {
this.forkIdSupplier = forkIdSupplier;
return this;
}
public Builder p2pTLSConfiguration(final Optional<TLSConfiguration> p2pTLSConfiguration) {
checkNotNull(p2pTLSConfiguration);
this.p2pTLSConfiguration = p2pTLSConfiguration;
return this;
}
}
}

@ -32,6 +32,8 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnectionEvents;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerRlpxPermissions;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.RlpxConnection;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.NettyConnectionInitializer;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.NettyTLSConnectionInitializer;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.TLSConfiguration;
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability;
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason;
import org.hyperledger.besu.metrics.BesuMetricCategory;
@ -557,6 +559,7 @@ public class RlpxAgent {
private PeerConnectionEvents connectionEvents;
private boolean randomPeerPriority;
private MetricsSystem metricsSystem;
private Optional<TLSConfiguration> p2pTLSConfiguration;
private Builder() {}
@ -567,9 +570,17 @@ public class RlpxAgent {
connectionEvents = new PeerConnectionEvents(metricsSystem);
}
if (connectionInitializer == null) {
connectionInitializer =
new NettyConnectionInitializer(
nodeKey, config, localNode, connectionEvents, metricsSystem);
if (p2pTLSConfiguration.isPresent()) {
LOG.debug("TLS Configuration found using NettyTLSConnectionInitializer");
connectionInitializer =
new NettyTLSConnectionInitializer(
nodeKey, config, localNode, connectionEvents, metricsSystem, p2pTLSConfiguration);
} else {
LOG.debug("Using default NettyConnectionInitializer");
connectionInitializer =
new NettyConnectionInitializer(
nodeKey, config, localNode, connectionEvents, metricsSystem);
}
}
final PeerRlpxPermissions rlpxPermissions =
@ -647,5 +658,10 @@ public class RlpxAgent {
this.randomPeerPriority = randomPeerPriority;
return this;
}
public Builder p2pTLSConfiguration(final Optional<TLSConfiguration> p2pTLSConfiguration) {
this.p2pTLSConfiguration = p2pTLSConfiguration;
return this;
}
}
}

@ -28,7 +28,9 @@ import org.hyperledger.besu.plugin.data.EnodeURL;
import org.hyperledger.besu.plugin.services.MetricsSystem;
import org.hyperledger.besu.util.Subscribers;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.security.GeneralSecurityException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
@ -37,6 +39,7 @@ import java.util.stream.StreamSupport;
import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
@ -46,6 +49,7 @@ import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.util.concurrent.SingleThreadEventExecutor;
import org.jetbrains.annotations.NotNull;
public class NettyConnectionInitializer implements ConnectionInitializer {
@ -170,30 +174,7 @@ public class NettyConnectionInitializer implements ConnectionInitializer {
.remoteAddress(new InetSocketAddress(enode.getIp(), enode.getListeningPort().get()))
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT_SECONDS * 1000)
.handler(
new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(final SocketChannel ch) {
ch.pipeline()
.addLast(
new TimeoutHandler<>(
connectionFuture::isDone,
TIMEOUT_SECONDS,
() ->
connectionFuture.completeExceptionally(
new TimeoutException(
"Timed out waiting to establish connection with peer: "
+ peer.getId()))),
new HandshakeHandlerOutbound(
nodeKey,
peer,
config.getSupportedProtocols(),
localNode,
connectionFuture,
eventDispatcher,
metricsSystem));
}
})
.handler(outboundChannelInitializer(peer, connectionFuture))
.connect()
.addListener(
(f) -> {
@ -205,35 +186,82 @@ public class NettyConnectionInitializer implements ConnectionInitializer {
return connectionFuture;
}
/** @return a channel initializer for outbound connections */
@NotNull
private ChannelInitializer<SocketChannel> outboundChannelInitializer(
final Peer peer, final CompletableFuture<PeerConnection> connectionFuture) {
return new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(final SocketChannel ch) throws Exception {
ch.pipeline()
.addLast(
timeoutHandler(
connectionFuture,
"Timed out waiting to establish connection with peer: " + peer.getId()));
addAdditionalOutboundHandlers(ch);
ch.pipeline().addLast(outboundHandler(peer, connectionFuture));
}
};
}
/** @return a channel initializer for inbound connections */
private ChannelInitializer<SocketChannel> inboundChannelInitializer() {
return new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(final SocketChannel ch) {
protected void initChannel(final SocketChannel ch) throws Exception {
final CompletableFuture<PeerConnection> connectionFuture = new CompletableFuture<>();
connectionFuture.thenAccept(
connection -> connectSubscribers.forEach(c -> c.onConnect(connection)));
ch.pipeline()
.addLast(
new TimeoutHandler<>(
connectionFuture::isDone,
TIMEOUT_SECONDS,
() ->
connectionFuture.completeExceptionally(
new TimeoutException(
"Timed out waiting to fully establish incoming connection"))),
new HandshakeHandlerInbound(
nodeKey,
config.getSupportedProtocols(),
localNode,
connectionFuture,
eventDispatcher,
metricsSystem));
timeoutHandler(
connectionFuture, "Timed out waiting to fully establish incoming connection"));
addAdditionalInboundHandlers(ch);
ch.pipeline().addLast(inboundHandler(connectionFuture));
}
};
}
@NotNull
private HandshakeHandlerInbound inboundHandler(
final CompletableFuture<PeerConnection> connectionFuture) {
return new HandshakeHandlerInbound(
nodeKey,
config.getSupportedProtocols(),
localNode,
connectionFuture,
eventDispatcher,
metricsSystem);
}
@NotNull
private HandshakeHandlerOutbound outboundHandler(
final Peer peer, final CompletableFuture<PeerConnection> connectionFuture) {
return new HandshakeHandlerOutbound(
nodeKey,
peer,
config.getSupportedProtocols(),
localNode,
connectionFuture,
eventDispatcher,
metricsSystem);
}
@NotNull
private TimeoutHandler<Channel> timeoutHandler(
final CompletableFuture<PeerConnection> connectionFuture, final String s) {
return new TimeoutHandler<>(
connectionFuture::isDone,
TIMEOUT_SECONDS,
() -> connectionFuture.completeExceptionally(new TimeoutException(s)));
}
protected void addAdditionalOutboundHandlers(final SocketChannel ch)
throws GeneralSecurityException, IOException {}
protected void addAdditionalInboundHandlers(final SocketChannel ch)
throws GeneralSecurityException, IOException {}
private IntSupplier pendingTaskCounter(final EventLoopGroup eventLoopGroup) {
return () ->
StreamSupport.stream(eventLoopGroup.spliterator(), false)

@ -0,0 +1,64 @@
/*
* Copyright ConsenSys AG.
*
* Licensed 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.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty;
import org.hyperledger.besu.crypto.NodeKey;
import org.hyperledger.besu.ethereum.p2p.config.RlpxConfiguration;
import org.hyperledger.besu.ethereum.p2p.peers.LocalNode;
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnectionEventDispatcher;
import org.hyperledger.besu.plugin.services.MetricsSystem;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Optional;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.ssl.SslContext;
public class NettyTLSConnectionInitializer extends NettyConnectionInitializer {
private final Optional<TLSConfiguration> p2pTLSConfiguration;
public NettyTLSConnectionInitializer(
final NodeKey nodeKey,
final RlpxConfiguration config,
final LocalNode localNode,
final PeerConnectionEventDispatcher eventDispatcher,
final MetricsSystem metricsSystem,
final Optional<TLSConfiguration> p2pTLSConfiguration) {
super(nodeKey, config, localNode, eventDispatcher, metricsSystem);
this.p2pTLSConfiguration = p2pTLSConfiguration;
}
@Override
protected void addAdditionalOutboundHandlers(final SocketChannel ch)
throws GeneralSecurityException, IOException {
if (p2pTLSConfiguration.isPresent()) {
SslContext sslContext =
TLSContextFactory.buildFrom(p2pTLSConfiguration.get()).createNettyClientSslContext();
ch.pipeline().addLast("ssl", sslContext.newHandler(ch.alloc()));
}
}
@Override
protected void addAdditionalInboundHandlers(final SocketChannel ch)
throws GeneralSecurityException, IOException {
if (p2pTLSConfiguration.isPresent()) {
SslContext sslContext =
TLSContextFactory.buildFrom(p2pTLSConfiguration.get()).createNettyServerSslContext();
ch.pipeline().addLast("ssl", sslContext.newHandler(ch.alloc()));
}
}
}

@ -0,0 +1,184 @@
/*
* Copyright ConsenSys AG.
*
* Licensed 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.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty;
import static java.util.Objects.requireNonNull;
import java.nio.file.Path;
import java.util.function.Supplier;
public class TLSConfiguration {
private final String keyStoreType;
private final Path keyStorePath;
private final Supplier<String> keyStorePasswordSupplier;
private final Path keyStorePasswordPath;
private final String trustStoreType;
private final Path trustStorePath;
private final Supplier<String> trustStorePasswordSupplier;
private final Path trustStorePasswordPath;
private final Path crlPath;
private final String[] allowedProtocols;
private TLSConfiguration(
final String keyStoreType,
final Path keyStorePath,
final Supplier<String> keyStorePasswordSupplier,
final Path keyStorePasswordPath,
final String trustStoreType,
final Path trustStorePath,
final Supplier<String> trustStorePasswordSupplier,
final Path trustStorePasswordPath,
final Path crlPath,
final String[] allowedProtocols) {
this.keyStoreType = keyStoreType;
this.keyStorePath = keyStorePath;
this.keyStorePasswordSupplier = keyStorePasswordSupplier;
this.keyStorePasswordPath = keyStorePasswordPath;
this.trustStoreType = trustStoreType;
this.trustStorePath = trustStorePath;
this.trustStorePasswordSupplier = trustStorePasswordSupplier;
this.trustStorePasswordPath = trustStorePasswordPath;
this.crlPath = crlPath;
this.allowedProtocols = allowedProtocols;
}
public String getKeyStoreType() {
return keyStoreType;
}
public Path getKeyStorePath() {
return keyStorePath;
}
public String getKeyStorePassword() {
return null == keyStorePasswordSupplier ? null : keyStorePasswordSupplier.get();
}
public Path getKeyStorePasswordPath() {
return keyStorePasswordPath;
}
public String getTrustStoreType() {
return trustStoreType;
}
public Path getTrustStorePath() {
return trustStorePath;
}
public String getTrustStorePassword() {
return null == trustStorePasswordSupplier ? null : trustStorePasswordSupplier.get();
}
public Path getTrustStorePasswordPath() {
return trustStorePasswordPath;
}
public Path getCrlPath() {
return crlPath;
}
public String[] getAllowedProtocols() {
return allowedProtocols;
}
public static final class Builder {
private String keyStoreType;
private Path keyStorePath;
private Supplier<String> keyStorePasswordSupplier;
private Path keyStorePasswordPath;
private String trustStoreType;
private Path trustStorePath;
private Supplier<String> trustStorePasswordSupplier;
private Path trustStorePasswordPath;
private Path crlPath;
private String[] allowedProtocols;
private Builder() {}
public static Builder tlsConfiguration() {
return new Builder();
}
public Builder withKeyStoreType(final String keyStoreType) {
this.keyStoreType = keyStoreType;
return this;
}
public Builder withKeyStorePath(final Path keyStorePath) {
this.keyStorePath = keyStorePath;
return this;
}
public Builder withKeyStorePasswordPath(final Path keyStorePasswordPath) {
this.keyStorePasswordPath = keyStorePasswordPath;
return this;
}
public Builder withKeyStorePasswordSupplier(final Supplier<String> keyStorePasswordSupplier) {
this.keyStorePasswordSupplier = keyStorePasswordSupplier;
return this;
}
public Builder withTrustStoreType(final String trustStoreType) {
this.trustStoreType = trustStoreType;
return this;
}
public Builder withTrustStorePath(final Path trustStorePath) {
this.trustStorePath = trustStorePath;
return this;
}
public Builder withTrustStorePasswordSupplier(
final Supplier<String> trustStorePasswordSupplier) {
this.trustStorePasswordSupplier = trustStorePasswordSupplier;
return this;
}
public Builder withTrustStorePasswordPath(final Path trustStorePasswordPath) {
this.trustStorePasswordPath = trustStorePasswordPath;
return this;
}
public Builder withCrlPath(final Path crlPath) {
this.crlPath = crlPath;
return this;
}
public Builder withAllowedProtocols(final String[] allowedProtocols) {
this.allowedProtocols = allowedProtocols;
return this;
}
public TLSConfiguration build() {
requireNonNull(keyStoreType, "Key Store Type must not be null");
requireNonNull(keyStorePasswordSupplier, "Key Store password supplier must not be null");
return new TLSConfiguration(
keyStoreType,
keyStorePath,
keyStorePasswordSupplier,
keyStorePasswordPath,
trustStoreType,
trustStorePath,
trustStorePasswordSupplier,
trustStorePasswordPath,
crlPath,
allowedProtocols);
}
}
}

@ -0,0 +1,230 @@
/*
* Copyright ConsenSys AG.
*
* Licensed 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.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty;
import org.hyperledger.besu.pki.keystore.HardwareKeyStoreWrapper;
import org.hyperledger.besu.pki.keystore.KeyStoreWrapper;
import org.hyperledger.besu.pki.keystore.SoftwareKeyStoreWrapper;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509CRL;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import io.netty.handler.ssl.ClientAuth;
import io.netty.handler.ssl.IdentityCipherSuiteFilter;
import io.netty.handler.ssl.JdkSslContext;
import io.netty.handler.ssl.SslContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TLSContextFactory {
private static final Logger LOG = LogManager.getLogger();
private static final String[] ALLOWED_PROTOCOLS = {"TLSv1.3"};
private static final String KEYMANAGER_FACTORY_ALGORITHM = "PKIX";
private static final String TRUSTMANAGER_FACTORY_ALGORITHM = "PKIX";
private List<String> enabledCipherSuites = null;
private KeyManagerFactory kmf;
private TrustManagerFactory tmf;
private Collection<X509CRL> crls;
private String[] allowedProtocols;
protected TLSContextFactory() {}
protected TLSContextFactory(
final String keystorePass,
final KeyStoreWrapper keystoreWrapper,
final List<String> configuredCipherSuites,
final String[] allowedProtocols)
throws GeneralSecurityException, IOException {
kmf = getKeyManagerFactory(keystoreWrapper.getKeyStore(), keystorePass);
tmf = getTrustManagerFactory(keystoreWrapper.getTrustStore());
crls = keystoreWrapper.getCRLs();
if (configuredCipherSuites != null && !configuredCipherSuites.isEmpty()) {
enabledCipherSuites = configuredCipherSuites;
}
this.allowedProtocols = null == allowedProtocols ? ALLOWED_PROTOCOLS : allowedProtocols;
}
public static TLSContextFactory getInstance(
final String keyStorePassword, final KeyStoreWrapper wrapper, final String[] allowedProtocols)
throws GeneralSecurityException, IOException {
return new TLSContextFactory(keyStorePassword, wrapper, null, allowedProtocols);
}
public static TLSContextFactory getInstance(
final String keyStorePassword, final KeyStoreWrapper wrapper)
throws GeneralSecurityException, IOException {
return new TLSContextFactory(keyStorePassword, wrapper, null, null);
}
public SslContext createNettyServerSslContext()
throws NoSuchAlgorithmException, KeyManagementException {
final List<String> enabledCipherSuites = getEnabledCipherSuites();
return new JdkSslContext(
createJavaSslContext(),
false,
enabledCipherSuites,
IdentityCipherSuiteFilter.INSTANCE,
null,
ClientAuth.REQUIRE,
null,
false);
}
public SslContext createNettyClientSslContext()
throws NoSuchAlgorithmException, KeyManagementException {
final List<String> enabledCipherSuites = getEnabledCipherSuites();
return new JdkSslContext(
createJavaSslContext(),
true,
enabledCipherSuites,
IdentityCipherSuiteFilter.INSTANCE,
null,
ClientAuth.NONE,
null,
false);
}
public SSLContext createJavaSslContext() throws NoSuchAlgorithmException, KeyManagementException {
final SSLContext context = SSLContext.getInstance(getTlsProtocol());
context.init(
kmf.getKeyManagers(),
null == crls || crls.isEmpty() ? tmf.getTrustManagers() : wrap(tmf.getTrustManagers()),
null);
return context;
}
protected TrustManager[] wrap(final TrustManager[] trustMgrs) {
final TrustManager[] ret = trustMgrs.clone();
for (int i = 0; i < ret.length; i++) {
TrustManager trustMgr = ret[i];
if (trustMgr instanceof X509TrustManager) {
X509TrustManager x509TrustManager = (X509TrustManager) trustMgr;
ret[i] =
new X509TrustManager() {
@Override
public void checkClientTrusted(
final X509Certificate[] x509Certificates, final String s)
throws CertificateException {
checkRevoked(x509Certificates);
x509TrustManager.checkClientTrusted(x509Certificates, s);
}
@Override
public void checkServerTrusted(
final X509Certificate[] x509Certificates, final String s)
throws CertificateException {
checkRevoked(x509Certificates);
x509TrustManager.checkServerTrusted(x509Certificates, s);
}
private void checkRevoked(final X509Certificate[] x509Certificates)
throws CertificateException {
for (X509CRL crl : crls) {
for (X509Certificate cert : x509Certificates) {
if (crl.isRevoked(cert)) {
throw new CertificateException("Certificate revoked");
}
}
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return x509TrustManager.getAcceptedIssuers();
}
};
}
}
return ret;
}
protected TrustManagerFactory getTrustManagerFactory(final KeyStore truststore)
throws GeneralSecurityException {
final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TRUSTMANAGER_FACTORY_ALGORITHM);
tmf.init(truststore);
return tmf;
}
protected KeyManagerFactory getKeyManagerFactory(
final KeyStore keystore, final String keystorePassword) throws GeneralSecurityException {
final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KEYMANAGER_FACTORY_ALGORITHM);
kmf.init(keystore, keystorePassword.toCharArray());
return kmf;
}
private List<String> getEnabledCipherSuites() {
final String protocol = getTlsProtocol();
try {
if (enabledCipherSuites == null || enabledCipherSuites.isEmpty()) {
final SSLContext sslcontext = SSLContext.getInstance(protocol);
sslcontext.init(null, null, null);
enabledCipherSuites = Arrays.asList(sslcontext.createSSLEngine().getEnabledCipherSuites());
}
} catch (final NoSuchAlgorithmException | KeyManagementException e) {
LOG.warn(
"Could not get list of enabled (JDK) cipher suites for protocol:{}, reverting to Netty's default ones.",
protocol);
}
return enabledCipherSuites;
}
private String getTlsProtocol() {
return Arrays.stream(allowedProtocols).max(Comparator.naturalOrder()).orElse(null);
}
public static TLSContextFactory buildFrom(final TLSConfiguration config)
throws GeneralSecurityException, IOException {
TLSContextFactory ret = null;
if (null != config) {
LOG.info("Initializing SSL Context using {} keystore.", config.getKeyStoreType());
KeyStoreWrapper wrapper =
KeyStoreWrapper.KEYSTORE_TYPE_PKCS11.equalsIgnoreCase(config.getKeyStoreType())
? new HardwareKeyStoreWrapper(
config.getKeyStorePassword(), config.getKeyStorePath(), config.getCrlPath())
: new SoftwareKeyStoreWrapper(
config.getKeyStoreType(),
config.getKeyStorePath(),
config.getKeyStorePassword(),
config.getTrustStoreType(),
config.getTrustStorePath(),
config.getTrustStorePassword(),
config.getCrlPath());
ret =
TLSContextFactory.getInstance(
config.getKeyStorePassword(), wrapper, config.getAllowedProtocols());
}
return ret;
}
}

@ -0,0 +1,412 @@
/*
* Copyright ConsenSys AG.
*
* Licensed 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.
*
* SPDX-License-Identifier: Apache-2.0
*/
package org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty;
import static org.assertj.core.api.Assertions.assertThat;
import org.hyperledger.besu.pki.PkiException;
import org.hyperledger.besu.pki.keystore.HardwareKeyStoreWrapper;
import org.hyperledger.besu.pki.keystore.KeyStoreWrapper;
import org.hyperledger.besu.pki.keystore.SoftwareKeyStoreWrapper;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class TLSContextFactoryTest {
private static final String JKS = "JKS";
private static final String validKeystorePassword = "test123";
private static final String partner1client1PKCS11Config = "/keys/partner1client1/nss.cfg";
private static final String partner1client1JKSKeystore = "/keys/partner1client1/keystore.jks";
private static final String partner1client1JKSTruststore = "/keys/partner1client1/truststore.jks";
private static final String partner1client1CRL = "/keys/partner1client1/crl.pem";
private static final String partner1client2rvkJKSKeystore =
"/keys/partner1client2rvk/keystore.jks";
private static final String partner1client2rvkJKSTruststore =
"/keys/partner1client2rvk/truststore.jks";
private static final String partner2client1JKSKeystore = "/keys/partner2client1/keystore.jks";
private static final String partner2client1JKSTruststore = "/keys/partner2client1/truststore.jks";
private static final String partner2client1CRL = "/keys/partner2client1/crl.pem";
private static final String invalidPartner1client1JKSKeystore =
"/keys/invalidpartner1client1/keystore.jks";
private static final String invalidPartner1client1JKSTruststore =
"/keys/invalidpartner1client1/truststore.jks";
private static final String invalidPartner1client1CRL = "/keys/invalidpartner1client1/crl.pem";
private static final String partner2client2rvkJKSKeystore =
"/keys/partner2client2rvk/keystore.jks";
private static final String partner2client2rvkJKSTruststore =
"/keys/partner2client2rvk/truststore.jks";
private static final Logger LOG = LogManager.getLogger();
private static final int MAX_NUMBER_MESSAGES = 10;
private Server server;
private Client client;
@Parameterized.Parameter public String keyStoreWrapperDescription;
@Parameterized.Parameter(1)
public boolean testSuccess;
@Parameterized.Parameter(2)
public KeyStoreWrapper serverKeyStoreWrapper;
@Parameterized.Parameter(3)
public KeyStoreWrapper clientKeyStoreWrapper;
@Parameterized.Parameters(name = "{index}: {0}")
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][] {
{
"JKS serverPartner1Client1 -> JKS clientPartner2Client1 SuccessfulConnection",
true,
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL),
getSoftwareKeyStoreWrapper(
partner2client1JKSKeystore, partner2client1JKSTruststore, partner2client1CRL)
},
{
"JKS serverPartner2Client1 -> JKS clientPartner1Client1 SuccessfulConnection",
true,
getSoftwareKeyStoreWrapper(
partner2client1JKSKeystore, partner2client1JKSTruststore, partner2client1CRL),
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL)
},
{
"PKCS11 serverPartner1Client1 -> JKS clientPartner2Client1 SuccessfulConnection",
true,
getHardwareKeyStoreWrapper(partner1client1PKCS11Config, partner1client1CRL),
getSoftwareKeyStoreWrapper(
partner2client1JKSKeystore, partner2client1JKSTruststore, partner2client1CRL)
},
{
"JKS serverPartner1Client1 -> JKS clientInvalidPartner1Client1 FailedConnection",
false,
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL),
getSoftwareKeyStoreWrapper(
invalidPartner1client1JKSKeystore,
invalidPartner1client1JKSTruststore,
invalidPartner1client1CRL)
},
{
"JKS serverInvalidPartner1Client1 -> JKS clientPartner1Client1 FailedConnection",
false,
getSoftwareKeyStoreWrapper(
invalidPartner1client1JKSKeystore,
invalidPartner1client1JKSTruststore,
invalidPartner1client1CRL),
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL)
},
{
"PKCS11 serverPartner1Client1 -> JKS clientInvalidPartner1Client1 FailedConnection",
false,
getHardwareKeyStoreWrapper(partner1client1PKCS11Config, partner1client1CRL),
getSoftwareKeyStoreWrapper(
invalidPartner1client1JKSKeystore,
invalidPartner1client1JKSTruststore,
invalidPartner1client1CRL)
},
{
"JKS serverPartner1Client2rvk -> JKS clientPartner2Client1 FailedConnection",
false,
getSoftwareKeyStoreWrapper(
partner1client2rvkJKSKeystore, partner1client2rvkJKSTruststore, null),
getSoftwareKeyStoreWrapper(
partner2client1JKSKeystore, partner2client1JKSTruststore, partner2client1CRL)
},
{
"JKS serverPartner2Client1 -> JKS clientPartner1Client2rvk FailedConnection",
false,
getSoftwareKeyStoreWrapper(
partner2client1JKSKeystore, partner2client1JKSTruststore, partner2client1CRL),
getSoftwareKeyStoreWrapper(
partner1client2rvkJKSKeystore, partner1client2rvkJKSTruststore, null)
},
{
"PKCS11 serverPartner1Client1 -> JKS clientPartner1Client2rvk FailedConnection",
false,
getHardwareKeyStoreWrapper(partner1client1PKCS11Config, partner1client1CRL),
getSoftwareKeyStoreWrapper(
partner1client2rvkJKSKeystore, partner1client2rvkJKSTruststore, null)
},
{
"JKS serverPartner2Client2rvk -> JKS clientPartner1Client1 FailedConnection",
false,
getSoftwareKeyStoreWrapper(
partner2client2rvkJKSKeystore, partner2client2rvkJKSTruststore, null),
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL)
},
{
"JKS serverPartner1Client1 -> JKS clientPartner2Client2rvk FailedConnection",
false,
getSoftwareKeyStoreWrapper(
partner1client1JKSKeystore, partner1client1JKSTruststore, partner1client1CRL),
getSoftwareKeyStoreWrapper(
partner2client2rvkJKSKeystore, partner2client2rvkJKSTruststore, null)
}
});
}
@Before
public void init() throws IOException, InterruptedException {}
@After
public void tearDown() {
if (client != null) {
client.stop();
}
if (server != null) {
server.stop();
}
}
private static Path toPath(final String path) throws Exception {
return null == path ? null : Path.of(TLSContextFactoryTest.class.getResource(path).toURI());
}
private static KeyStoreWrapper getHardwareKeyStoreWrapper(
final String config, final String crlLocation) {
try {
return new HardwareKeyStoreWrapper(
validKeystorePassword, toPath(config), toPath(crlLocation));
} catch (Exception e) {
throw new PkiException("Failed to initialize hardware keystore", e);
}
}
private static KeyStoreWrapper getSoftwareKeyStoreWrapper(
final String jksKeyStore, final String trustStore, final String crl) {
try {
return new SoftwareKeyStoreWrapper(
JKS,
toPath(jksKeyStore),
validKeystorePassword,
JKS,
toPath(trustStore),
null,
toPath(crl));
} catch (Exception e) {
throw new PkiException("Failed to initialize software keystore", e);
}
}
@Test
public void testConnection() throws Exception {
final CountDownLatch serverLatch = new CountDownLatch(MAX_NUMBER_MESSAGES);
final CountDownLatch clientLatch = new CountDownLatch(MAX_NUMBER_MESSAGES);
server = startServer(serverKeyStoreWrapper, serverLatch);
client = startClient(server.port, clientKeyStoreWrapper, clientLatch);
if (testSuccess) {
client.getChannelFuture().channel().writeAndFlush(Unpooled.copyInt(0));
final boolean allMessagesServerExchanged = serverLatch.await(10, TimeUnit.SECONDS);
final boolean allMessagesClientExchanged = clientLatch.await(10, TimeUnit.SECONDS);
assertThat(allMessagesClientExchanged && allMessagesServerExchanged).isTrue();
} else {
try {
client.getChannelFuture().channel().writeAndFlush(Unpooled.copyInt(0)).sync();
serverLatch.await(2, TimeUnit.SECONDS);
assertThat(client.getChannelFuture().channel().isActive()).isFalse();
} catch (Exception e) {
// NOOP
}
}
}
private Server startServer(final KeyStoreWrapper keyStoreWrapper, final CountDownLatch latch)
throws Exception {
final Server nettyServer = new Server(validKeystorePassword, keyStoreWrapper, latch);
nettyServer.start();
return nettyServer;
}
private Client startClient(
final int port, final KeyStoreWrapper keyStoreWrapper, final CountDownLatch latch)
throws Exception {
final Client nettyClient = new Client(port, validKeystorePassword, keyStoreWrapper, latch);
nettyClient.start();
return nettyClient;
}
static class MessageHandler extends ChannelInboundHandlerAdapter {
private final String id;
private final CountDownLatch latch;
public MessageHandler(final String id, final CountDownLatch latch) {
this.id = id;
this.latch = latch;
}
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object msg)
throws InterruptedException {
final int message = ((ByteBuf) msg).readInt();
LOG.info("[" + id + "] Received message: " + message);
if (message < 2 * MAX_NUMBER_MESSAGES) {
final int replyMessage = message + 1;
ctx.writeAndFlush(Unpooled.copyInt(replyMessage)).sync();
LOG.info("[" + id + "] Sent message: " + replyMessage);
this.latch.countDown();
LOG.info("Remaining {}", this.latch.getCount());
}
}
}
static class Client {
int port;
private final String keystorePassword;
private final KeyStoreWrapper keyStoreWrapper;
private final CountDownLatch latch;
private ChannelFuture channelFuture;
private final EventLoopGroup group = new NioEventLoopGroup();
public ChannelFuture getChannelFuture() {
return channelFuture;
}
Client(
final int port,
final String keystorePassword,
final KeyStoreWrapper keyStoreWrapper,
final CountDownLatch latch) {
this.port = port;
this.keystorePassword = keystorePassword;
this.keyStoreWrapper = keyStoreWrapper;
this.latch = latch;
}
void start() throws Exception {
final Bootstrap b = new Bootstrap();
b.group(group);
b.channel(NioSocketChannel.class);
b.handler(
new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(final SocketChannel socketChannel) throws Exception {
SslContext sslContext =
TLSContextFactory.getInstance(keystorePassword, keyStoreWrapper)
.createNettyClientSslContext();
final SslHandler sslHandler = sslContext.newHandler(socketChannel.alloc());
socketChannel.pipeline().addFirst("ssl", sslHandler);
socketChannel.pipeline().addLast(new MessageHandler("Client", latch));
}
});
final ChannelFuture cf = b.connect("127.0.0.1", this.port).sync();
this.channelFuture = cf;
}
public void stop() {
group.shutdownGracefully();
}
}
static class Server {
private int port;
private final String keystorePassword;
private final KeyStoreWrapper keyStoreWrapper;
private final CountDownLatch latch;
private Channel channel;
private ChannelFuture channelFuture;
private final EventLoopGroup parentGroup = new NioEventLoopGroup();
private final EventLoopGroup childGroup = new NioEventLoopGroup();
Server(
final String keystorePassword,
final KeyStoreWrapper keyStoreWrapper,
final CountDownLatch latch) {
this.keystorePassword = keystorePassword;
this.keyStoreWrapper = keyStoreWrapper;
this.latch = latch;
}
public ChannelFuture getChannelFuture() {
return channelFuture;
}
void start() throws Exception {
final ServerBootstrap sb = new ServerBootstrap();
sb.group(parentGroup, childGroup)
.channel(NioServerSocketChannel.class)
.childHandler(
new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(final SocketChannel socketChannel) throws Exception {
SslContext sslContext =
TLSContextFactory.getInstance(keystorePassword, keyStoreWrapper)
.createNettyServerSslContext();
final SslHandler sslHandler = sslContext.newHandler(channel.alloc());
socketChannel.pipeline().addFirst("ssl", sslHandler);
socketChannel.pipeline().addLast(new MessageHandler("Server", latch));
}
});
final ChannelFuture cf = sb.bind(0).sync();
this.channel = cf.channel();
this.channelFuture = cf;
this.port = ((InetSocketAddress) channel.localAddress()).getPort();
}
public void stop() {
childGroup.shutdownGracefully();
parentGroup.shutdownGracefully();
}
}
}

@ -0,0 +1,27 @@
-----BEGIN X509 CRL-----
MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290
MRMwEQYDVQQDDApwYXJ0bmVyMWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyMWNh
QHBhcnRuZXIxLmNvbRcNMjEwNjA3MTkxNzI4WhcNMjIwNjA3MTkxNzI4WjAnMCUC
FFFuSkrE8m/dVEcso4PkZUFYmvFBFw0yMTA2MDcxOTE3MjhaoA4wDDAKBgNVHRQE
AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAQujFul5rvGr4yytm/mjPQdcbeSTM3uT/
aFM6WbPE6DHx5/R1ItNCyA7YdfxzojfZ+kzR7j0WsSydWT2TngHD/2C6tIhXZRcG
UG6E473xniLFctn0FYyKZL03pOwdQgWk4dCUd3Ko8Qbos+vTRClXPMnPANPwJjYG
7x1UlEPShHaoQNiDakuUa6fGZyyFGbTWuH1zltH3aUKh/L2w1/Sndkv66Cmr4VQ0
s/ZsMnjJNPrjZJs32BzjxVaWYToe6vpwiQ6+UGyaZ3GTfv6r/oTWeRxcmQeXAT03
kxbwywkQwFndeC9NlrOQRM+TipsOybeiJToQskmPiEJ/7xfUAHOV3w==
-----END X509 CRL-----
-----BEGIN X509 CRL-----
MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v
dDETMBEGA1UEAwwKcGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJj
YUBwYXJ0bmVyMi5jb20XDTIxMDYwNzE5MTcyOFoXDTIyMDYwNzE5MTcyOFowTjAl
AhQtbA3PphdVjORDUvomlgGblf8OABcNMjEwNjA3MTkxNzI4WjAlAhRRbkpKxPJv
3VRHLKOD5GVBWJrxQRcNMjEwNjA3MTkxNzI4WqAOMAwwCgYDVR0UBAMCAQEwDQYJ
KoZIhvcNAQELBQADggEBAJXmtYDcF+sA0zQiRiCOIALVUQ4i0t4UwREEL7SEzD9C
hAOas0uFwkPef1hQWNkvx+OghFb3fStKS1zh9zbJx0fxyKttfsaaW2dQX4H8tyRR
vtuNtZBv/PT2ouWdpumSh9TmQUxKr/Uer5gGaqOm1S5MOemOVEYfsNqAzSnGI7f9
v5yMDywigHfv2dmM7xpttSZG3WCd5w0PJisndyAV/qga3CQMI5X6DIpWHmHbcD3k
sSps2YggdueW7y61uoi61jvpOGTbr6UAWLjHRyL35txC9xOMGJgJqBgebw/hGmW9
syY2loiEfzWX0A/9KGPo6Q8PB2YJbMmc7WT04g5W++8=
-----END X509 CRL-----

@ -0,0 +1,6 @@
name = NSScrypto-invalidpartner1client1
nssSecmodDirectory = ./src/test/resources/keys/invalidpartner1client1/nssdb
nssDbMode = readOnly
nssModule = keystore

@ -0,0 +1,72 @@
-----BEGIN CERTIFICATE-----
MIIEFDCCAvygAwIBAgIUK7zDrM1bZ8uhFadVKFJAvYr7KK0wDQYJKoZIhvcNAQEL
BQAwgYYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEXMBUGA1UEAwwOaW52YWxpZGludGVy
Y2ExJzAlBgkqhkiG9w0BCQEWGGludmFsaWRpbnRlcmNhQGFkbWluLmNvbTAgFw0y
MTA2MDcxOTE3MjBaGA8yMTIxMDUxNDE5MTcyMFowgZYxCzAJBgNVBAYTAlVTMQsw
CQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwE
cm9vdDEaMBgGA1UEAwwRaW52YWxpZHBhcnRuZXIxY2ExNDAyBgkqhkiG9w0BCQEW
JWludmFsaWRwYXJ0bmVyMWNhQGludmFsaWRwYXJ0bmVyMS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdNAUgeC4azUM3Y1X767u9x0VktNS0khDg
53NvEtD15l6emELSvIVof0M/tXbSaDDe1RK8NyLFVeV0CawK6MYVO44rHVjp580w
dVC+3M9qrCvtt5ZKf12DYt9CrPsuNSp9qfsw07xJP7Mood43xV61+p/04EVJ13Aw
AnKNQz/IpaKX44ddlgJUbrjJ5fzvSPRxqPWr+X64fpKG/kbycuG22TJBiRpGu+KO
pTZl21Ved+EChr/jEU/1cWGnWorolpxftrQGkKVeIO9tIkEssPJ/Gvz9nBdix95X
2dFEQVwyiNONBvZP9N/R/VTQfadD35OUSTTjUOW3LKMOG8abfVnfAgMBAAGjZjBk
MB0GA1UdDgQWBBSxZDo4nW3EJYtZcQLmuE4Gffxx1TAfBgNVHSMEGDAWgBSci49+
KDSauQAwRw1tIW5K+dFDdTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAQyq836+vtcMvmlc75iQ0J5hGl4jRHdi9
XdxlmD7iSx0aCAV88WgSO8TwTvKd4plN+45Fh7ZfbRpd4RQNGCHUgvFcZ/iKZ2kd
SFuoFdufMDosI0B9MCCmy+9F5DW3wjDP4zohyoe5gh8VoX5/lDtayrllx7FnRNKL
i2KxdSqKvaQ9Op4//5SNbCRYQz/M9k3I92gh6PtxvwbYD2DMphq3XdibqBICAgqc
MehguFKKsTNuJdYLEaPJ1V4QLOwtsDnSThDRF8P2cJ5jLSmbNSjl4eKZCdzlmAqw
DV94cehbaHaMnpb0xFoQK6TN5WymGIHN/qTHArhkoeZmG7kfw5cf6A==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIECDCCAvCgAwIBAgIUDzY3/t2lD5x6TFJkG+wwjo1Qsh4wDQYJKoZIhvcNAQEL
BQAwgYoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEcMBoGA1UEAwwTcm9vdGludmFsaWRj
YS5hZG1pbjEmMCQGCSqGSIb3DQEJARYXcm9vdGludmFsaWRjYUBhZG1pbi5jb20w
IBcNMjEwNjA3MTkxNzIwWhgPMjEyMTA1MTQxOTE3MjBaMIGGMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNV
BAsMBHJvb3QxFzAVBgNVBAMMDmludmFsaWRpbnRlcmNhMScwJQYJKoZIhvcNAQkB
FhhpbnZhbGlkaW50ZXJjYUBhZG1pbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCh57jnUu4vopH0LjIn4RKrm31KBOZHZJOgbBL+LpNwhDNte+uq
GXAXI1djr4oA5bpSlwghaojbpnTV8qIafL01wwpmevbZG9R97h/tYiHlWP52Bj2j
cK1wIQWpnrpD+Nsc6Cb2UT1M3v1THljh8sT6ZlUgNr/0EpZ90Txb+FBb4g1SVSPg
zhaHAF2VnRNlX7PRkrztOtQfyTK6LdefCIlLczEcAz5oWLXpUOYWzFF8aFvXP/e0
BRjj3xcRFzHiG4E5Spomlf6f2fqSfQa+cawyHxGX9yehwA7S1jsZWvNfINhXl/Zs
LQnaHM885PkATNFFaSOqZuWTH2wi9cyIN/adAgMBAAGjZjBkMB0GA1UdDgQWBBSc
i49+KDSauQAwRw1tIW5K+dFDdTAfBgNVHSMEGDAWgBT/NPV6XAiQbNcxTYXEr/25
5dOgOjASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
9w0BAQsFAAOCAQEAAoiXUj8QyFa8MzyRNFCSRz6/evhJ7OxON9C89C49vIC3S+5p
Vn7SSkzK44OrWaRbVQOI8rbJSAd72iWaMVodHPKUkvFeiFHql6YheX0mnpmFyq72
C5OHMbIo8kMbvEBrawJCx25GKuCV3peloMRWmz7UdAjlTuPiv5WO6/GzBJkAMdw6
ZaySzGghRN6eMKfhwb4NSeC9fZQZ8B41rpYrvp+SWjy6DktMmzpmsKxQ00IiNUe/
rXBJPUCNOLmDaX/iBb4UWTmseo7t7nmYWEwN4YQ7bwKjFi6elqCS68v4fWW+fO1R
4F1Elk3gXEPDiBz1e+0OhK6nzXzr0IrswfthAQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID+TCCAuGgAwIBAgIULStfBL19hwdAOantFEGhxNaVQe0wDQYJKoZIhvcNAQEL
BQAwgYoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEcMBoGA1UEAwwTcm9vdGludmFsaWRj
YS5hZG1pbjEmMCQGCSqGSIb3DQEJARYXcm9vdGludmFsaWRjYUBhZG1pbi5jb20w
IBcNMjEwNjA3MTkxNzIwWhgPMjEyMTA1MTQxOTE3MjBaMIGKMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNV
BAsMBHJvb3QxHDAaBgNVBAMME3Jvb3RpbnZhbGlkY2EuYWRtaW4xJjAkBgkqhkiG
9w0BCQEWF3Jvb3RpbnZhbGlkY2FAYWRtaW4uY29tMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA0iTSh4F18DCcDY2pnBu4g/dwNChnHCSMY+M69jRvj54U
aVIOxmvyTKWPJnsv1bSRuhoFaLpXMyFmCyCp8e617QTNGlPkpu1ByoOjQGeTmTAs
kJV/vpfzD00BriWPXp1fVdg78s2hHh08JjAHWIUVFd1GxXVyJdoW12nxPEmXzHDc
vsRiniu+lkOgz3pmOdtpSNDYuhAL5q8hhZioClbilA5HTEvlvMxbqt2IzrU9vlrR
hZXvtx9w4PXxFfFK8CS3iTOQ+p+4JyAU31VHBJD1iukqZQ1U9P36K5PNRzR2fHxb
jo35J35OcVJ/Dl/CuozmRjJKh4cbs7UAzgsrS1rlpQIDAQABo1MwUTAdBgNVHQ4E
FgQU/zT1elwIkGzXMU2FxK/9ueXToDowHwYDVR0jBBgwFoAU/zT1elwIkGzXMU2F
xK/9ueXToDowDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAAzuG
9JOuuW8v2KUkHDeGqJ9LjMSpti83tz59P33z5jHLBwmRcYWlX0orBbtOTrn1mb9V
+YcTp/zYiUwNmsR1/bTo6+fDyB7i47i7A3CxnyZV+xP8eauB92LDZqlCl8k/ZynU
JgIbKO3fmeWayW3kVqsHy6hJxNN41zWbO3Q3I9j9sh6muFZM4s1w2+FawN/v9qil
hjd3sWMSfkm6cSXZowJ2ExIaw99qG1GyWHaDFufLj2b4lDTm2tP/gXmF6XXIS9iE
WqLxI17zv4npeYA7S5/8uf7tfMWBhAhuGDIXt1mOMCAZziz92VVlSwEkY54wZ9uR
8VovTAmGEM415qM+iA==
-----END CERTIFICATE-----

@ -0,0 +1,129 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0g+rrRCOrs8GR
NKlVgJnMzwR6WEt4oLk5KTJ+PbORcLsPqBslnTwEC0ZFJa4DXKhAGJrtIPfsKWOh
S15nJUE7O+i62e9wcEjjmPCiyzI82UUsmGFTku1lIjgulAd8Nlc+VjZ3sC961tX+
9otUMjH7BrYI0CrjuEremAUdFK6Yw5xiVBJMkl9x+0jWYfJAVQT7+I+WyhUas0uU
GjFlORQNA1xibd+xYk/CCKZ9HyDkNfS3objwSHAVAaRvGvEFGv34cvLNe9dvmZPz
H4gN2gSw/Y5Kf7V42qn6I53VuoIE7JGQfESG6+W/+uYb8vc6+oPfYbEq60LQMLHZ
o2Cou7fnAgMBAAECggEBAJF/5ky1MVy9DJQxeAovClY7YfjDjbVsPovrHebNJIuJ
P2bjq7PISqxFYT1IXLIXcu8hNR+iHKVlQ6n5RWWvX4+16Jk3kimgR19X5OmabHyU
9XrB+jhXF/i0UiY1Y/bgBy5K8wJpzvcT3Cdp4iLp85/isHOyG7OCONsYLwLNCdBQ
fHsQnB1VA/um7rVIPgb/rjq7E7KcQ8Up/momI0TFm2UQT67qkqFWEKsfnENmQQ63
BjWiltcH0I4Yu0RA9y8cbcmT6HsszNF3K/iCw19V0mXpY2bS7AqRiLX8J65AkeaF
Sm9WWchdDE7cCP10NI5OqCTUntXzeZtVh8OWPqgnviECgYEA/GlSiM1Sq6gF22p1
Z/QlThy6s1pyYM316DLeZUlK0oOYn+EikBxBjMMPIm5CxqEUVa5k+zlRkjC3zYZy
mpxc2uWJRUnhIfq/lxqDJBDbAegWrEDGIGfUANSzR/dbp8ZN4qjXBbS6NqnChdCF
glX4GwIJRatw75sy+/CN4LY/QA8CgYEA9/3bRZTuKdApo3whxOxLg2QY6a6GUou/
MIs6r2dFhca7ESpGOEeEw6u/tqMRu0qZ44nKPbKP1YQfw/8sDNWcI/QWlAK8aSL0
IYfCKcLTzjSSvpawBM9K4hODIALktqvbgMdsDHQ5qXEmCT2K4Nz0FUNnfnqDWPO/
Bq9lSEqQsqkCgYAJ7NZK/M/gYhYA37nIIaiJ3sVUohzXQ6IExGNMVkpz5qrMtpyW
UBYfw9fHgdBsYQ8co2PjIQjdF79SfJPrEnTwQpBYQiRxIpwABBHeDC+gbpDdqxpf
UdXbRoHaNZbMDRco73ytA8NCvQAiJOXrDxhXb4gPzkL9mPuzPm1FxcTM7wKBgGs9
/3XuurOgTnFhe+UB3oH6Zn+ftny57Dsc6orx2PHKCBmbM3ShEPvhKO3dRQy+bSAl
9SyLLIJEOcxza+Q89+Hga2cka7/3mqVpZQDUPO4edBsxZPsffZ2YnIraVXfdh/X/
x2z3UfxBbxZt48HsKy2K0ZWze1ubRM+qR91kSYDJAoGAXclfb+ltZ6ArLfO/cjR4
aDvdDB7EJzd9dCWGMUI+Ne5jQ7pO6PDqZLjC+w6zGQtAoN3nCXsZt1MO7/imuo0V
Amm7Iv1ClLsATY4NhcCwvUq3c+NQXLF3uGr95vpsMgSx9McpjetJlnms9jjw+Vs0
PfxYP7dBdcHeZu1d6q4c6pY=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFAzCCA+ugAwIBAgIUGeJjr1J00k/FSvKYmpjq9jJAeGgwDQYJKoZIhvcNAQEL
BQAwgZYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEaMBgGA1UEAwwRaW52YWxpZHBhcnRu
ZXIxY2ExNDAyBgkqhkiG9w0BCQEWJWludmFsaWRwYXJ0bmVyMWNhQGludmFsaWRw
YXJ0bmVyMS5jb20wIBcNMjEwNjA3MTkxNzIwWhgPMjEyMTA1MTQxOTE3MjBaMIGg
MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UE
CgwCTUMxDTALBgNVBAsMBHJvb3QxHzAdBgNVBAMMFmludmFsaWRwYXJ0bmVyMWNs
aWVudDExOTA3BgkqhkiG9w0BCQEWKmludmFsaWRwYXJ0bmVyMWNsaWVudDFAaW52
YWxpZHBhcnRuZXIxLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
APSD6utEI6uzwZE0qVWAmczPBHpYS3iguTkpMn49s5Fwuw+oGyWdPAQLRkUlrgNc
qEAYmu0g9+wpY6FLXmclQTs76LrZ73BwSOOY8KLLMjzZRSyYYVOS7WUiOC6UB3w2
Vz5WNnewL3rW1f72i1QyMfsGtgjQKuO4St6YBR0UrpjDnGJUEkySX3H7SNZh8kBV
BPv4j5bKFRqzS5QaMWU5FA0DXGJt37FiT8IIpn0fIOQ19LehuPBIcBUBpG8a8QUa
/fhy8s1712+Zk/MfiA3aBLD9jkp/tXjaqfojndW6ggTskZB8RIbr5b/65hvy9zr6
g99hsSrrQtAwsdmjYKi7t+cCAwEAAaOCATkwggE1MBEGCWCGSAGG+EIBAQQEAwIG
wDAdBgNVHQ4EFgQUXIHtNfkGLUo3FRBXIlBzaPIp9hMwCQYDVR0TBAIwADAOBgNV
HQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIHGBgNV
HSMEgb4wgbuAFLFkOjidbcQli1lxAua4TgZ9/HHVoYGMpIGJMIGGMQswCQYDVQQG
EwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTAL
BgNVBAsMBHJvb3QxFzAVBgNVBAMMDmludmFsaWRpbnRlcmNhMScwJQYJKoZIhvcN
AQkBFhhpbnZhbGlkaW50ZXJjYUBhZG1pbi5jb22CFCu8w6zNW2fLoRWnVShSQL2K
+yitMA0GCSqGSIb3DQEBCwUAA4IBAQAW6D2PaVcFqpNtpGc40H90SiB7PdNZak0l
DyXvDY84JgCuEgeesjec+K7QsJh2+h6yaXmNampjzCtRhj6vVNWjgB9s5uHNG16n
ZbceijtLRZoczpdrMemmW5BFs5gQNXNpdtgLDcASHrOqxXRd6QoltcHE7nsxa9+n
xW1ctbFCD3ckkaW2ppP1zSxrXBc0v6Nda+BF+As056pXs5SCzBwMAeQC4vct0gM6
Fl8LplHId1IA9tTL6y9C6/aPXdYFf62f/yZr0MD4jONkIA0yPVlgjSsmapugsNdJ
VZnoYBq7FbenB2uF3QDluVUlIFvCxHiazdrkkO3NpKiv2d0pzHIl
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEFDCCAvygAwIBAgIUK7zDrM1bZ8uhFadVKFJAvYr7KK0wDQYJKoZIhvcNAQEL
BQAwgYYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEXMBUGA1UEAwwOaW52YWxpZGludGVy
Y2ExJzAlBgkqhkiG9w0BCQEWGGludmFsaWRpbnRlcmNhQGFkbWluLmNvbTAgFw0y
MTA2MDcxOTE3MjBaGA8yMTIxMDUxNDE5MTcyMFowgZYxCzAJBgNVBAYTAlVTMQsw
CQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwE
cm9vdDEaMBgGA1UEAwwRaW52YWxpZHBhcnRuZXIxY2ExNDAyBgkqhkiG9w0BCQEW
JWludmFsaWRwYXJ0bmVyMWNhQGludmFsaWRwYXJ0bmVyMS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdNAUgeC4azUM3Y1X767u9x0VktNS0khDg
53NvEtD15l6emELSvIVof0M/tXbSaDDe1RK8NyLFVeV0CawK6MYVO44rHVjp580w
dVC+3M9qrCvtt5ZKf12DYt9CrPsuNSp9qfsw07xJP7Mood43xV61+p/04EVJ13Aw
AnKNQz/IpaKX44ddlgJUbrjJ5fzvSPRxqPWr+X64fpKG/kbycuG22TJBiRpGu+KO
pTZl21Ved+EChr/jEU/1cWGnWorolpxftrQGkKVeIO9tIkEssPJ/Gvz9nBdix95X
2dFEQVwyiNONBvZP9N/R/VTQfadD35OUSTTjUOW3LKMOG8abfVnfAgMBAAGjZjBk
MB0GA1UdDgQWBBSxZDo4nW3EJYtZcQLmuE4Gffxx1TAfBgNVHSMEGDAWgBSci49+
KDSauQAwRw1tIW5K+dFDdTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAQyq836+vtcMvmlc75iQ0J5hGl4jRHdi9
XdxlmD7iSx0aCAV88WgSO8TwTvKd4plN+45Fh7ZfbRpd4RQNGCHUgvFcZ/iKZ2kd
SFuoFdufMDosI0B9MCCmy+9F5DW3wjDP4zohyoe5gh8VoX5/lDtayrllx7FnRNKL
i2KxdSqKvaQ9Op4//5SNbCRYQz/M9k3I92gh6PtxvwbYD2DMphq3XdibqBICAgqc
MehguFKKsTNuJdYLEaPJ1V4QLOwtsDnSThDRF8P2cJ5jLSmbNSjl4eKZCdzlmAqw
DV94cehbaHaMnpb0xFoQK6TN5WymGIHN/qTHArhkoeZmG7kfw5cf6A==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIECDCCAvCgAwIBAgIUDzY3/t2lD5x6TFJkG+wwjo1Qsh4wDQYJKoZIhvcNAQEL
BQAwgYoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEcMBoGA1UEAwwTcm9vdGludmFsaWRj
YS5hZG1pbjEmMCQGCSqGSIb3DQEJARYXcm9vdGludmFsaWRjYUBhZG1pbi5jb20w
IBcNMjEwNjA3MTkxNzIwWhgPMjEyMTA1MTQxOTE3MjBaMIGGMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNV
BAsMBHJvb3QxFzAVBgNVBAMMDmludmFsaWRpbnRlcmNhMScwJQYJKoZIhvcNAQkB
FhhpbnZhbGlkaW50ZXJjYUBhZG1pbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCh57jnUu4vopH0LjIn4RKrm31KBOZHZJOgbBL+LpNwhDNte+uq
GXAXI1djr4oA5bpSlwghaojbpnTV8qIafL01wwpmevbZG9R97h/tYiHlWP52Bj2j
cK1wIQWpnrpD+Nsc6Cb2UT1M3v1THljh8sT6ZlUgNr/0EpZ90Txb+FBb4g1SVSPg
zhaHAF2VnRNlX7PRkrztOtQfyTK6LdefCIlLczEcAz5oWLXpUOYWzFF8aFvXP/e0
BRjj3xcRFzHiG4E5Spomlf6f2fqSfQa+cawyHxGX9yehwA7S1jsZWvNfINhXl/Zs
LQnaHM885PkATNFFaSOqZuWTH2wi9cyIN/adAgMBAAGjZjBkMB0GA1UdDgQWBBSc
i49+KDSauQAwRw1tIW5K+dFDdTAfBgNVHSMEGDAWgBT/NPV6XAiQbNcxTYXEr/25
5dOgOjASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
9w0BAQsFAAOCAQEAAoiXUj8QyFa8MzyRNFCSRz6/evhJ7OxON9C89C49vIC3S+5p
Vn7SSkzK44OrWaRbVQOI8rbJSAd72iWaMVodHPKUkvFeiFHql6YheX0mnpmFyq72
C5OHMbIo8kMbvEBrawJCx25GKuCV3peloMRWmz7UdAjlTuPiv5WO6/GzBJkAMdw6
ZaySzGghRN6eMKfhwb4NSeC9fZQZ8B41rpYrvp+SWjy6DktMmzpmsKxQ00IiNUe/
rXBJPUCNOLmDaX/iBb4UWTmseo7t7nmYWEwN4YQ7bwKjFi6elqCS68v4fWW+fO1R
4F1Elk3gXEPDiBz1e+0OhK6nzXzr0IrswfthAQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID+TCCAuGgAwIBAgIULStfBL19hwdAOantFEGhxNaVQe0wDQYJKoZIhvcNAQEL
BQAwgYoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEcMBoGA1UEAwwTcm9vdGludmFsaWRj
YS5hZG1pbjEmMCQGCSqGSIb3DQEJARYXcm9vdGludmFsaWRjYUBhZG1pbi5jb20w
IBcNMjEwNjA3MTkxNzIwWhgPMjEyMTA1MTQxOTE3MjBaMIGKMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNV
BAsMBHJvb3QxHDAaBgNVBAMME3Jvb3RpbnZhbGlkY2EuYWRtaW4xJjAkBgkqhkiG
9w0BCQEWF3Jvb3RpbnZhbGlkY2FAYWRtaW4uY29tMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA0iTSh4F18DCcDY2pnBu4g/dwNChnHCSMY+M69jRvj54U
aVIOxmvyTKWPJnsv1bSRuhoFaLpXMyFmCyCp8e617QTNGlPkpu1ByoOjQGeTmTAs
kJV/vpfzD00BriWPXp1fVdg78s2hHh08JjAHWIUVFd1GxXVyJdoW12nxPEmXzHDc
vsRiniu+lkOgz3pmOdtpSNDYuhAL5q8hhZioClbilA5HTEvlvMxbqt2IzrU9vlrR
hZXvtx9w4PXxFfFK8CS3iTOQ+p+4JyAU31VHBJD1iukqZQ1U9P36K5PNRzR2fHxb
jo35J35OcVJ/Dl/CuozmRjJKh4cbs7UAzgsrS1rlpQIDAQABo1MwUTAdBgNVHQ4E
FgQU/zT1elwIkGzXMU2FxK/9ueXToDowHwYDVR0jBBgwFoAU/zT1elwIkGzXMU2F
xK/9ueXToDowDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAAzuG
9JOuuW8v2KUkHDeGqJ9LjMSpti83tz59P33z5jHLBwmRcYWlX0orBbtOTrn1mb9V
+YcTp/zYiUwNmsR1/bTo6+fDyB7i47i7A3CxnyZV+xP8eauB92LDZqlCl8k/ZynU
JgIbKO3fmeWayW3kVqsHy6hJxNN41zWbO3Q3I9j9sh6muFZM4s1w2+FawN/v9qil
hjd3sWMSfkm6cSXZowJ2ExIaw99qG1GyWHaDFufLj2b4lDTm2tP/gXmF6XXIS9iE
WqLxI17zv4npeYA7S5/8uf7tfMWBhAhuGDIXt1mOMCAZziz92VVlSwEkY54wZ9uR
8VovTAmGEM415qM+iA==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN X509 CRL-----
MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290
MRMwEQYDVQQDDApwYXJ0bmVyMWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyMWNh
QHBhcnRuZXIxLmNvbRcNMjEwNjA3MTkxNzI4WhcNMjIwNjA3MTkxNzI4WjAnMCUC
FFFuSkrE8m/dVEcso4PkZUFYmvFBFw0yMTA2MDcxOTE3MjhaoA4wDDAKBgNVHRQE
AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAQujFul5rvGr4yytm/mjPQdcbeSTM3uT/
aFM6WbPE6DHx5/R1ItNCyA7YdfxzojfZ+kzR7j0WsSydWT2TngHD/2C6tIhXZRcG
UG6E473xniLFctn0FYyKZL03pOwdQgWk4dCUd3Ko8Qbos+vTRClXPMnPANPwJjYG
7x1UlEPShHaoQNiDakuUa6fGZyyFGbTWuH1zltH3aUKh/L2w1/Sndkv66Cmr4VQ0
s/ZsMnjJNPrjZJs32BzjxVaWYToe6vpwiQ6+UGyaZ3GTfv6r/oTWeRxcmQeXAT03
kxbwywkQwFndeC9NlrOQRM+TipsOybeiJToQskmPiEJ/7xfUAHOV3w==
-----END X509 CRL-----
-----BEGIN X509 CRL-----
MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v
dDETMBEGA1UEAwwKcGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJj
YUBwYXJ0bmVyMi5jb20XDTIxMDYwNzE5MTcyOFoXDTIyMDYwNzE5MTcyOFowTjAl
AhQtbA3PphdVjORDUvomlgGblf8OABcNMjEwNjA3MTkxNzI4WjAlAhRRbkpKxPJv
3VRHLKOD5GVBWJrxQRcNMjEwNjA3MTkxNzI4WqAOMAwwCgYDVR0UBAMCAQEwDQYJ
KoZIhvcNAQELBQADggEBAJXmtYDcF+sA0zQiRiCOIALVUQ4i0t4UwREEL7SEzD9C
hAOas0uFwkPef1hQWNkvx+OghFb3fStKS1zh9zbJx0fxyKttfsaaW2dQX4H8tyRR
vtuNtZBv/PT2ouWdpumSh9TmQUxKr/Uer5gGaqOm1S5MOemOVEYfsNqAzSnGI7f9
v5yMDywigHfv2dmM7xpttSZG3WCd5w0PJisndyAV/qga3CQMI5X6DIpWHmHbcD3k
sSps2YggdueW7y61uoi61jvpOGTbr6UAWLjHRyL35txC9xOMGJgJqBgebw/hGmW9
syY2loiEfzWX0A/9KGPo6Q8PB2YJbMmc7WT04g5W++8=
-----END X509 CRL-----

@ -0,0 +1,6 @@
name = NSScrypto-partner1client1
nssSecmodDirectory = ./src/test/resources/keys/partner1client1/nssdb
nssDbMode = readOnly
nssModule = keystore

@ -0,0 +1,70 @@
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6gwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MTVaGA8y
MTIxMDUxNDE5MTcxNVowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNy4ztMqq6KIYHrYRQ
2XNXZisj5oiTyrdlZ2+lo7P8xrS12d8ZigA2ofs6lGSXPQiM6HbShw0NPGacbElL
rueqJyiN/AC8ZGWx6jJG4rvtOwtrftXHaa17iSqnStvT6Jk7wShAZYZfDaYAw1kc
ryCs2RdbOCXWLvlMyZT4l0g0U7VEfTStSDP7T1NjEEjfDQvKrdoNHoNaXneRQFhx
0DCrNbyfoUwBIeQPYIpmi92hWlwNV9/GooyHj0pK78eVb+tl7AVlvjuilph+IIos
8e7s+TCPRNbT0ksDIKUrcd7ZBkJzoRs8bRvSAQyCZZcPqiQce8z7BchxGJJZQUJH
nFRlAgMBAAGjZjBkMB0GA1UdDgQWBBTIqkjkocRp/5kHvmu19OdHACemJjAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEACgRyonvWCo7z/v+a
o1WN9EunfMtiNhSHAyx9CMJhkBhcGWqsSCkEPXWKLRsnIBKSGbikpr1Jg3bHdwB5
PYV+EIZvS0ndzupg/01xToTHQMS2ynCT/3QBCmPUPYm3sJa3KArNgWAUOzPdJ/Fj
fi53cADpr78Z2/tdY2SSUzLe+nJZf5MHTAx2I06XUi04ic7GdC2d1+g0AdsFatZN
vbxeAZx0Bg5sc8F9CDGmlYjJ/TeZ8s2hM+6hogz+4lz7W47GxqzMW/2I3WkDGcQd
SO5usxYoOztihuu7g9QzB3hGTc+SelnPtk91FQhpxO1qEQIfDkUJksZcvxcgTaX9
LbcwIw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,126 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDkn7PoS4TmqQnQ
JQ0WDj3kS2SUsMlrb48xi1cYUShYZ9d//JzOFXDPp+AdKndHPQy56qyv67R9x5rl
vcCn//ZyHuS1PEveIJU9IvXb4oIya1iZ/CdTRmJZZJvH9ELjYi5WBv08Na9b0y/Y
hSY4kcP0EaO3Lce0TUeDcIrNEzdGlccDdjwq6q+UBBUVeUsZwa/CCj6FQ/df3IIl
c92bsKdx1szR2E7CJvPwZ2CR4Qih1eXJGhw+q9zqY6ZZ4Zy1ymz28uszkPcpz2Kp
ZnKlOgd7GaS8G/kBHsLoLw3Ir1KdOLII6DSWy4Q7JLOBkbBgQ6cMiENC0rTUXt6P
uCK2E+idAgMBAAECggEBAN2i7VhvjeHHUhoVMUCGgf3GETYMxNeAiUMwoDiUxRYf
ZU1Qaftn0bueNahQuN25E5NRLCRHzux5C3NZp2G2xQYRaQtB7xLiZ4ujTtHiHvIe
GwD88GrMux+KZ3NLG2Uwk1cW43zxVpUggSvYuRryRRNh3mMA4K+sk32bJxR0Yovr
Zmvf3+nInAyaLcVmUfkqZ2/kTNsTDZd++PWI/znBSeDv9paMoGpJlFo7NQsbT2cm
hBs25httCPE9RJA/wut/TDIzkkx7WkRTGZQYS4/zWnV+8YN3XHXpGfoqrGw5a44O
nYyz3quuq+J+FX4URNvMf0CGMFjxAOhaRzCWcENUY0ECgYEA+rFOlYWRVr14wqwk
YYj41SQk0k/XBVVk478A7mwizFq3EBWWHHAiYQFFs1pLFyIevBqCXrKJUsN23BkV
qYvI3ML7XnVtZrHqcGtotIUu988ptwgS3WcwU8cGUW5KzxRgtMkTewEdzTjADbxN
7CXT5detae7aSpHeQgNNxOr31iUCgYEA6XbJ1zuoSE4JkVG2GkAG7XLfOPlhd5x6
68T+WKu6a/nzw1E35Mi/EscZCmgKhrQUwmD/7wzwsfwoHmt9gIIaSd5u4XKAZ8Po
BFpuRoJdCl2X2ebE/PUDJ0Xz0fJdIgjjKQCtbOA9d6GXqsY7kzsyV+ZNF+IKFp8R
UKHccxwKUxkCgYA6NFB6hrhn2zXefPk1bAfZ9LpX2hGiO2FhP0eIE7NAnw9BvMFN
ePuCajk0mxI0HMfmBIGgWvNnM9q0314YL0xDdUHHfJwZ69TypP16bDGrd33H8Sfw
H7UovlzJK0JTMfgCAW10cZ3pt/NfPQkaeu3nv1uT7NDh31wrF3lG7wb7wQKBgC4b
bqtaNdbpyovvlkZC5NtaN2maHryvo7sScaTzbWLLv2+Qh7hgSRQdS/25JHML95mX
7JO6e4K7KPUxB10s1KJIEp/lrCRSFW1eqq60KknUyBuZrsfCX7gO4aNR+UCyfqJn
Zti8xIbu2/Q3KCbgpwWjDxCrbJChI5tIDDCTlhppAoGAPIAq4ldvkCMhG/GsGaa/
vC9IAbLWXxeN2CC9FAWLZhWReoC+rPdSrnb4x/if2fPrGuLlIkCOY89eZ53A0upa
amzYmpdDWIsHWJKp78SS9DLtXrVKHAygkwvEDPUuB4D+n3561holR39CtplpRNWi
sQgkTxCHEj2IAIXti6MoQok=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEyDCCA7CgAwIBAgIUUW5KSsTyb91URyyjg+RlQVia8UAwDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcjFjYTEm
MCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5jb20wIBcNMjEwNjA3
MTkxNzE1WhgPMjEyMTA1MTQxOTE3MTVaMIGLMQswCQYDVQQGEwJVUzELMAkGA1UE
CAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3Qx
GDAWBgNVBAMMD3BhcnRuZXIxY2xpZW50MTErMCkGCSqGSIb3DQEJARYccGFydG5l
cjFjbGllbnQxQHBhcnRuZXIxLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAOSfs+hLhOapCdAlDRYOPeRLZJSwyWtvjzGLVxhRKFhn13/8nM4VcM+n
4B0qd0c9DLnqrK/rtH3HmuW9wKf/9nIe5LU8S94glT0i9dvigjJrWJn8J1NGYllk
m8f0QuNiLlYG/Tw1r1vTL9iFJjiRw/QRo7ctx7RNR4Nwis0TN0aVxwN2PCrqr5QE
FRV5SxnBr8IKPoVD91/cgiVz3Zuwp3HWzNHYTsIm8/BnYJHhCKHV5ckaHD6r3Opj
plnhnLXKbPby6zOQ9ynPYqlmcqU6B3sZpLwb+QEewugvDcivUp04sgjoNJbLhDsk
s4GRsGBDpwyIQ0LStNRe3o+4IrYT6J0CAwEAAaOCASgwggEkMBEGCWCGSAGG+EIB
AQQEAwIGwDAdBgNVHQ4EFgQUJie04hHyMXwfShvdI/rVOSGUD6YwCQYDVR0TBAIw
ADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MIG1BgNVHSMEga0wgaqAFMiqSOShxGn/mQe+a7X050cAJ6YmoXykejB4MQswCQYD
VQQGEwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMx
DTALBgNVBAsMBHJvb3QxEDAOBgNVBAMMB2ludGVyY2ExIDAeBgkqhkiG9w0BCQEW
EWludGVyY2FAYWRtaW4uY29tghQQkL0B0dRTDgREvJhCbMeTo1KfqDANBgkqhkiG
9w0BAQsFAAOCAQEAokvaJAcGVFBUt2kU3eTQ6EvF5gT4JVsfbMseb8HhH03TBDEY
BmQMi9pymhb52NVQXhRFZrCsOkAi8VRGcpkUsknCCWCxvL2SfsEw9h8sKKOZO8pl
AhQrUIVr39WzWr6Uop8H7d/db2wJoSqkOpIAGl5Vk8rpF46MNTl87tIb9bq2BNd1
fW6XqCHTYPVaBLSyrOuhzqeZvefkzzlahrsjbwPGBk3GhMoR/7/Jhrb1NjbHqzHr
AazuWi0Y1VAih+yar332VI1iHFuo9VUdbOksAayDLs1Gwmis5DaMyBsOrSDdzVAe
0Iv7HXIpTZvJF5mrh5y5NcT2lOr6dVaWy2FO+Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6gwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MTVaGA8y
MTIxMDUxNDE5MTcxNVowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNy4ztMqq6KIYHrYRQ
2XNXZisj5oiTyrdlZ2+lo7P8xrS12d8ZigA2ofs6lGSXPQiM6HbShw0NPGacbElL
rueqJyiN/AC8ZGWx6jJG4rvtOwtrftXHaa17iSqnStvT6Jk7wShAZYZfDaYAw1kc
ryCs2RdbOCXWLvlMyZT4l0g0U7VEfTStSDP7T1NjEEjfDQvKrdoNHoNaXneRQFhx
0DCrNbyfoUwBIeQPYIpmi92hWlwNV9/GooyHj0pK78eVb+tl7AVlvjuilph+IIos
8e7s+TCPRNbT0ksDIKUrcd7ZBkJzoRs8bRvSAQyCZZcPqiQce8z7BchxGJJZQUJH
nFRlAgMBAAGjZjBkMB0GA1UdDgQWBBTIqkjkocRp/5kHvmu19OdHACemJjAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEACgRyonvWCo7z/v+a
o1WN9EunfMtiNhSHAyx9CMJhkBhcGWqsSCkEPXWKLRsnIBKSGbikpr1Jg3bHdwB5
PYV+EIZvS0ndzupg/01xToTHQMS2ynCT/3QBCmPUPYm3sJa3KArNgWAUOzPdJ/Fj
fi53cADpr78Z2/tdY2SSUzLe+nJZf5MHTAx2I06XUi04ic7GdC2d1+g0AdsFatZN
vbxeAZx0Bg5sc8F9CDGmlYjJ/TeZ8s2hM+6hogz+4lz7W47GxqzMW/2I3WkDGcQd
SO5usxYoOztihuu7g9QzB3hGTc+SelnPtk91FQhpxO1qEQIfDkUJksZcvxcgTaX9
LbcwIw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN X509 CRL-----
MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290
MRMwEQYDVQQDDApwYXJ0bmVyMWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyMWNh
QHBhcnRuZXIxLmNvbRcNMjEwNjA3MTkxNzI4WhcNMjIwNjA3MTkxNzI4WjAnMCUC
FFFuSkrE8m/dVEcso4PkZUFYmvFBFw0yMTA2MDcxOTE3MjhaoA4wDDAKBgNVHRQE
AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAQujFul5rvGr4yytm/mjPQdcbeSTM3uT/
aFM6WbPE6DHx5/R1ItNCyA7YdfxzojfZ+kzR7j0WsSydWT2TngHD/2C6tIhXZRcG
UG6E473xniLFctn0FYyKZL03pOwdQgWk4dCUd3Ko8Qbos+vTRClXPMnPANPwJjYG
7x1UlEPShHaoQNiDakuUa6fGZyyFGbTWuH1zltH3aUKh/L2w1/Sndkv66Cmr4VQ0
s/ZsMnjJNPrjZJs32BzjxVaWYToe6vpwiQ6+UGyaZ3GTfv6r/oTWeRxcmQeXAT03
kxbwywkQwFndeC9NlrOQRM+TipsOybeiJToQskmPiEJ/7xfUAHOV3w==
-----END X509 CRL-----
-----BEGIN X509 CRL-----
MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v
dDETMBEGA1UEAwwKcGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJj
YUBwYXJ0bmVyMi5jb20XDTIxMDYwNzE5MTcyOFoXDTIyMDYwNzE5MTcyOFowTjAl
AhQtbA3PphdVjORDUvomlgGblf8OABcNMjEwNjA3MTkxNzI4WjAlAhRRbkpKxPJv
3VRHLKOD5GVBWJrxQRcNMjEwNjA3MTkxNzI4WqAOMAwwCgYDVR0UBAMCAQEwDQYJ
KoZIhvcNAQELBQADggEBAJXmtYDcF+sA0zQiRiCOIALVUQ4i0t4UwREEL7SEzD9C
hAOas0uFwkPef1hQWNkvx+OghFb3fStKS1zh9zbJx0fxyKttfsaaW2dQX4H8tyRR
vtuNtZBv/PT2ouWdpumSh9TmQUxKr/Uer5gGaqOm1S5MOemOVEYfsNqAzSnGI7f9
v5yMDywigHfv2dmM7xpttSZG3WCd5w0PJisndyAV/qga3CQMI5X6DIpWHmHbcD3k
sSps2YggdueW7y61uoi61jvpOGTbr6UAWLjHRyL35txC9xOMGJgJqBgebw/hGmW9
syY2loiEfzWX0A/9KGPo6Q8PB2YJbMmc7WT04g5W++8=
-----END X509 CRL-----

@ -0,0 +1,6 @@
name = NSScrypto-partner1client2rvk
nssSecmodDirectory = ./src/test/resources/keys/partner1client2rvk/nssdb
nssDbMode = readOnly
nssModule = keystore

@ -0,0 +1,70 @@
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6gwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MTVaGA8y
MTIxMDUxNDE5MTcxNVowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNy4ztMqq6KIYHrYRQ
2XNXZisj5oiTyrdlZ2+lo7P8xrS12d8ZigA2ofs6lGSXPQiM6HbShw0NPGacbElL
rueqJyiN/AC8ZGWx6jJG4rvtOwtrftXHaa17iSqnStvT6Jk7wShAZYZfDaYAw1kc
ryCs2RdbOCXWLvlMyZT4l0g0U7VEfTStSDP7T1NjEEjfDQvKrdoNHoNaXneRQFhx
0DCrNbyfoUwBIeQPYIpmi92hWlwNV9/GooyHj0pK78eVb+tl7AVlvjuilph+IIos
8e7s+TCPRNbT0ksDIKUrcd7ZBkJzoRs8bRvSAQyCZZcPqiQce8z7BchxGJJZQUJH
nFRlAgMBAAGjZjBkMB0GA1UdDgQWBBTIqkjkocRp/5kHvmu19OdHACemJjAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEACgRyonvWCo7z/v+a
o1WN9EunfMtiNhSHAyx9CMJhkBhcGWqsSCkEPXWKLRsnIBKSGbikpr1Jg3bHdwB5
PYV+EIZvS0ndzupg/01xToTHQMS2ynCT/3QBCmPUPYm3sJa3KArNgWAUOzPdJ/Fj
fi53cADpr78Z2/tdY2SSUzLe+nJZf5MHTAx2I06XUi04ic7GdC2d1+g0AdsFatZN
vbxeAZx0Bg5sc8F9CDGmlYjJ/TeZ8s2hM+6hogz+4lz7W47GxqzMW/2I3WkDGcQd
SO5usxYoOztihuu7g9QzB3hGTc+SelnPtk91FQhpxO1qEQIfDkUJksZcvxcgTaX9
LbcwIw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,126 @@
-----BEGIN PRIVATE KEY-----
MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDYC3xKV4yPWkcW
cpDZmuS4GzTj4A8gW5JZurw560p2eNyiGZfbN2i5oxFNnQOmyGBcWEisBJriEY65
M1QhC5kJG+kWBCoTQ9vwjGH1mCmEJWhpxJzzWsQe0W2RJDnLvzfU81ajWrGCOi2s
pN/8Nc+jjBhRq0bd+nkfMqcADttgBc2qerCoVxjD45CVffQt1A4VkfpnPvbuw+tz
ucEivppUJa0JlzaBLS1Qvx9oRhm/hJGL+EWEKZ+inE10aY4tguTj49uWuO0P36vW
zuXrjjn6RRKZ+0tUQse7eNBs0EkwS7AL55JiCz921Mtt4yVDRc4JoPb6pbxMKJIe
LDVA6ozRAgMBAAECggEBAJ1lcL2wnuTpfpTqDoGaiTtgBt5lpF+Ml0jr9Km1s+Aw
GX23a5z390IXfUmwNLLTlPByGS/JgxVkeTiQHqCclHfAb8XsbsLuU1Qi0lNc8hIm
NrWn2jipTeyt40c0vy6jNwfb6KjGMECSJih7TfuvMIEUVbtaLx0VmByUiHpQWJ7R
BHr8Y1ukZshxVm7aJSO9pvuRsy/u4R9qq2u4dU4EBiTXteDYTYouwBZI1AxXzlX8
4ORJ2Txakv7qLoV1j53PwAhdEHPKrO/2VvSPfZwmzJ6+ofydQKrd83KgzQda8huZ
Pd8iYDVeQGtwWG91ubiZszBAEgoi1i4QYpDJhEKorAECgYEA9uuIQLNpv4ItyHfV
yCB/eWbW3KHrPWU3TlSOfwIAfIzRuk9oxLNfaA/Y9qLX4nLUsiZRfVjBYHaiECL3
IrkxYsMDZlyyZq85+uMvXLuiWb9bkkySODgc2VARlIRp6Rtc8XK+SAiFTDgEWS9E
JCpykwL6cpD6gvPxI6LxurFFzrECgYEA3/1Mi1gb+MYMC/54Wz8VMNoMwqJuxjX2
He3lQtgFIvmOoi5FqJ6Qy7bUifZBSAH7MG15wcGA+nr4dmPbzbzgWw/7RdXXYYHM
E3v4DoYlaeDW5yIaSGpXCDpJ6EZsQ+4NkQLUFfIda2Rija0Xw9fVaJcLj/i0J6go
EoAYrwTjaCECgYEAieB9RbupOfHEBOO9cTGMXMrrAWo8xBynpEqdAxioEuRDHCjJ
VMTgamgm+5l0uRLr58pzyG1uFaJI3n/XxgDpLb+9P0RVrfb8hjajtMFlZ33t8SRm
pZPXsBUArBDAXxUTchNjYy+21xeUfgRhpVw6fBK2rJB+Ae+bYA3VsyzX0RECgYEA
rcB53iXtHN/UfIFbr7yRnaGoAFusfolhb/oYu++CnIzl/hzS4GiQfdZHrPWf0lHn
HrvtlUWb3bIChyQTX9dCWqFdE+E8AGGFgx/JXsrkvusxCX7E0KPc+37r0gi+9zr0
vyZoitWTyLjIUoqRQtRssYNp7rbIWXLyEtfXTf0GwsECgYEAqvnZx+hF9tBQlamL
tnc523SVx+0xeeKyQqe633VQqRy8Wy32nakVTzXv01BNKZ692rMTL5UNsydUm1uP
S3++Mfjy046TZRwHLVE9eE6+9bTT9KaxAdWf/ooQGGifkpjcm8TU6sETX0Ghcl4h
L2UG4X2N2Plpb2Pi3RjepGa9qqg=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEzjCCA7agAwIBAgIUUW5KSsTyb91URyyjg+RlQVia8UEwDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcjFjYTEm
MCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5jb20wIBcNMjEwNjA3
MTkxNzI0WhgPMjEyMTA1MTQxOTE3MjRaMIGRMQswCQYDVQQGEwJVUzELMAkGA1UE
CAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3Qx
GzAZBgNVBAMMEnBhcnRuZXIxY2xpZW50MnJ2azEuMCwGCSqGSIb3DQEJARYfcGFy
dG5lcjFjbGllbnQycnZrQHBhcnRuZXIxLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBANgLfEpXjI9aRxZykNma5LgbNOPgDyBbklm6vDnrSnZ43KIZ
l9s3aLmjEU2dA6bIYFxYSKwEmuIRjrkzVCELmQkb6RYEKhND2/CMYfWYKYQlaGnE
nPNaxB7RbZEkOcu/N9TzVqNasYI6Layk3/w1z6OMGFGrRt36eR8ypwAO22AFzap6
sKhXGMPjkJV99C3UDhWR+mc+9u7D63O5wSK+mlQlrQmXNoEtLVC/H2hGGb+EkYv4
RYQpn6KcTXRpji2C5OPj25a47Q/fq9bO5euOOfpFEpn7S1RCx7t40GzQSTBLsAvn
kmILP3bUy23jJUNFzgmg9vqlvEwokh4sNUDqjNECAwEAAaOCASgwggEkMBEGCWCG
SAGG+EIBAQQEAwIGwDAdBgNVHQ4EFgQUUEG1Jtyl+XAoXO6kYDoMt4Gw1bcwCQYD
VR0TBAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
AQUFBwMCMIG1BgNVHSMEga0wgaqAFMiqSOShxGn/mQe+a7X050cAJ6YmoXykejB4
MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UE
CgwCTUMxDTALBgNVBAsMBHJvb3QxEDAOBgNVBAMMB2ludGVyY2ExIDAeBgkqhkiG
9w0BCQEWEWludGVyY2FAYWRtaW4uY29tghQQkL0B0dRTDgREvJhCbMeTo1KfqDAN
BgkqhkiG9w0BAQsFAAOCAQEAy6XXVzzCzR8Eyo5TU6MRsWLORWCxM7x5li2VyTsj
QOKPg7GN9dl8Fq0SSnHzUfCODksWV+aD4Sh+RMleKXO96ZHJ/SinQRVcqfNsh3c1
dZEVQGoKTLnuUrTdR2/Vgnz6mTOKZWNE7B51bvA9YaY3/cniclY2eRtRhwYaXXh/
8JcTR+3BsfLWHXUfz+tCQcqN1Fo4AgR6TMoRrKHNM/bIE/HrQn9YNgmnisDsR2fp
tV826nln7+MkZoFFxji2esPA6e9i7MPTQx1ACJ/THZiFwhYYopZt+ecEfCEjMzDa
RtgR3nfpCHCXyl+Xk+nMmMRqWGoUbEUkCGDKEVr7Ai20LQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6gwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MTVaGA8y
MTIxMDUxNDE5MTcxNVowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjFjYUBwYXJ0bmVyMS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNy4ztMqq6KIYHrYRQ
2XNXZisj5oiTyrdlZ2+lo7P8xrS12d8ZigA2ofs6lGSXPQiM6HbShw0NPGacbElL
rueqJyiN/AC8ZGWx6jJG4rvtOwtrftXHaa17iSqnStvT6Jk7wShAZYZfDaYAw1kc
ryCs2RdbOCXWLvlMyZT4l0g0U7VEfTStSDP7T1NjEEjfDQvKrdoNHoNaXneRQFhx
0DCrNbyfoUwBIeQPYIpmi92hWlwNV9/GooyHj0pK78eVb+tl7AVlvjuilph+IIos
8e7s+TCPRNbT0ksDIKUrcd7ZBkJzoRs8bRvSAQyCZZcPqiQce8z7BchxGJJZQUJH
nFRlAgMBAAGjZjBkMB0GA1UdDgQWBBTIqkjkocRp/5kHvmu19OdHACemJjAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEACgRyonvWCo7z/v+a
o1WN9EunfMtiNhSHAyx9CMJhkBhcGWqsSCkEPXWKLRsnIBKSGbikpr1Jg3bHdwB5
PYV+EIZvS0ndzupg/01xToTHQMS2ynCT/3QBCmPUPYm3sJa3KArNgWAUOzPdJ/Fj
fi53cADpr78Z2/tdY2SSUzLe+nJZf5MHTAx2I06XUi04ic7GdC2d1+g0AdsFatZN
vbxeAZx0Bg5sc8F9CDGmlYjJ/TeZ8s2hM+6hogz+4lz7W47GxqzMW/2I3WkDGcQd
SO5usxYoOztihuu7g9QzB3hGTc+SelnPtk91FQhpxO1qEQIfDkUJksZcvxcgTaX9
LbcwIw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN X509 CRL-----
MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290
MRMwEQYDVQQDDApwYXJ0bmVyMWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyMWNh
QHBhcnRuZXIxLmNvbRcNMjEwNjA3MTkxNzI4WhcNMjIwNjA3MTkxNzI4WjAnMCUC
FFFuSkrE8m/dVEcso4PkZUFYmvFBFw0yMTA2MDcxOTE3MjhaoA4wDDAKBgNVHRQE
AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAQujFul5rvGr4yytm/mjPQdcbeSTM3uT/
aFM6WbPE6DHx5/R1ItNCyA7YdfxzojfZ+kzR7j0WsSydWT2TngHD/2C6tIhXZRcG
UG6E473xniLFctn0FYyKZL03pOwdQgWk4dCUd3Ko8Qbos+vTRClXPMnPANPwJjYG
7x1UlEPShHaoQNiDakuUa6fGZyyFGbTWuH1zltH3aUKh/L2w1/Sndkv66Cmr4VQ0
s/ZsMnjJNPrjZJs32BzjxVaWYToe6vpwiQ6+UGyaZ3GTfv6r/oTWeRxcmQeXAT03
kxbwywkQwFndeC9NlrOQRM+TipsOybeiJToQskmPiEJ/7xfUAHOV3w==
-----END X509 CRL-----
-----BEGIN X509 CRL-----
MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v
dDETMBEGA1UEAwwKcGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJj
YUBwYXJ0bmVyMi5jb20XDTIxMDYwNzE5MTcyOFoXDTIyMDYwNzE5MTcyOFowTjAl
AhQtbA3PphdVjORDUvomlgGblf8OABcNMjEwNjA3MTkxNzI4WjAlAhRRbkpKxPJv
3VRHLKOD5GVBWJrxQRcNMjEwNjA3MTkxNzI4WqAOMAwwCgYDVR0UBAMCAQEwDQYJ
KoZIhvcNAQELBQADggEBAJXmtYDcF+sA0zQiRiCOIALVUQ4i0t4UwREEL7SEzD9C
hAOas0uFwkPef1hQWNkvx+OghFb3fStKS1zh9zbJx0fxyKttfsaaW2dQX4H8tyRR
vtuNtZBv/PT2ouWdpumSh9TmQUxKr/Uer5gGaqOm1S5MOemOVEYfsNqAzSnGI7f9
v5yMDywigHfv2dmM7xpttSZG3WCd5w0PJisndyAV/qga3CQMI5X6DIpWHmHbcD3k
sSps2YggdueW7y61uoi61jvpOGTbr6UAWLjHRyL35txC9xOMGJgJqBgebw/hGmW9
syY2loiEfzWX0A/9KGPo6Q8PB2YJbMmc7WT04g5W++8=
-----END X509 CRL-----

@ -0,0 +1,6 @@
name = NSScrypto-partner2client1
nssSecmodDirectory = ./src/test/resources/keys/partner2client1/nssdb
nssDbMode = readOnly
nssModule = keystore

@ -0,0 +1,70 @@
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6kwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MThaGA8y
MTIxMDUxNDE5MTcxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQtWo8TV9BbLVD1MbK
VG2JhK188OqSKJAp2AJDVfJHyV73mR7L0KcvKvxvkIQKh6rQTD50ZAajZODt5/cI
l2Ar0PmxGWhJ2M1yyAjtRCMr8RwROejk1+nlsHwwWIhnLFS0l+G7m882OmTh+zLj
dgO9wmjfK2YcBjyZozkDHbziI1MZNpmFvh6Rq34d9IQCQJsWMPQQ46jbKCkHfp8l
IjBnQSC2N/IH66hbeEBP8UsNbkoyajhZI26oy+bp37hKF+UgGPIaByMY/vqwEjk4
gxB95PrYuB0c+YHPWOXMKXlIk6sxsXPmcKy6R/kV2OckARJ2/PtSq2FRp0J4elBH
To1vAgMBAAGjZjBkMB0GA1UdDgQWBBRnmFzdLo0c92a+BHMhWprNvUdwjDAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAY3VNlUKHN0rgPABL
HHrADPuB8M+wRK/p1L28cYXw64tfpemjERMIKh7IyuX1e9vOnQQPPWMnyH0Qv+ZA
06w/lF6yWLSf8cTAKK1QAa4ZPDC+74g2TwwzLXmuQDWNKb1+zPNxgmzcqmDNdXTU
N+mAN+tAL2aVXK61TfZlfhmbBkeSvow3Usj9dMydynk0Vea9AdIwvPi/nhBgAC7M
UJ1ulR/froF+d7eIpFNPgbcR2t06da+Wm22PgU5xRM9c90zpNHKNgmXSawOoUOF7
jrtCDf94hWnlqVJX2VUj0acqFzDIKyvCkZEHo6VqlKykbOtaTTBVEnTXMKdtp5OO
YBjw2Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,126 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC/MLtfZCd98R3+
GkHi8PW9/z0L53wdE4vrzFVE6b1AIKwxEeCYqXOVVWR1NEOiGr28xoKJit2AXJrY
7w1rv1w5sOwpDiigM8WKIDJUTYKsJV5FAGdzngFw/UQRZcxUrJ3vaFvyQ7WREWsy
dtPwohJbczRucXfdaJXJthpa8w5Idx9h+gY+uts0R0BQhGz3Wwk0ikPj4mNA6ToF
SdkDizfTnAiDvzU0LBgAmwVBGws+M3ptdpadeB8P64NGlu3NM4px9UsS7HupJ2rF
EBUJuajTqy5/IPuz2/CFu0UPH6hYSx1kcgUNqYJxE3f/ueqVZ2naahtUR/anb12d
QzlVaYonAgMBAAECggEBALVY8PGrWzY/hdZna4VqT33XYz0uZfBigP65g0vpdaQl
GY81yNalLEhChhYR6/EP8lbj6B+0gyNlM09/eDhye3URVwAeOPS0BrRck8CZANBu
ZXuHxZjKD83vvSfPakAKt4fFcilahhdC8W4dfiyqXkU2Ak6b/DkcIbABtf/8udiK
1ltLBzbwOZnRpVWvfSWGlPjs9tr7BexLC3umufEPq7US2FqO9Yv+M6/eWAKeRmbp
nJXPqMtKLLnEdD/31Kr9UxITW3Lf5MlqHk97nyJ51PJeX7ga+TJgpiTFSwkaWIuH
WIDxvaTZ24WnIJAoa7csfrEAyJvzNVlw61Dl4982gjECgYEA+o3x8qiR0y01dvLB
Gi0irmjSY+vTWYHHZCTQCThq8S/chaueH+xxaw3aJiXJ0D0H2Ynjr0rv+OnNyiQB
fKNWnVdqRF37T8Z9+3ju2UIHgJAg31TTwFMsix0p3iAi9X71VaOtD4IeNj3539mh
LdiZu3I09yhnRhQP2u3HhdAEd/kCgYEAw1h99lCC6cAZdDzLGWkxNSDqfAIMzWKA
YuGfusy6yr2ItVknyo9GnAFzfruNJ4df240R5watwaPkwpWqqzTNDN2iD7AKPYbK
CR0uvAylrWigpFPnskPDfJiqtIPI1uqucOUNypPR1S5ubr5CoM88VGwWzuWVtVZ3
xIlNbyVl2x8CgYEAq294PxrMPHxQesT7D5gWhNPAMRJpGHNOJN1zYvuxYLno36Vf
mmRD7oYZ38Q3ZD5+IoDQw144+E2xu0ALrGZum1X2pjTQAfPEu84xT4J4c6UqeOUn
xg6jCcS4ov3GLcfiweguP9A+L8sUL/BO8nmkJresOfjxQOf1OU09GfgNNrECgYBy
qIdOw1UD5LhMDL7dTGwQliBr5zwidVWMNIhvuWlORM9wOkNr1osIWKW01lr0v7XZ
BUVjx/zG8u7786M4WIaerZxI/vgTwwDlNpbO09GPJiFcMs+FR9b/VBCmYc/Jrffz
1c4xgHAiY9137P7oqprrpoIAsKsdxAIKftjPizDs2wKBgQCeg0sOzKfeMR6cLiVl
LbvAIBsS7Jq93Ezq3MypiMzV1pUQxMVU576QmffwLvMzf6V9Z4eecOUbMgGvDDlA
OawFJ0iEuSj/wdzt688EqnU6geK7Gsfyk8VnU9OPVU9dJ0lseaDQUVdbJt+1o35Q
N3qUOWS7YAxDC/+2Lr1jK9Z3Ew==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEyDCCA7CgAwIBAgIULWwNz6YXVYzkQ1L6JpYBm5X/Df8wDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcjJjYTEm
MCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5jb20wIBcNMjEwNjA3
MTkxNzE4WhgPMjEyMTA1MTQxOTE3MThaMIGLMQswCQYDVQQGEwJVUzELMAkGA1UE
CAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3Qx
GDAWBgNVBAMMD3BhcnRuZXIyY2xpZW50MTErMCkGCSqGSIb3DQEJARYccGFydG5l
cjJjbGllbnQxQHBhcnRuZXIyLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAL8wu19kJ33xHf4aQeLw9b3/PQvnfB0Ti+vMVUTpvUAgrDER4Jipc5VV
ZHU0Q6IavbzGgomK3YBcmtjvDWu/XDmw7CkOKKAzxYogMlRNgqwlXkUAZ3OeAXD9
RBFlzFSsne9oW/JDtZERazJ20/CiEltzNG5xd91olcm2GlrzDkh3H2H6Bj662zRH
QFCEbPdbCTSKQ+PiY0DpOgVJ2QOLN9OcCIO/NTQsGACbBUEbCz4zem12lp14Hw/r
g0aW7c0zinH1SxLse6knasUQFQm5qNOrLn8g+7Pb8IW7RQ8fqFhLHWRyBQ2pgnET
d/+56pVnadpqG1RH9qdvXZ1DOVVpiicCAwEAAaOCASgwggEkMBEGCWCGSAGG+EIB
AQQEAwIGwDAdBgNVHQ4EFgQU3/QmjsNlicyus6bEpaH7qP3AqFowCQYDVR0TBAIw
ADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MIG1BgNVHSMEga0wgaqAFGeYXN0ujRz3Zr4EcyFams29R3CMoXykejB4MQswCQYD
VQQGEwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMx
DTALBgNVBAsMBHJvb3QxEDAOBgNVBAMMB2ludGVyY2ExIDAeBgkqhkiG9w0BCQEW
EWludGVyY2FAYWRtaW4uY29tghQQkL0B0dRTDgREvJhCbMeTo1KfqTANBgkqhkiG
9w0BAQsFAAOCAQEAEFcKWHpwaNLg5NjRykYHpePU3LfHUDYcQ/W3WEeRJNrHonr5
qv72eKu0Lbn80gT+YTO0ZeOez5KA5BaGYodA4dEv3O4FUiF67GYrAwyH0+vCzXmB
KBufQkL6BeWOC8PpqGoN/Ek3Iyh8a+mra59As18+6iE3ZhlAL9b4HTnBD3Yx+d7J
wNonodKBcLzvGRhMZFd8j3kw/X/UU21RnYjX5xrUoa/XTAEFLpTpbtKWKkvIycea
vtuciaZWmgJG64qigupa9QqsYnwK0+jNM4ASvuclZa5GDL8m8wJtidYDMDSGySmO
/gwZBXboh71OdBq4ra8Cm1xbKBD3y5Ts2bzp0w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6kwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MThaGA8y
MTIxMDUxNDE5MTcxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQtWo8TV9BbLVD1MbK
VG2JhK188OqSKJAp2AJDVfJHyV73mR7L0KcvKvxvkIQKh6rQTD50ZAajZODt5/cI
l2Ar0PmxGWhJ2M1yyAjtRCMr8RwROejk1+nlsHwwWIhnLFS0l+G7m882OmTh+zLj
dgO9wmjfK2YcBjyZozkDHbziI1MZNpmFvh6Rq34d9IQCQJsWMPQQ46jbKCkHfp8l
IjBnQSC2N/IH66hbeEBP8UsNbkoyajhZI26oy+bp37hKF+UgGPIaByMY/vqwEjk4
gxB95PrYuB0c+YHPWOXMKXlIk6sxsXPmcKy6R/kV2OckARJ2/PtSq2FRp0J4elBH
To1vAgMBAAGjZjBkMB0GA1UdDgQWBBRnmFzdLo0c92a+BHMhWprNvUdwjDAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAY3VNlUKHN0rgPABL
HHrADPuB8M+wRK/p1L28cYXw64tfpemjERMIKh7IyuX1e9vOnQQPPWMnyH0Qv+ZA
06w/lF6yWLSf8cTAKK1QAa4ZPDC+74g2TwwzLXmuQDWNKb1+zPNxgmzcqmDNdXTU
N+mAN+tAL2aVXK61TfZlfhmbBkeSvow3Usj9dMydynk0Vea9AdIwvPi/nhBgAC7M
UJ1ulR/froF+d7eIpFNPgbcR2t06da+Wm22PgU5xRM9c90zpNHKNgmXSawOoUOF7
jrtCDf94hWnlqVJX2VUj0acqFzDIKyvCkZEHo6VqlKykbOtaTTBVEnTXMKdtp5OO
YBjw2Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN X509 CRL-----
MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290
MRMwEQYDVQQDDApwYXJ0bmVyMWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyMWNh
QHBhcnRuZXIxLmNvbRcNMjEwNjA3MTkxNzI4WhcNMjIwNjA3MTkxNzI4WjAnMCUC
FFFuSkrE8m/dVEcso4PkZUFYmvFBFw0yMTA2MDcxOTE3MjhaoA4wDDAKBgNVHRQE
AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAQujFul5rvGr4yytm/mjPQdcbeSTM3uT/
aFM6WbPE6DHx5/R1ItNCyA7YdfxzojfZ+kzR7j0WsSydWT2TngHD/2C6tIhXZRcG
UG6E473xniLFctn0FYyKZL03pOwdQgWk4dCUd3Ko8Qbos+vTRClXPMnPANPwJjYG
7x1UlEPShHaoQNiDakuUa6fGZyyFGbTWuH1zltH3aUKh/L2w1/Sndkv66Cmr4VQ0
s/ZsMnjJNPrjZJs32BzjxVaWYToe6vpwiQ6+UGyaZ3GTfv6r/oTWeRxcmQeXAT03
kxbwywkQwFndeC9NlrOQRM+TipsOybeiJToQskmPiEJ/7xfUAHOV3w==
-----END X509 CRL-----
-----BEGIN X509 CRL-----
MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v
dDETMBEGA1UEAwwKcGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJj
YUBwYXJ0bmVyMi5jb20XDTIxMDYwNzE5MTcyOFoXDTIyMDYwNzE5MTcyOFowTjAl
AhQtbA3PphdVjORDUvomlgGblf8OABcNMjEwNjA3MTkxNzI4WjAlAhRRbkpKxPJv
3VRHLKOD5GVBWJrxQRcNMjEwNjA3MTkxNzI4WqAOMAwwCgYDVR0UBAMCAQEwDQYJ
KoZIhvcNAQELBQADggEBAJXmtYDcF+sA0zQiRiCOIALVUQ4i0t4UwREEL7SEzD9C
hAOas0uFwkPef1hQWNkvx+OghFb3fStKS1zh9zbJx0fxyKttfsaaW2dQX4H8tyRR
vtuNtZBv/PT2ouWdpumSh9TmQUxKr/Uer5gGaqOm1S5MOemOVEYfsNqAzSnGI7f9
v5yMDywigHfv2dmM7xpttSZG3WCd5w0PJisndyAV/qga3CQMI5X6DIpWHmHbcD3k
sSps2YggdueW7y61uoi61jvpOGTbr6UAWLjHRyL35txC9xOMGJgJqBgebw/hGmW9
syY2loiEfzWX0A/9KGPo6Q8PB2YJbMmc7WT04g5W++8=
-----END X509 CRL-----

@ -0,0 +1,6 @@
name = NSScrypto-partner2client2rvk
nssSecmodDirectory = ./src/test/resources/keys/partner2client2rvk/nssdb
nssDbMode = readOnly
nssModule = keystore

@ -0,0 +1,70 @@
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6kwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MThaGA8y
MTIxMDUxNDE5MTcxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQtWo8TV9BbLVD1MbK
VG2JhK188OqSKJAp2AJDVfJHyV73mR7L0KcvKvxvkIQKh6rQTD50ZAajZODt5/cI
l2Ar0PmxGWhJ2M1yyAjtRCMr8RwROejk1+nlsHwwWIhnLFS0l+G7m882OmTh+zLj
dgO9wmjfK2YcBjyZozkDHbziI1MZNpmFvh6Rq34d9IQCQJsWMPQQ46jbKCkHfp8l
IjBnQSC2N/IH66hbeEBP8UsNbkoyajhZI26oy+bp37hKF+UgGPIaByMY/vqwEjk4
gxB95PrYuB0c+YHPWOXMKXlIk6sxsXPmcKy6R/kV2OckARJ2/PtSq2FRp0J4elBH
To1vAgMBAAGjZjBkMB0GA1UdDgQWBBRnmFzdLo0c92a+BHMhWprNvUdwjDAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAY3VNlUKHN0rgPABL
HHrADPuB8M+wRK/p1L28cYXw64tfpemjERMIKh7IyuX1e9vOnQQPPWMnyH0Qv+ZA
06w/lF6yWLSf8cTAKK1QAa4ZPDC+74g2TwwzLXmuQDWNKb1+zPNxgmzcqmDNdXTU
N+mAN+tAL2aVXK61TfZlfhmbBkeSvow3Usj9dMydynk0Vea9AdIwvPi/nhBgAC7M
UJ1ulR/froF+d7eIpFNPgbcR2t06da+Wm22PgU5xRM9c90zpNHKNgmXSawOoUOF7
jrtCDf94hWnlqVJX2VUj0acqFzDIKyvCkZEHo6VqlKykbOtaTTBVEnTXMKdtp5OO
YBjw2Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -0,0 +1,126 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDGJRex+n1aHeLL
xZ2bRCuTJxsWMkK4XkHjvj1RVLF1/pIQKmr349a0YHj2K+eFc764mLFCJKpTTG0x
OqNjiGeEIelDRCF9wPo9+uGtJh4Mx+NFZ/xIwMnw6SY5UFiV4cBwzA/ENacUQbO0
pScDUqaDBT1K0jQdGlBEeBiTsUfHqcAC4RZkVli6uA9pVMiAsU5cCDXYMzrXO/O9
5pvTxHWdlC06awpncvAW4XAklqRt0Mo6Wj8v+5MWhDbxz+ytIUJu2sXX9Niy4PC0
vTU+z7J1mgrDuRm52CzMl+swMT5ZzW7knHneXjy+6cMKCUQqjiy187Zy8CdmG5jO
kYdCbkqTAgMBAAECggEBAIYvTHKtLgK/Rn204Fzrt4655vALLX/p5Tkz9haEAoHj
2kq0Tyh81UPmKUScyvdnQPuF/FTMu8QZd8Dk8w1OrLugs3VoSD3/V/htVDOMIsGJ
BHJWT1V9qcRKQCaEMNmfvlElAHBh3TosnGRzi44GhNkpzS5EWCJ1VXJo2kv6vJ+L
NPVlrvJx/w1omO6pGhP2mfjuynBDteGtQorbzEq5y32fMVu2ykSmf/CiDtyQXyS2
iFZoEKxH9zusGIv026m6ccF2bpkiApI+l+OR8c40Wrxjfxfum++OfO3gHcTvOFZP
hVRWjUsC5LUixNwhZtT1WtittxpJbMGfotp6VhvNX9ECgYEA+P8FYpZG1B3yhIAd
3DWDf0tXJeWeu5JXDVe7N0TWklfgC2rtaZQ1SY3RhoxqQh2FOrZEcvsdIe/D2fE5
r65gtD/MkR/Pdgqe3/n3XtMXnoSW5D44NOTW1bw3QmE8gwseXQOb3EC7RhYA5Cjf
d2mnG1CbbW3kb7UlfHYLlPR+3WUCgYEAy7fmbdZKwmRoYsH6zbdxPQT9Ufx9Iq7b
8lag1hg7kkS1JEA+qehKO641cVNsB+7IDaW+19JMw/vChPC6XzJUds/egNxdwMSn
S3iUOVTUjizByg/kwIbSaHJq86Y3RtcraL9UMpjNRLav2OAikpX8oVgwupUGsXqN
6bZ0qXDhpJcCgYEA4T0wDeKK586/VwTd/hmafkgU6X8xe9QBU1yNSo3G3FMJpMpx
QRSEr6jOZLwYUv6JSncerDRkQhK2RCxmVnmTmPotfwobjVhGJ63jC7BAqXCfXpC6
H37yqB2+jxmOt6wTJ2jgUPltbxTwcXRX0ZmNRLRCJVdHUZW390KBb5lMOdECgYBt
SwQ8+TKyh9vY3+kGZNxDuGGPkr4v1U/6+67eLbIIDwR/plf4H79ztUrGudLDjr+V
Us7ISvMUUgVR/TR/ziiydWMSDyfdO6PlQZOEDpbaj/iHx28aOzq2/muSvCH7x4Rq
dfteCcxWiQxediEWM5GNnhrGfx1QKkfokxKTtRPZkQKBgQClz6/o1c3lpNcSqiuD
I4m89SqmiQtC/+21YXC4Xv1dQX3WQezg0AOm5rQuFlcDOtuVWskygxDoNGtmJmsh
lGJwOebeD/P83TY9RQVLWMcyYU6IrD91PT84ck24Me5MafeS2dJNzPlDcwNhj1QM
s1LRab/ivz8LzC5Tw8ab4PjJfg==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIEzjCCA7agAwIBAgIULWwNz6YXVYzkQ1L6JpYBm5X/DgAwDQYJKoZIhvcNAQEL
BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw
CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcjJjYTEm
MCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5jb20wIBcNMjEwNjA3
MTkxNzI2WhgPMjEyMTA1MTQxOTE3MjZaMIGRMQswCQYDVQQGEwJVUzELMAkGA1UE
CAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3Qx
GzAZBgNVBAMMEnBhcnRuZXIyY2xpZW50MnJ2azEuMCwGCSqGSIb3DQEJARYfcGFy
dG5lcjJjbGllbnQycnZrQHBhcnRuZXIyLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMYlF7H6fVod4svFnZtEK5MnGxYyQrheQeO+PVFUsXX+khAq
avfj1rRgePYr54VzvriYsUIkqlNMbTE6o2OIZ4Qh6UNEIX3A+j364a0mHgzH40Vn
/EjAyfDpJjlQWJXhwHDMD8Q1pxRBs7SlJwNSpoMFPUrSNB0aUER4GJOxR8epwALh
FmRWWLq4D2lUyICxTlwINdgzOtc7873mm9PEdZ2ULTprCmdy8BbhcCSWpG3Qyjpa
Py/7kxaENvHP7K0hQm7axdf02LLg8LS9NT7PsnWaCsO5GbnYLMyX6zAxPlnNbuSc
ed5ePL7pwwoJRCqOLLXztnLwJ2YbmM6Rh0JuSpMCAwEAAaOCASgwggEkMBEGCWCG
SAGG+EIBAQQEAwIGwDAdBgNVHQ4EFgQUqSjPa5CIQg8I/sqi64Zo1TSG3FowCQYD
VR0TBAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
AQUFBwMCMIG1BgNVHSMEga0wgaqAFGeYXN0ujRz3Zr4EcyFams29R3CMoXykejB4
MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UE
CgwCTUMxDTALBgNVBAsMBHJvb3QxEDAOBgNVBAMMB2ludGVyY2ExIDAeBgkqhkiG
9w0BCQEWEWludGVyY2FAYWRtaW4uY29tghQQkL0B0dRTDgREvJhCbMeTo1KfqTAN
BgkqhkiG9w0BAQsFAAOCAQEAYYW9CcVbC92BmRHh4w93w6eK7z+Uxu4s8EuCMDzv
Lts/NfEN/wF8eLkO/VEv/Q6q/79/+RbbCsVzAFNTld3CWw34/zdCWxn/wbD9We37
YICxqDlGGHgf6GBN7Eq97uBxjEPZ3p0RT1aSv9D1nOfG9rpZDqaNsnga4whT5reV
5aLB2b8Qsqakj+V/cv+8l1XW+xlb6vBnbushhg98rB7xZSNaT/EpM7GmJqKzyvhI
YyGDCVWqrPlEOT9wB4rtOXY07TELyRGOa52T+EfwqDSGNYdKvB1PBFwfUaiwVOfL
uveNWs/GqTnm97KTZFpDQgrzsJ7px86YEfmTB9MthVuSfA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIUEJC9AdHUUw4ERLyYQmzHk6NSn6kwDQYJKoZIhvcNAQEL
BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ
KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA2MDcxOTE3MThaGA8y
MTIxMDUxNDE5MTcxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG
A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK
cGFydG5lcjJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcjJjYUBwYXJ0bmVyMi5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQtWo8TV9BbLVD1MbK
VG2JhK188OqSKJAp2AJDVfJHyV73mR7L0KcvKvxvkIQKh6rQTD50ZAajZODt5/cI
l2Ar0PmxGWhJ2M1yyAjtRCMr8RwROejk1+nlsHwwWIhnLFS0l+G7m882OmTh+zLj
dgO9wmjfK2YcBjyZozkDHbziI1MZNpmFvh6Rq34d9IQCQJsWMPQQ46jbKCkHfp8l
IjBnQSC2N/IH66hbeEBP8UsNbkoyajhZI26oy+bp37hKF+UgGPIaByMY/vqwEjk4
gxB95PrYuB0c+YHPWOXMKXlIk6sxsXPmcKy6R/kV2OckARJ2/PtSq2FRp0J4elBH
To1vAgMBAAGjZjBkMB0GA1UdDgQWBBRnmFzdLo0c92a+BHMhWprNvUdwjDAfBgNV
HSMEGDAWgBTI4y/EE00f+IcRV07NdF4bEg1S/TASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAY3VNlUKHN0rgPABL
HHrADPuB8M+wRK/p1L28cYXw64tfpemjERMIKh7IyuX1e9vOnQQPPWMnyH0Qv+ZA
06w/lF6yWLSf8cTAKK1QAa4ZPDC+74g2TwwzLXmuQDWNKb1+zPNxgmzcqmDNdXTU
N+mAN+tAL2aVXK61TfZlfhmbBkeSvow3Usj9dMydynk0Vea9AdIwvPi/nhBgAC7M
UJ1ulR/froF+d7eIpFNPgbcR2t06da+Wm22PgU5xRM9c90zpNHKNgmXSawOoUOF7
jrtCDf94hWnlqVJX2VUj0acqFzDIKyvCkZEHo6VqlKykbOtaTTBVEnTXMKdtp5OO
YBjw2Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID6jCCAtKgAwIBAgIUFdCzxpaFd/h+szr/7iWKsoQQAAcwDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE
AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDQyBkPmtfNcev4/BeiFIJJw5vk
+xrIQnIRC1FAq/Db14lWPk7L+ZnlgzR0Agc+JTpi7C2qC42KHpIvLeMFAa8ww/dI
yGHTu/ds0KEgBXDIa4amdZQuK5lNN681226jCgxz7xGEHmStNT74aXEgwajcflwe
sijn5pEIA+MIujYQ8eFWfhpkyL3l6Zzbd3NKnBGAmaWd8rE33ka9Gs6sw5KRFbjI
khgxePl9/S8Uip7Fm8DY4OUDLzhQpOUvv+sZuX+g7Hjh+rvyWULVHnHCZlkkQz2s
J4IIOB6SihgSHkTwsLGDXySymMY3GMmo4nIiu9lu5IfjZxYTkhbQLB2kC0JrAgMB
AAGjZjBkMB0GA1UdDgQWBBTI4y/EE00f+IcRV07NdF4bEg1S/TAfBgNVHSMEGDAW
gBTSXVKotGw90L784/vRRjvjCQB3tDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud
DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEArLGs90jHg7a7vIm2igyD4+/6
LdL8pZwdmNKSFYQLsIjre5vJcSchQPyL850pIk1aZciFtBtTxWHVt8xNsKpqmV3l
BhEk4PXtebnwVVYATZznDd97h9pd3Dmaos9JPhz8oLs4Ly5BY0JzUHQk+o3o6EAg
p5Oa/WM0ZPs2FzbcxSjq3HmKlpDyIL+5Jn43F7z1feVsEh8Fw2FbzoFYz5/4uudP
aAh9g9TH7R4At02G6XqyLgayIzj+2ZILo5nz5/ULGbwCvoFQ+HjbZ84u/X8tRQuR
5kxOTnkxEoB8wbKGz8XZddqjC9ufzM4gobsGuougMFSGaCyqrvK7xS9wiVQYPA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUY6A2eCEpaP+hfVPA3mgtROGIQQ0wDQYJKoZIhvcNAQEL
BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ
BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x
HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNjA3MTkxNzE1
WhgPMjEyMTA1MTQxOTE3MTVaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM
MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE
AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw5ntBeNNq6CDlUcztnv
6MYzFpTXTdn+pqGPq032OHE/ochWxVFy1gKm0hxgFp0d6kEiKc/h9RAp9Er+N0e0
iJyqrKUIaXjWd9P4Dlr4RnQdmajo6k9opyevI32qPXvMKX0cwtMqJO6kB8nQfPgs
U9Za5TO6mJBSJT5jPca0RZy+/ueBto+2MjvFs3K8dCjYmmZeoSrYjCljGkLTPWu+
lsY+3raBfcj/DUkmGIz8lYAYS3N4JronOUax7E3g2iX7ERf95/sOwi1pADnwoBtm
RhhBhr8+OcWoJtLGfHHyDyFUSYPwb+0ZiE62lR6ClkFf7YJt7GsOS4/sapcV1PTj
pQIDAQABo1MwUTAdBgNVHQ4EFgQU0l1SqLRsPdC+/OP70UY74wkAd7QwHwYDVR0j
BBgwFoAU0l1SqLRsPdC+/OP70UY74wkAd7QwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAQEATaIT3/UU5B8BKeKiqTKr02diC6gvNCkuAy37eq8uFUzy
5YzSkAZtKcVFBU5cEl8/mnd+a3w1EiJtzE4FtwR5J/fKHzCmsq+QTTrneUsVyx4g
02yqnik1Z7NmYzfnpol+t90Beo0Mwr1n4NEbQri9Z2qNxDX4fwlAqqfAGCAKjrWp
+scvjv/wCxfd9+EHZp5GvtORHB7ZnQUe5qY08SjxP5nbRDHdiVTCs3otHo9F+5Rq
oecPStW11C0XzH22RJMZFM8VhFBqPNeaAc+QvbXBgjLDjkftewqklHJWPc/rmFxR
Hc7m7LCRf+8X/o6uxRJ1fBDjnNfTkUwW4bEtd31efw==
-----END CERTIFICATE-----

@ -144,7 +144,7 @@ dependencyManagement {
dependency 'org.slf4j:slf4j-log4j12:1.7.26'
dependency 'org.springframework.security:spring-security-crypto:5.4.2'
dependency 'org.web3j:abi:4.5.15'
dependency 'org.web3j:besu:4.5.15'
dependency('org.web3j:core:4.5.15') {

Loading…
Cancel
Save