/***** BEGIN LICENSE BLOCK *****
* Version: EPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Eclipse Public
* License Version 1.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.eclipse.org/legal/epl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2008 Ola Bini <ola.bini@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the EPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the EPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.jruby.ext.openssl.impl;
import java.math.BigInteger;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DLSequence;
import org.bouncycastle.asn1.pkcs.IssuerAndSerialNumber;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x500.X500Name;
import org.jruby.ext.openssl.x509store.Name;
import org.jruby.ext.openssl.x509store.X509AuxCertificate;
/** PKCS7_RECIP_INFO
*
* @author <a href="mailto:ola.bini@gmail.com">Ola Bini</a>
*/
public class RecipInfo {
private int version;
private IssuerAndSerialNumber issuerAndSerial;
private AlgorithmIdentifier keyEncAlgor;
private ASN1OctetString encKey;
/**
* Describe cert here.
*/
private X509AuxCertificate cert;
/** c: PKCS7_RECIP_INFO_set
*
*/
public void set(X509AuxCertificate cert) throws PKCS7Exception {
version = 0;
X500Name issuer = X500Name.getInstance(cert.getIssuerX500Principal().getEncoded());
BigInteger serial = cert.getSerialNumber();
issuerAndSerial = new IssuerAndSerialNumber(issuer, serial);
String algo = addEncryptionIfNeeded(cert.getPublicKey().getAlgorithm());
keyEncAlgor = new AlgorithmIdentifier(ASN1Registry.sym2oid(algo));
this.cert = cert;
}
private String addEncryptionIfNeeded(String input) {
input = input.toLowerCase();
if(input.equals("rsa")) {
return input + "Encryption";
} else if(input.equals("dsa")) {
return input + "Encryption";
}
return input;
}
@Override
public boolean equals(Object other) {
boolean ret = this == other;
if(!ret && (other instanceof RecipInfo)) {
RecipInfo o = (RecipInfo)other;
ret =
this.version == o.version &&
(this.issuerAndSerial == null ? o.issuerAndSerial == null : (this.issuerAndSerial.equals(o.issuerAndSerial))) &&
(this.keyEncAlgor == null ? o.keyEncAlgor == null : (this.keyEncAlgor.equals(o.keyEncAlgor))) &&
(this.encKey == null ? o.encKey == null : (this.encKey.equals(o.encKey)));
}
return ret;
}
@Override
public int hashCode() {
int result = 31;
result = result + 13 * version;
result = result + ((issuerAndSerial == null) ? 0 : 13 * issuerAndSerial.hashCode());
result = result + ((keyEncAlgor == null) ? 0 : 13 * keyEncAlgor.hashCode());
result = result + ((encKey == null) ? 0 : 13 * encKey.hashCode());
return result;
}
@Override
public String toString() {
return "#<Recipient version="+version+" issuerAndSerial=["+issuerAndSerial.getName()+","+issuerAndSerial.getCertificateSerialNumber()+"] keyEncAlgor="+ASN1Registry.o2a(keyEncAlgor.getAlgorithm())+" encKey="+encKey+">";
}
/**
* Get the <code>Version</code> value.
*
* @return an <code>int</code> value
*/
public final int getVersion() {
return version;
}
/**
* Set the <code>Version</code> value.
*
* @param newVersion The new Version value.
*/
public final void setVersion(final int newVersion) {
this.version = newVersion;
}
/**
* Get the <code>IssuerAndSerial</code> value.
*
* @return an <code>IssuerAndSerialNumber</code> value
*/
public final IssuerAndSerialNumber getIssuerAndSerial() {
return issuerAndSerial;
}
/**
* Set the <code>IssuerAndSerial</code> value.
*
* @param newIssuerAndSerial The new IssuerAndSerial value.
*/
public final void setIssuerAndSerial(final IssuerAndSerialNumber newIssuerAndSerial) {
this.issuerAndSerial = newIssuerAndSerial;
}
/**
* Get the <code>KeyEncAlgor</code> value.
*
* @return an <code>AlgorithmIdentifier</code> value
*/
public final AlgorithmIdentifier getKeyEncAlgor() {
return keyEncAlgor;
}
/**
* Set the <code>KeyEncAlgor</code> value.
*
* @param newKeyEncAlgor The new KeyEncAlgor value.
*/
public final void setKeyEncAlgor(final AlgorithmIdentifier newKeyEncAlgor) {
this.keyEncAlgor = newKeyEncAlgor;
}
/**
* Get the <code>EncKey</code> value.
*
* @return an <code>ASN1OctetString</code> value
*/
public final ASN1OctetString getEncKey() {
return encKey;
}
/**
* Set the <code>EncKey</code> value.
*
* @param newEncKey The new EncKey value.
*/
public final void setEncKey(final ASN1OctetString newEncKey) {
this.encKey = newEncKey;
}
/**
* Get the <code>Cert</code> value.
*
* @return a <code>X509AuxCertificate</code> value
*/
public final X509AuxCertificate getCert() {
return cert;
}
/**
* Set the <code>Cert</code> value.
*
* @param newCert The new Cert value.
*/
public final void setCert(final X509AuxCertificate newCert) {
this.cert = newCert;
}
/* c: static pkcs7_cmp_ri
*
*/
public boolean compare(final X509AuxCertificate other) {
if ( ! new Name( issuerAndSerial.getName() ).equalTo( other.getIssuerX500Principal() ) ) {
return false;
}
return other.getSerialNumber().compareTo( issuerAndSerial.getCertificateSerialNumber().getValue() ) == 0;
}
/**
* RecipientInfo ::= SEQUENCE {
* version Version,
* issuerAndSerialNumber IssuerAndSerialNumber,
* keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
* encryptedKey EncryptedKey }
*
* EncryptedKey ::= OCTET STRING
*/
public static RecipInfo fromASN1(ASN1Encodable content) {
ASN1Sequence sequence = (ASN1Sequence)content;
RecipInfo ri = new RecipInfo();
ri.setVersion( ( (ASN1Integer) sequence.getObjectAt(0) ).getValue().intValue() );
ri.setIssuerAndSerial( IssuerAndSerialNumber.getInstance( sequence.getObjectAt(1) ) );
ri.setKeyEncAlgor( AlgorithmIdentifier.getInstance( sequence.getObjectAt(2) ) );
ri.setEncKey( (ASN1OctetString) sequence.getObjectAt(3) );
return ri;
}
public ASN1Encodable asASN1() {
ASN1EncodableVector vector = new ASN1EncodableVector();
vector.add( new ASN1Integer( BigInteger.valueOf(getVersion()) ) );
vector.add( issuerAndSerial.toASN1Primitive() );
vector.add( keyEncAlgor.toASN1Primitive() );
vector.add( encKey.toASN1Primitive() );
return new DLSequence(vector);
}
}// RecipInfo