/******************************************************************************* * Copyright (c) 2007 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.osgi.internal.signedcontent; import java.security.cert.Certificate; import org.eclipse.osgi.signedcontent.SignerInfo; public class SignerInfoImpl implements SignerInfo { private final Certificate[] chain; private final String mdAlgorithm; volatile private Certificate trustAnchor; public SignerInfoImpl(Certificate[] chain, Certificate trustAnchor, String mdAlgorithm) { this.chain = chain; this.trustAnchor = trustAnchor; this.mdAlgorithm = mdAlgorithm; } public Certificate[] getCertificateChain() { return chain; } public Certificate getTrustAnchor() { return trustAnchor; } public boolean isTrusted() { return trustAnchor != null; } void setTrustAnchor(Certificate trustAnchor) { this.trustAnchor = trustAnchor; } public String getMessageDigestAlgorithm() { return mdAlgorithm; } public int hashCode() { int result = mdAlgorithm.hashCode(); for (int i = 0; i < chain.length; i++) result += chain[i].hashCode(); // Note that we do not hash based on trustAnchor; // this changes dynamically but we need a constant hashCode for purposes of // hashing in a Set. return result; } public boolean equals(Object obj) { if (!(obj instanceof SignerInfo)) return false; if (obj == this) return true; SignerInfo other = (SignerInfo) obj; if (!mdAlgorithm.equals(other.getMessageDigestAlgorithm())) return false; Certificate[] otherCerts = other.getCertificateChain(); if (otherCerts.length != chain.length) return false; for (int i = 0; i < chain.length; i++) if (!chain[i].equals(otherCerts[i])) return false; return trustAnchor == null ? other.getTrustAnchor() == null : trustAnchor.equals(other.getTrustAnchor()); } }