001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.model.dataformat;
018    
019    import java.security.Key;
020    import java.security.spec.AlgorithmParameterSpec;
021    import javax.xml.bind.annotation.XmlAccessType;
022    import javax.xml.bind.annotation.XmlAccessorType;
023    import javax.xml.bind.annotation.XmlAttribute;
024    import javax.xml.bind.annotation.XmlRootElement;
025    
026    import org.apache.camel.CamelContext;
027    import org.apache.camel.model.DataFormatDefinition;
028    import org.apache.camel.spi.DataFormat;
029    import org.apache.camel.spi.RouteContext;
030    import org.apache.camel.util.CamelContextHelper;
031    import org.apache.camel.util.ObjectHelper;
032    
033    @XmlRootElement(name = "crypto")
034    @XmlAccessorType(XmlAccessType.FIELD)
035    public class CryptoDataFormat extends DataFormatDefinition {
036        @XmlAttribute
037        private String algorithm;
038        @XmlAttribute
039        private String cryptoProvider;
040        @XmlAttribute
041        private String keyRef;
042        @XmlAttribute
043        private String initVectorRef;
044        @XmlAttribute
045        private String algorithmParameterRef;
046        @XmlAttribute
047        private Integer buffersize;
048        @XmlAttribute
049        private String macAlgorithm = "HmacSHA1";
050        @XmlAttribute
051        private Boolean shouldAppendHMAC;
052        @XmlAttribute
053        private Boolean inline;
054    
055        public CryptoDataFormat() {
056            super("crypto");
057        }
058    
059        @Override
060        protected DataFormat createDataFormat(RouteContext routeContext) {
061            DataFormat cryptoFormat = super.createDataFormat(routeContext);
062    
063            if (ObjectHelper.isNotEmpty(keyRef)) {
064                Key key = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), keyRef, Key.class);
065                setProperty(routeContext.getCamelContext(), cryptoFormat, "key", key);
066            }
067            if (ObjectHelper.isNotEmpty(algorithmParameterRef)) {
068                AlgorithmParameterSpec spec = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(),
069                        algorithmParameterRef, AlgorithmParameterSpec.class);
070                setProperty(routeContext.getCamelContext(), cryptoFormat, "AlgorithmParameterSpec", spec);
071            }
072            if (ObjectHelper.isNotEmpty(initVectorRef)) {
073                byte[] iv = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), initVectorRef, byte[].class);
074                setProperty(routeContext.getCamelContext(), cryptoFormat, "InitializationVector", iv);
075            }
076            return cryptoFormat;
077        }
078    
079        @Override
080        protected void configureDataFormat(DataFormat dataFormat, CamelContext camelContext) {
081            Boolean answer = ObjectHelper.toBoolean(shouldAppendHMAC);
082            if (answer != null && !answer) {
083                setProperty(camelContext, dataFormat, "shouldAppendHMAC", Boolean.FALSE);
084            } else {
085                setProperty(camelContext, dataFormat, "shouldAppendHMAC", Boolean.TRUE);
086            }
087            answer = ObjectHelper.toBoolean(inline);
088            if (answer != null && answer) {
089                setProperty(camelContext, dataFormat, "shouldInlineInitializationVector", Boolean.TRUE);
090            } else {
091                setProperty(camelContext, dataFormat, "shouldInlineInitializationVector", Boolean.FALSE);
092            }
093            if (algorithm != null) {
094                setProperty(camelContext, dataFormat, "algorithm", algorithm);
095            }
096            if (cryptoProvider != null) {
097                setProperty(camelContext, dataFormat, "cryptoProvider", cryptoProvider);
098            }
099            if (macAlgorithm != null) {
100                setProperty(camelContext, dataFormat, "macAlgorithm", macAlgorithm);
101            }
102            if (buffersize != null) {
103                setProperty(camelContext, dataFormat, "buffersize", buffersize);
104            }
105        }
106    
107        public String getAlgorithm() {
108            return algorithm;
109        }
110    
111        public void setAlgorithm(String algorithm) {
112            this.algorithm = algorithm;
113        }
114    
115        public String getCryptoProvider() {
116            return cryptoProvider;
117        }
118    
119        public void setCryptoProvider(String cryptoProvider) {
120            this.cryptoProvider = cryptoProvider;
121        }
122    
123        public String getKeyRef() {
124            return keyRef;
125        }
126    
127        public void setKeyRef(String keyRef) {
128            this.keyRef = keyRef;
129        }
130    
131        public String getInitVectorRef() {
132            return initVectorRef;
133        }
134    
135        public void setInitVectorRef(String initVectorRef) {
136            this.initVectorRef = initVectorRef;
137        }
138    
139        public String getAlgorithmParameterRef() {
140            return algorithmParameterRef;
141        }
142    
143        public void setAlgorithmParameterRef(String algorithmParameterRef) {
144            this.algorithmParameterRef = algorithmParameterRef;
145        }
146    
147        public Integer getBuffersize() {
148            return buffersize;
149        }
150    
151        public void setBuffersize(Integer buffersize) {
152            this.buffersize = buffersize;
153        }
154    
155        public String getMacAlgorithm() {
156            return macAlgorithm;
157        }
158    
159        public void setMacAlgorithm(String macAlgorithm) {
160            this.macAlgorithm = macAlgorithm;
161        }
162    
163        public Boolean getShouldAppendHMAC() {
164            return shouldAppendHMAC;
165        }
166    
167        public void setShouldAppendHMAC(Boolean shouldAppendHMAC) {
168            this.shouldAppendHMAC = shouldAppendHMAC;
169        }
170    
171        public Boolean getInline() {
172            return inline;
173        }
174    
175        public void setInline(Boolean inline) {
176            this.inline = inline;
177        }
178    }