blob: d8c3b9ebcf100b5b89b094b44279f12a42deb9eb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.internal.verifier;
import java.security.Principal;
import java.security.cert.*;
import java.text.DateFormat;
import java.util.Date;
import org.eclipse.osgi.signedcontent.SignedContent;
import org.eclipse.osgi.signedcontent.SignerInfo;
import org.eclipse.osgi.util.NLS;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.core.Messages;
/**
* Result of the service
*/
public class CertVerificationResult implements IVerificationResult {
private int resultCode;
private int verificationCode;
private Exception resultException;
private SignedContent signedContent;
private String signerInfo;
private String verifierInfo;
private ContentReference contentReference;
private IFeature feature;
private boolean featureVerification;
private boolean alreadySeen;
public CertVerificationResult() {
}
/*
*
*/
public int getResultCode() {
return resultCode;
}
/*
*
*/
public Exception getVerificationException() {
return resultException;
}
/*
*
*/
public void setResultCode(int newResultCode) {
resultCode = newResultCode;
}
/*
*
*/
public void setResultException(Exception newResultException) {
resultException = newResultException;
}
/*
*
*/
public int getVerificationCode() {
return verificationCode;
}
/*
*
*/
public void setVerificationCode(int verificationCode) {
this.verificationCode = verificationCode;
}
void setSignedContent(SignedContent signedContent) {
this.signedContent = signedContent;
}
public SignerInfo[] getSigners() {
return signedContent.getSignerInfos();
}
/*
* Initializes the signerInfo and the VerifierInfo from the Certificate Pair
*/
private void initializeCertificates(){
X509Certificate certRoot = null;
X509Certificate certIssuer = null;
SignerInfo trustedSigner;
SignerInfo[] signers = getSigners();
if (signers.length == 0)
return;
trustedSigner = signers[0];
for (int i = 0; i < signers.length; i++) {
if (signers[i].isTrusted()) {
trustedSigner = signers[i];
break;
}
}
Certificate[] certs = trustedSigner.getCertificateChain();
if (certs == null || certs.length == 0)
return;
certRoot = (X509Certificate) certs[certs.length - 1];
certIssuer = (X509Certificate) certs[0];
StringBuffer strb = new StringBuffer();
strb.append(issuerString(certIssuer.getSubjectDN()));
strb.append("\r\n"); //$NON-NLS-1$
strb.append(NLS.bind(Messages.JarVerificationResult_ValidBetween, (new String[] { dateString(certIssuer.getNotBefore()), dateString(certIssuer.getNotAfter()) })));
strb.append(checkValidity(trustedSigner));
signerInfo = strb.toString();
if (certIssuer != null && !certIssuer.equals(certRoot)) {
strb = new StringBuffer();
strb.append(issuerString(certIssuer.getIssuerDN()));
strb.append("\r\n"); //$NON-NLS-1$
strb.append(NLS.bind(Messages.JarVerificationResult_ValidBetween, (new String[] { dateString(certRoot.getNotBefore()), dateString(certRoot.getNotAfter()) })));
verifierInfo = strb.toString();
}
}
/*
* Returns a String to show if the certificate is valid
*/
private String checkValidity(SignerInfo signer) {
try {
signedContent.checkValidity(signer);
} catch (CertificateExpiredException e) {
return ("\r\n" + Messages.JarVerificationResult_ExpiredCertificate); //$NON-NLS-1$
} catch (CertificateNotYetValidException e) {
return ("\r\n" + Messages.JarVerificationResult_CertificateNotYetValid); //$NON-NLS-1$
}
return ("\r\n" + Messages.JarVerificationResult_CertificateValid); //$NON-NLS-1$
}
/*
* Returns the label String from a X50name
*/
private String issuerString(Principal principal) {
// 19902
// try {
// if (principal instanceof X500Name) {
// StringBuffer buf = new StringBuffer();
// X500Name name = (X500Name) principal;
// buf.append((name.getDNQualifier() != null) ? name.getDNQualifier() + ", " : "");
// buf.append(name.getCommonName());
// buf.append((name.getOrganizationalUnit() != null) ? ", " + name.getOrganizationalUnit() : "");
// buf.append((name.getOrganization() != null) ? ", " + name.getOrganization() : "");
// buf.append((name.getLocality() != null) ? ", " + name.getLocality() : "");
// buf.append((name.getCountry() != null) ? ", " + name.getCountry() : "");
// return new String(buf);
// }
// } catch (Exception e) {
// UpdateCore.warn("Error parsing X500 Certificate",e);
// }
return principal.toString();
}
/*
*
*/
private String dateString(Date date) {
return DateFormat.getDateInstance().format(date);
}
/*
*
*/
public String getSignerInfo() {
if (signerInfo==null) initializeCertificates();
return signerInfo;
}
/*
*
*/
public String getVerifierInfo() {
if (signerInfo==null) initializeCertificates();
return verifierInfo;
}
/*
*
*/
public ContentReference getContentReference() {
return contentReference;
}
/*
*
*/
public void setContentReference(ContentReference ref) {
this.contentReference = ref;
}
/*
*
*/
public IFeature getFeature() {
return feature;
}
/*
*
*/
public void setFeature(IFeature feature) {
this.feature = feature;
}
/*
*
*/
public String getText() {
return null;
}
/*
*
*/
public boolean isFeatureVerification() {
return featureVerification;
}
/*
*
*/
public void isFeatureVerification(boolean featureVerification) {
this.featureVerification = featureVerification;
}
/*
*
*/
public boolean alreadySeen() {
return alreadySeen;
}
/*
*
*/
public boolean alreadySeen(boolean seen) {
return this.alreadySeen = seen;
}
}