package org.jboss.resteasy.test.crypto.resource;
import org.jboss.logging.Logger;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartInput;
import org.jboss.resteasy.security.PemUtils;
import org.jboss.resteasy.security.smime.EnvelopedInput;
import org.jboss.resteasy.security.smime.SignedInput;
import org.jboss.resteasy.utils.TestApplication;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import java.io.IOException;
import java.io.InputStream;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
@Path("/")
public class VerifyDecryptResource {
private static Logger logger = Logger.getLogger(VerifyDecryptResource.class);
@POST
@Path("encrypt")
public String encrypt(EnvelopedInput<String> input) throws Exception {
String secret = input.getEntity(privateKey, cert);
logger.info("secret: " + secret);
return secret;
}
@POST
@Path("sign")
public String sign(SignedInput<String> input) throws Exception {
if (!input.verify(cert)) {
throw new WebApplicationException(500);
}
String secret = input.getEntity();
logger.info("secret: " + secret);
return secret;
}
@POST
@Path("encryptSign")
public String encryptSign(SignedInput<EnvelopedInput<String>> input) throws Exception {
if (!input.verify(cert)) {
throw new WebApplicationException(500);
}
final EnvelopedInput<String> envelop = input.getEntity();
String secret = envelop.getEntity(privateKey, cert);
logger.info("secret: " + secret);
return secret;
}
@POST
@Path("signEncrypt")
public String signEncrypt(EnvelopedInput<SignedInput<String>> input) throws Exception {
SignedInput<String> signedInput = input.getEntity(privateKey, cert);
if (!signedInput.verify(cert)) {
throw new WebApplicationException(500);
}
String secret = signedInput.getEntity();
logger.info("secret: " + secret);
return secret;
}
@Path("encryptedEncrypted")
@POST
public String encryptedEncrypted(EnvelopedInput<EnvelopedInput<String>> input) throws Exception {
EnvelopedInput<String> envelope = input.getEntity(privateKey, cert);
String secret = envelope.getEntity(privateKey, cert);
logger.info("secret: " + secret);
return secret;
}
@Path("encryptSignSign")
@POST
public String encryptSignSign(SignedInput<SignedInput<EnvelopedInput<String>>> input) throws Exception {
if (!input.verify(cert)) {
throw new WebApplicationException(500);
}
SignedInput<EnvelopedInput<String>> inner = input.getEntity();
if (!inner.verify(cert)) {
throw new WebApplicationException(500);
}
final EnvelopedInput<String> envelop = inner.getEntity();
String secret = envelop.getEntity(privateKey, cert);
logger.info("secret: " + secret);
return secret;
}
@Path("multipartEncrypted")
@POST
public String post(EnvelopedInput<MultipartInput> input) throws Exception {
MultipartInput multipart = input.getEntity(privateKey, cert);
InputPart inputPart = multipart.getParts().iterator().next();
String secret = inputPart.getBody(String.class, null);
logger.info("secret: " + secret);
return secret;
}
public static X509Certificate cert;
public static PrivateKey privateKey;
static {
try {
cert = PemUtils.decodeCertificate(loadString("mycert.pem"));
privateKey = PemUtils.decodePrivateKey(loadString("mycert-private.pem"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static InputStream loadString(String name) throws IOException {
InputStream stream = null;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader != null) {
stream = classLoader.getResourceAsStream(name);
}
if (stream == null) {
stream = TestApplication.class.getResourceAsStream(name);
}
if (stream == null) {
throw new RuntimeException();
}
return stream;
}
}