001/*
002 * $HeadURL: http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.11/src/java/org/apache/commons/ssl/PEMItem.java $
003 * $Revision: 121 $
004 * $Date: 2007-11-13 21:26:57 -0800 (Tue, 13 Nov 2007) $
005 *
006 * ====================================================================
007 * Licensed to the Apache Software Foundation (ASF) under one
008 * or more contributor license agreements.  See the NOTICE file
009 * distributed with this work for additional information
010 * regarding copyright ownership.  The ASF licenses this file
011 * to you under the Apache License, Version 2.0 (the
012 * "License"); you may not use this file except in compliance
013 * with the License.  You may obtain a copy of the License at
014 *
015 *   http://www.apache.org/licenses/LICENSE-2.0
016 *
017 * Unless required by applicable law or agreed to in writing,
018 * software distributed under the License is distributed on an
019 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020 * KIND, either express or implied.  See the License for the
021 * specific language governing permissions and limitations
022 * under the License.
023 * ====================================================================
024 *
025 * This software consists of voluntary contributions made by many
026 * individuals on behalf of the Apache Software Foundation.  For more
027 * information on the Apache Software Foundation, please see
028 * <http://www.apache.org/>.
029 *
030 */
031
032package org.apache.commons.ssl;
033
034import org.apache.commons.ssl.util.Hex;
035
036import java.util.Collections;
037import java.util.Map;
038import java.util.StringTokenizer;
039import java.util.TreeMap;
040
041/**
042 * @author Credit Union Central of British Columbia
043 * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
044 * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
045 * @since 13-Aug-2006
046 */
047public class PEMItem {
048    public final static String DEK_INFO = "dek-info";
049
050    private final byte[] derBytes;
051    public final String pemType;
052    public final Map properties;
053
054    public final String dekInfo;
055    public final byte[] iv;
056    public final String cipher;
057    public final boolean des2;
058    public final String mode;
059    public final int keySizeInBits;
060
061    public PEMItem(byte[] derBytes, String type) {
062        this(derBytes, type, null);
063    }
064
065    public PEMItem(byte[] derBytes, String type, Map properties) {
066        this.derBytes = derBytes;
067        this.pemType = type;
068        if (properties == null) {
069            properties = new TreeMap(); // empty map
070        }
071        this.properties = Collections.unmodifiableMap(properties);
072        String di = (String) properties.get(DEK_INFO);
073        String diCipher = "";
074        String diIV = "";
075        if (di != null) {
076            StringTokenizer st = new StringTokenizer(di, ",");
077            if (st.hasMoreTokens()) {
078                diCipher = st.nextToken().trim().toLowerCase();
079            }
080            if (st.hasMoreTokens()) {
081                diIV = st.nextToken().trim().toLowerCase();
082            }
083        }
084        this.dekInfo = diCipher;
085        this.iv = Hex.decode(diIV);
086        if (!"".equals(diCipher)) {
087            OpenSSL.CipherInfo cipherInfo = OpenSSL.lookup(diCipher);
088            this.cipher = cipherInfo.javaCipher;
089            this.mode = cipherInfo.blockMode;
090            this.keySizeInBits = cipherInfo.keySize;
091            this.des2 = cipherInfo.des2;
092        } else {
093            this.mode = "";
094            cipher = "UNKNOWN";
095            keySizeInBits = -1;
096            des2 = false;
097        }
098    }
099
100    public byte[] getDerBytes() {
101        byte[] b = new byte[derBytes.length];
102        System.arraycopy(derBytes, 0, b, 0, derBytes.length);
103        return b;
104    }
105
106}