/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.rs.security.jose.jwe;
import java.util.Collections;
import java.util.Map;
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.JoseConstants;
import org.apache.cxf.rs.security.jose.common.JoseHeaders;
import org.apache.cxf.rs.security.jose.common.JoseType;
import org.apache.cxf.rs.security.jose.jwa.ContentAlgorithm;
import org.apache.cxf.rs.security.jose.jwa.KeyAlgorithm;
public class JweHeaders extends JoseHeaders {
private static final long serialVersionUID = 2405157132884168551L;
private JweHeaders protectedHeaders;
public JweHeaders() {
}
public JweHeaders(JoseType type) {
super(type);
}
public JweHeaders(JoseHeaders headers) {
super(headers.asMap());
}
public JweHeaders(Map<String, Object> values) {
super(values);
}
public JweHeaders(String kid) {
this(Collections.singletonMap(JoseConstants.HEADER_KEY_ID, kid));
}
public JweHeaders(KeyAlgorithm keyEncAlgo, ContentAlgorithm ctEncAlgo) {
this(keyEncAlgo, ctEncAlgo, false);
}
public JweHeaders(ContentAlgorithm ctEncAlgo) {
this(null, ctEncAlgo, false);
}
public JweHeaders(ContentAlgorithm ctEncAlgo, boolean deflate) {
this(null, ctEncAlgo, deflate);
}
public JweHeaders(KeyAlgorithm keyEncAlgo, ContentAlgorithm ctEncAlgo, boolean deflate) {
init(keyEncAlgo, ctEncAlgo, deflate);
}
private void init(KeyAlgorithm keyEncAlgo, ContentAlgorithm ctEncAlgo, boolean deflate) {
if (keyEncAlgo != null) {
setKeyEncryptionAlgorithm(keyEncAlgo);
}
setContentEncryptionAlgorithm(ctEncAlgo);
if (deflate) {
setZipAlgorithm(JoseConstants.JWE_DEFLATE_ZIP_ALGORITHM);
}
}
public void setKeyEncryptionAlgorithm(KeyAlgorithm algo) {
super.setAlgorithm(algo.getJwaName());
}
public KeyAlgorithm getKeyEncryptionAlgorithm() {
String algo = super.getAlgorithm();
return algo == null ? null : KeyAlgorithm.getAlgorithm(algo);
}
public void setContentEncryptionAlgorithm(ContentAlgorithm algo) {
setHeader(JoseConstants.JWE_HEADER_CONTENT_ENC_ALGORITHM, algo.getJwaName());
}
public ContentAlgorithm getContentEncryptionAlgorithm() {
Object prop = getHeader(JoseConstants.JWE_HEADER_CONTENT_ENC_ALGORITHM);
return prop == null ? null : ContentAlgorithm.getAlgorithm(prop.toString());
}
public void setZipAlgorithm(String type) {
setHeader(JoseConstants.JWE_HEADER_ZIP_ALGORITHM, type);
}
public String getZipAlgorithm() {
return (String)getHeader(JoseConstants.JWE_HEADER_ZIP_ALGORITHM);
}
public byte[] toCipherAdditionalAuthData() {
return toCipherAdditionalAuthData(new JsonMapObjectReaderWriter().toJson(this));
}
public static byte[] toCipherAdditionalAuthData(String headersJson) {
byte[] headerBytes = StringUtils.toBytesUTF8(headersJson);
String base64UrlHeadersInJson = Base64UrlUtility.encode(headerBytes);
return StringUtils.toBytesASCII(base64UrlHeadersInJson);
}
public JweHeaders getProtectedHeaders() {
return protectedHeaders;
}
public void setProtectedHeaders(JweHeaders protectedHeaders) {
this.protectedHeaders = protectedHeaders;
}
}