Repository: cxf
Updated Branches:
  refs/heads/master 016140cc8 -> 2f25e4d74


[CXF-7365] Making sure a b64 status false value is enforced and headers are 
correctly submitted to the sig process, optional support for jws json


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/2f25e4d7
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/2f25e4d7
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/2f25e4d7

Branch: refs/heads/master
Commit: 2f25e4d7484fb7c2388362418285b122e585bf1b
Parents: 016140c
Author: Sergey Beryozkin <[email protected]>
Authored: Wed May 10 14:10:15 2017 +0100
Committer: Sergey Beryozkin <[email protected]>
Committed: Wed May 10 14:10:15 2017 +0100

----------------------------------------------------------------------
 .../jaxrs/JwsDetachedSignatureProvider.java     | 24 ++++++---
 .../AbstractJwsMultipartSignatureFilter.java    | 21 +++++++-
 .../AbstractJwsMultipartVerificationFilter.java | 12 +++--
 .../JwsMultipartSignatureInFilter.java          | 55 ++++++++++++++------
 .../security/jose/jws/JwsDetachedSignature.java | 16 +++++-
 .../jose/jwejws/JAXRSJwsMultipartTest.java      | 32 ++++++++----
 .../security/jose/jwejws/serverMultipart.xml    | 16 ++++++
 7 files changed, 137 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwsDetachedSignatureProvider.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwsDetachedSignatureProvider.java
 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwsDetachedSignatureProvider.java
index c4f8bf4..9928da6 100644
--- 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwsDetachedSignatureProvider.java
+++ 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwsDetachedSignatureProvider.java
@@ -30,12 +30,10 @@ import javax.ws.rs.ext.MessageBodyWriter;
 
 import org.apache.cxf.common.util.Base64UrlUtility;
 import org.apache.cxf.common.util.StringUtils;
-import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
 import org.apache.cxf.rs.security.jose.common.JoseUtils;
 import org.apache.cxf.rs.security.jose.jws.JwsDetachedSignature;
 
 public class JwsDetachedSignatureProvider implements 
MessageBodyWriter<JwsDetachedSignature> {
-    private JsonMapObjectReaderWriter writer = new JsonMapObjectReaderWriter();
     @Override
     public long getSize(JwsDetachedSignature arg0, Class<?> arg1, Type arg2, 
Annotation[] arg3, MediaType arg4) {
         return -1;
@@ -51,13 +49,25 @@ public class JwsDetachedSignatureProvider implements 
MessageBodyWriter<JwsDetach
                         MultivaluedMap<String, Object> headers, OutputStream 
os)
                             throws IOException, WebApplicationException {
         JoseUtils.traceHeaders(parts.getHeaders());
-        byte[] headerBytes = 
StringUtils.toBytesUTF8(writer.toJson(parts.getHeaders()));
-        Base64UrlUtility.encodeAndStream(headerBytes, 0, headerBytes.length, 
os);
-        os.write(new byte[]{'.'});
         
         byte[] finalBytes = parts.getSignature().sign();
-        os.write(new byte[]{'.'});
-        Base64UrlUtility.encodeAndStream(finalBytes, 0, finalBytes.length, os);
+        
+        if (!parts.isUseJwsJsonSignatureFormat()) {
+            os.write(StringUtils.toBytesASCII(parts.getEncodedHeaders()));
+            byte[] dotBytes = new byte[]{'.'};
+            os.write(dotBytes);
+            os.write(dotBytes);
+            Base64UrlUtility.encodeAndStream(finalBytes, 0, finalBytes.length, 
os);
+        } else {
+            // use flattened JWS JSON format
+            os.write(StringUtils.toBytesASCII("{"));
+            String headersProp = "\"protected\":\"" + 
parts.getEncodedHeaders() + "\"";
+            os.write(StringUtils.toBytesUTF8(headersProp));
+            os.write(StringUtils.toBytesASCII(","));
+            String sigProp = "\"signature\":\"" + 
Base64UrlUtility.encode(finalBytes) + "\"";
+            os.write(StringUtils.toBytesUTF8(sigProp));
+            os.write(StringUtils.toBytesASCII("}"));
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartSignatureFilter.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartSignatureFilter.java
 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartSignatureFilter.java
index 2455658..971e6ea 100644
--- 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartSignatureFilter.java
+++ 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartSignatureFilter.java
@@ -23,9 +23,12 @@ import java.util.List;
 
 import javax.ws.rs.ProcessingException;
 
+import org.apache.cxf.common.util.Base64UrlUtility;
+import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.cxf.jaxrs.json.basic.JsonMapObjectReaderWriter;
 import org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils;
 import org.apache.cxf.rs.security.jose.common.JoseConstants;
 import org.apache.cxf.rs.security.jose.jws.JwsDetachedSignature;
@@ -35,9 +38,11 @@ import 
org.apache.cxf.rs.security.jose.jws.JwsSignatureProvider;
 import org.apache.cxf.rs.security.jose.jws.JwsUtils;
 
 public abstract class AbstractJwsMultipartSignatureFilter {
-
+    private JsonMapObjectReaderWriter writer = new JsonMapObjectReaderWriter();
+    
     private JwsSignatureProvider sigProvider;
     private boolean supportSinglePartOnly = true;
+    private boolean useJwsJsonSignatureFormat;
 
     public void setSignatureProvider(JwsSignatureProvider signatureProvider) {
         this.sigProvider = signatureProvider;
@@ -62,13 +67,21 @@ public abstract class AbstractJwsMultipartSignatureFilter {
         }
         
         JwsHeaders headers = new JwsHeaders();
+        headers.setPayloadEncodingStatus(false);
         JwsSignatureProvider theSigProvider = sigProvider != null ? sigProvider
             : JwsUtils.loadSignatureProvider(headers, true);
         JwsSignature jwsSignature = theSigProvider.createJwsSignature(headers);
+        
+        String base64UrlEncodedHeaders = 
Base64UrlUtility.encode(writer.toJson(headers));
+        byte[] headerBytesWithDot = 
StringUtils.toBytesASCII(base64UrlEncodedHeaders + ".");
+        jwsSignature.update(headerBytesWithDot, 0, headerBytesWithDot.length);
         AttachmentUtils.addMultipartOutFilter(new 
JwsMultipartSignatureOutFilter(jwsSignature));
         
         
-        JwsDetachedSignature jws = new JwsDetachedSignature(headers, 
jwsSignature);
+        JwsDetachedSignature jws = new JwsDetachedSignature(headers, 
+                                                            
base64UrlEncodedHeaders,
+                                                            jwsSignature,
+                                                            
useJwsJsonSignatureFormat);
         
         Attachment jwsPart = new Attachment("signature", 
JoseConstants.MEDIA_TYPE_JOSE, jws);
         parts.add(jwsPart);
@@ -78,4 +91,8 @@ public abstract class AbstractJwsMultipartSignatureFilter {
     public void setSupportSinglePartOnly(boolean supportSinglePartOnly) {
         this.supportSinglePartOnly = supportSinglePartOnly;
     }
+
+    public void setUseJwsJsonSignatureFormat(boolean 
useJwsJsonSignatureFormat) {
+        this.useJwsJsonSignatureFormat = useJwsJsonSignatureFormat;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartVerificationFilter.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartVerificationFilter.java
 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartVerificationFilter.java
index b09124b..126cd8f 100644
--- 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartVerificationFilter.java
+++ 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/AbstractJwsMultipartVerificationFilter.java
@@ -30,6 +30,7 @@ public abstract class AbstractJwsMultipartVerificationFilter {
     
     private JwsSignatureVerifier sigVerifier;
     private boolean supportSinglePartOnly = true;
+    private boolean useJwsJsonSignatureFormat;
     
     public void setSigVerifier(JwsSignatureVerifier sigVerifier) {
         this.sigVerifier = sigVerifier;
@@ -41,11 +42,16 @@ public abstract class 
AbstractJwsMultipartVerificationFilter {
     protected void addMultipartFilterIfNeeded(MediaType contentType) {
         if (contentType != null && contentType.getType().equals("multipart")) {
             Message m = JAXRSUtils.getCurrentMessage();
-            MultipartInputFilter jwsFilter = sigVerifier == null 
-                ? new JwsMultipartSignatureInFilter(m, supportSinglePartOnly) 
-                : new JwsMultipartSignatureInFilter(m, sigVerifier, 
supportSinglePartOnly); 
+            MultipartInputFilter jwsFilter = new 
JwsMultipartSignatureInFilter(m, 
+                                                    sigVerifier, 
+                                                    supportSinglePartOnly, 
+                                                    
useJwsJsonSignatureFormat); 
             AttachmentUtils.addMultipartInFilter(jwsFilter); 
         }
         
     }
+    
+    public void setUseJwsJsonSignatureFormat(boolean 
useJwsJsonSignatureFormat) {
+        this.useJwsJsonSignatureFormat = useJwsJsonSignatureFormat;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/JwsMultipartSignatureInFilter.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/JwsMultipartSignatureInFilter.java
 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/JwsMultipartSignatureInFilter.java
index 4b06233..697553e 100644
--- 
a/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/JwsMultipartSignatureInFilter.java
+++ 
b/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/multipart/JwsMultipartSignatureInFilter.java
@@ -21,8 +21,10 @@ package org.apache.cxf.rs.security.jose.jaxrs.multipart;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
+import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.ext.multipart.MultipartInputFilter;
@@ -39,19 +41,19 @@ import org.apache.cxf.rs.security.jose.jws.JwsUtils;
 import org.apache.cxf.rs.security.jose.jws.JwsVerificationSignature;
 
 public class JwsMultipartSignatureInFilter implements MultipartInputFilter {
-
+    private JsonMapObjectReaderWriter reader = new JsonMapObjectReaderWriter();
     private JwsSignatureVerifier verifier;
     private boolean supportSinglePartOnly;
     private Message message;
-    public JwsMultipartSignatureInFilter(Message message, boolean 
supportSinglePartOnly) {
-        this(message, null, supportSinglePartOnly);
-    }
-    
-    public JwsMultipartSignatureInFilter(Message message, JwsSignatureVerifier 
verifier, 
-                                         boolean supportSinglePartOnly) {
+    private boolean useJwsJsonSignatureFormat;
+    public JwsMultipartSignatureInFilter(Message message, 
+                                         JwsSignatureVerifier verifier, 
+                                         boolean supportSinglePartOnly,
+                                         boolean useJwsJsonSignatureFormat) {
         this.message = message;
         this.verifier = verifier;
         this.supportSinglePartOnly = supportSinglePartOnly;
+        this.useJwsJsonSignatureFormat = useJwsJsonSignatureFormat;
     }
     
     @Override
@@ -61,21 +63,39 @@ public class JwsMultipartSignatureInFilter implements 
MultipartInputFilter {
         }
         Attachment sigPart = atts.remove(atts.size() - 1);
         
-        String encodedJws = null;
+        String jwsSequence = null;
         try {
-            encodedJws = 
IOUtils.readStringFromStream(sigPart.getDataHandler().getInputStream());
+            jwsSequence = 
IOUtils.readStringFromStream(sigPart.getDataHandler().getInputStream());
         } catch (IOException ex) {
             throw ExceptionUtils.toBadRequestException(null, null);
         }
-        String[] parts = JoseUtils.getCompactParts(encodedJws);
-        // Detached signature
-        if (parts.length != 3 || parts[1].length() > 0) {
-            throw ExceptionUtils.toBadRequestException(null, null);
+        
+        String base64UrlEncodedHeaders = null;
+        String base64UrlEncodedSignature = null;
+        
+        if (!useJwsJsonSignatureFormat) {
+            String[] parts = JoseUtils.getCompactParts(jwsSequence);
+            if (parts.length != 3 || parts[1].length() > 0) {
+                throw ExceptionUtils.toBadRequestException(null, null);
+            }
+            base64UrlEncodedHeaders = parts[0];
+            base64UrlEncodedSignature = parts[2];
+        } else {
+            Map<String, Object> parts = reader.fromJson(jwsSequence);
+            if (parts.size() != 2 || !parts.containsKey("protected") || 
!parts.containsKey("signature")) {
+                throw ExceptionUtils.toBadRequestException(null, null);
+            }
+            base64UrlEncodedHeaders = (String)parts.get("protected");
+            base64UrlEncodedSignature = (String)parts.get("signature");
         }
+        
         JwsHeaders headers = new JwsHeaders(
                                  new JsonMapObjectReaderWriter().fromJson(
-                                     JoseUtils.decodeToString(parts[0])));
-        
+                                     
JoseUtils.decodeToString(base64UrlEncodedHeaders)));
+        JoseUtils.traceHeaders(headers);
+        if (Boolean.FALSE != headers.getPayloadEncodingStatus()) {
+            throw ExceptionUtils.toBadRequestException(null, null);
+        }
         JwsSignatureVerifier theVerifier = null;
         if (verifier == null) {
             Properties props = KeyManagementUtils.loadStoreProperties(message, 
true,
@@ -92,7 +112,10 @@ public class JwsMultipartSignatureInFilter implements 
MultipartInputFilter {
         if (sig == null) {
             throw ExceptionUtils.toBadRequestException(null, null);
         }
-        byte[] signatureBytes = JoseUtils.decode(parts[2]);
+        byte[] signatureBytes = JoseUtils.decode(base64UrlEncodedSignature);
+        
+        byte[] headerBytesWithDot = 
StringUtils.toBytesASCII(base64UrlEncodedHeaders + ".");
+        sig.update(headerBytesWithDot, 0, headerBytesWithDot.length);
         
         int attSize = atts.size();
         for (int i = 0; i < attSize; i++) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsDetachedSignature.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsDetachedSignature.java
 
b/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsDetachedSignature.java
index 4de23f1..8e82be9 100644
--- 
a/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsDetachedSignature.java
+++ 
b/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsDetachedSignature.java
@@ -20,17 +20,29 @@ package org.apache.cxf.rs.security.jose.jws;
 
 public class JwsDetachedSignature {
     private JwsHeaders headers;
+    private String base64UrlEncodedHeaders;
     private JwsSignature signature;
-    public JwsDetachedSignature(JwsHeaders headers, JwsSignature signature) {
+    private boolean useJwsJsonSignatureFormat;
+    public JwsDetachedSignature(JwsHeaders headers,
+                                String base64UrlEncodedHeaders,
+                                JwsSignature signature, 
+                                boolean useJwsJsonSignatureFormat) {
         this.headers = headers;
+        this.base64UrlEncodedHeaders = base64UrlEncodedHeaders;
         this.signature = signature;
+        this.useJwsJsonSignatureFormat = useJwsJsonSignatureFormat;
     }
     public JwsHeaders getHeaders() {
         return headers;
     }
+    public String getEncodedHeaders() {
+        return base64UrlEncodedHeaders;
+    }
     public JwsSignature getSignature() {
         return signature;
     }
-    
+    public boolean isUseJwsJsonSignatureFormat() {
+        return useJwsJsonSignatureFormat;
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/systests/rs-security/src/test/java/org/apache/cxf/systest/jaxrs/security/jose/jwejws/JAXRSJwsMultipartTest.java
----------------------------------------------------------------------
diff --git 
a/systests/rs-security/src/test/java/org/apache/cxf/systest/jaxrs/security/jose/jwejws/JAXRSJwsMultipartTest.java
 
b/systests/rs-security/src/test/java/org/apache/cxf/systest/jaxrs/security/jose/jwejws/JAXRSJwsMultipartTest.java
index 54201a9..ec7ffbc 100644
--- 
a/systests/rs-security/src/test/java/org/apache/cxf/systest/jaxrs/security/jose/jwejws/JAXRSJwsMultipartTest.java
+++ 
b/systests/rs-security/src/test/java/org/apache/cxf/systest/jaxrs/security/jose/jwejws/JAXRSJwsMultipartTest.java
@@ -65,7 +65,16 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
     @Test
     public void testJwsJwkBookHMacMultipart() throws Exception {
         String address = "https://localhost:"; + PORT + "/jwsjwkhmacSinglePart";
-        BookStore bs = createJwsBookStoreHMac(address, true);
+        BookStore bs = createJwsBookStoreHMac(address, true, false);
+        Book book = bs.echoBookMultipart(new Book("book", 123L));
+        assertEquals("book", book.getName());
+        assertEquals(123L, book.getId());
+    }
+    
+    @Test
+    public void testJwsJwkBookHMacMultipartJwsJson() throws Exception {
+        String address = "https://localhost:"; + PORT + 
"/jwsjwkhmacSinglePartJwsJson";
+        BookStore bs = createJwsBookStoreHMac(address, true, true);
         Book book = bs.echoBookMultipart(new Book("book", 123L));
         assertEquals("book", book.getName());
         assertEquals(123L, book.getId());
@@ -83,7 +92,7 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
     @Test
     public void testJwsJwkBooksHMacMultipart() throws Exception {
         String address = "https://localhost:"; + PORT + "/jwsjwkhmacManyParts";
-        BookStore bs = createJwsBookStoreHMac(address, false);
+        BookStore bs = createJwsBookStoreHMac(address, false, false);
         List<Book> books = new LinkedList<Book>();
         books.add(new Book("book", 123L));
         books.add(new Book("book2", 124L));
@@ -96,7 +105,7 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
     @Test(expected = ProcessingException.class)
     public void testJwsJwkBooksHMacMultipartClientRestriction() throws 
Exception {
         String address = "https://localhost:"; + PORT + "/jwsjwkhmacManyParts";
-        BookStore bs = createJwsBookStoreHMac(address, true);
+        BookStore bs = createJwsBookStoreHMac(address, true, false);
         List<Book> books = new LinkedList<Book>();
         books.add(new Book("book", 123L));
         books.add(new Book("book2", 124L));
@@ -105,7 +114,7 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
     @Test(expected = BadRequestException.class)
     public void testJwsJwkBooksHMacMultipartServerRestriction() throws 
Exception {
         String address = "https://localhost:"; + PORT + "/jwsjwkhmacSinglePart";
-        BookStore bs = createJwsBookStoreHMac(address, false);
+        BookStore bs = createJwsBookStoreHMac(address, false, false);
         List<Book> books = new LinkedList<Book>();
         books.add(new Book("book", 123L));
         books.add(new Book("book2", 124L));
@@ -122,7 +131,7 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
     @Test
     public void testJwsJwkBookHMacMultipartModified() throws Exception {
         String address = "https://localhost:"; + PORT + 
"/jwsjwkhmacSinglePartModified";
-        BookStore bs = createJwsBookStoreHMac(address, true);
+        BookStore bs = createJwsBookStoreHMac(address, true, false);
         try {
             bs.echoBookMultipart(new Book("book", 123L));
             fail("Exception is expected");
@@ -130,20 +139,24 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
             // expected
         }
     }
-    private BookStore createJwsBookStoreHMac(String address, boolean 
supportSinglePart) throws Exception {
-        JAXRSClientFactoryBean bean = createJAXRSClientFactoryBean(address, 
supportSinglePart);
+    private BookStore createJwsBookStoreHMac(String address, 
+                                             boolean supportSinglePart,
+                                             boolean 
useJwsJsonSignatureFormat) throws Exception {
+        JAXRSClientFactoryBean bean = createJAXRSClientFactoryBean(address, 
supportSinglePart, 
+                                                                   
useJwsJsonSignatureFormat);
         bean.getProperties(true).put("rs.security.signature.properties",
             "org/apache/cxf/systest/jaxrs/security/secret.jwk.properties");
         return bean.create(BookStore.class);
     }
     private BookStore createJwsBookStoreRSA(String address, boolean 
supportSinglePart) throws Exception {
-        JAXRSClientFactoryBean bean = createJAXRSClientFactoryBean(address, 
supportSinglePart);
+        JAXRSClientFactoryBean bean = createJAXRSClientFactoryBean(address, 
supportSinglePart, false);
         bean.getProperties(true).put("rs.security.signature.properties",
             "org/apache/cxf/systest/jaxrs/security/alice.jwk.properties");
         return bean.create(BookStore.class);
     }
     private JAXRSClientFactoryBean createJAXRSClientFactoryBean(String 
address, 
-                                                                boolean 
supportSinglePart) throws Exception {
+                                                                boolean 
supportSinglePart,
+                                                                boolean 
useJwsJsonSignatureFormat) throws Exception {
         JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
         SpringBusFactory bf = new SpringBusFactory();
         URL busFile = JAXRSJwsMultipartTest.class.getResource("client.xml");
@@ -154,6 +167,7 @@ public class JAXRSJwsMultipartTest extends 
AbstractBusClientServerTestBase {
         List<Object> providers = new LinkedList<Object>();
         JwsMultipartClientRequestFilter outFilter = new 
JwsMultipartClientRequestFilter();
         outFilter.setSupportSinglePartOnly(supportSinglePart);
+        outFilter.setUseJwsJsonSignatureFormat(useJwsJsonSignatureFormat);
         providers.add(outFilter);
         JwsMultipartClientResponseFilter inFilter = new 
JwsMultipartClientResponseFilter();
         inFilter.setSupportSinglePartOnly(supportSinglePart);

http://git-wip-us.apache.org/repos/asf/cxf/blob/2f25e4d7/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/serverMultipart.xml
----------------------------------------------------------------------
diff --git 
a/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/serverMultipart.xml
 
b/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/serverMultipart.xml
index 0a2a3b4..77291bf 100644
--- 
a/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/serverMultipart.xml
+++ 
b/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/serverMultipart.xml
@@ -40,6 +40,9 @@ under the License.
     <bean id="serviceBean" 
class="org.apache.cxf.systest.jaxrs.security.jose.BookStore"/>
     
     <bean id="jwsInMultipartFilter" 
class="org.apache.cxf.rs.security.jose.jaxrs.multipart.JwsMultipartContainerRequestFilter"/>
+    <bean id="jwsInMultipartFilterJwsJson" 
class="org.apache.cxf.rs.security.jose.jaxrs.multipart.JwsMultipartContainerRequestFilter">
+        <property name="useJwsJsonSignatureFormat" value="true"/>
+    </bean>
     <bean id="jwsOutMultipartFilter" 
class="org.apache.cxf.rs.security.jose.jaxrs.multipart.JwsMultipartContainerResponseFilter"/>
     <bean id="jwsDetachedSignatureWriter" 
class="org.apache.cxf.rs.security.jose.jaxrs.JwsDetachedSignatureProvider"/>
     <bean id="jwsInMultipartModificationFilter" 
class="org.apache.cxf.systest.jaxrs.security.jose.jwejws.MultipartModificationFilter"/>
@@ -63,6 +66,19 @@ under the License.
             <entry key="rs.security.signature.properties" 
value="org/apache/cxf/systest/jaxrs/security/secret.jwk.properties"/>
         </jaxrs:properties>
     </jaxrs:server>
+    <jaxrs:server 
address="https://localhost:${testutil.ports.jaxrs-jws-multipart}/jwsjwkhmacSinglePartJwsJson";>
+        <jaxrs:serviceBeans>
+            <ref bean="serviceBean"/>
+        </jaxrs:serviceBeans>
+        <jaxrs:providers>
+            <ref bean="jwsInMultipartFilterJwsJson"/>
+            <ref bean="jwsOutMultipartFilter"/>
+            <ref bean="jwsDetachedSignatureWriter"/>
+        </jaxrs:providers>
+        <jaxrs:properties>
+            <entry key="rs.security.signature.properties" 
value="org/apache/cxf/systest/jaxrs/security/secret.jwk.properties"/>
+        </jaxrs:properties>
+    </jaxrs:server>
     <jaxrs:server 
address="https://localhost:${testutil.ports.jaxrs-jws-multipart}/jwsjwkrsaSinglePart";>
         <jaxrs:serviceBeans>
             <ref bean="serviceBean"/>

Reply via email to