[Webfunds-commits] java/webfunds/openpgp/cert SimpleOpenPGPCertificate.java SimpleOpenPGPCertificateFactorySpi.java

Edwin Woudt edwin@cypherpunks.ai
Mon, 7 Aug 2000 14:38:01 -0400 (AST)


edwin       00/08/07 14:38:01

  Added:       webfunds/openpgp/cert SimpleOpenPGPCertificate.java
                        SimpleOpenPGPCertificateFactorySpi.java
  Log:
  Initial implementation of OpenPGP certificate classes.

Revision  Changes    Path
1.1                  java/webfunds/openpgp/cert/SimpleOpenPGPCertificate.java

Index: SimpleOpenPGPCertificate.java
===================================================================
/* $Id: SimpleOpenPGPCertificate.java,v 1.1 2000/08/07 18:38:00 edwin Exp $
 *
 * Copyright (c) Systemics Ltd 2000 on behalf of
 * the WebFunds Development Team.  All Rights Reserved.
 */
package webfunds.openpgp.cert;


// cryptix openpgp classes and exceptions
import cryptix.openpgp.PGPFatalDataFormatException;
import cryptix.openpgp.PGPPublicKey;
import cryptix.openpgp.PGPKeyFactory;
import cryptix.openpgp.PGPUserID;


// java.security interfaces 
import java.security.PublicKey;
import java.security.cert.Certificate;


// java.security exceptions
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;

import java.security.cert.CertificateException;
import java.security.cert.CertificateEncodingException;


// other java.* classes and exceptions
import java.io.InputStream;
import java.io.IOException;

import java.util.Vector;


/**
 * Simple OpenPGP Certificate class.
 * 
 * <p>Warning: this class is a hack, which will most likely disappear in favour
 * of a proper implementation.</p>
 */

public class SimpleOpenPGPCertificate extends Certificate { 


// Instance variables
//.............................................................................


    /** The public key contained in this certificate */
    private PGPPublicKey key;



// Constructor
//.............................................................................


    /**
     * Constructor that reads a certificate from an InputStream
     *
     * @param in the inputstream that contains an OpenPGP key
     *
     * @throws IOException if the inputstream throws it
     * @throws CertificateException if multiple keys are found or if a fatal
     *         problem is found in the data (a PGPFatalDataFormatException).
     */
    /* package */ SimpleOpenPGPCertificate(InputStream in)
        throws IOException, CertificateException
    {
        
        super("OpenPGP"); // Certificate type
        
        PGPKeyFactory factory = new PGPKeyFactory();

        Vector keys;
        try {
            keys = factory.decodeKeys(in);
        } catch (PGPFatalDataFormatException fdfe) {
            throw new CertificateException("Invalid OpenPGP key - "+fdfe);
        }
        
        if (keys.size() > 1) {
            throw new CertificateException("Multiple keys found.");
        }
        
        if (keys.size() == 0) {
            throw new CertificateException("No key found.");
        }
        
        key = (PGPPublicKey)keys.elementAt(0);
        
    }
    
    

// Implemented abstract methods
//.............................................................................


    /**
     * Verify that this certificate was signed with the given key
     *
     * <p>In case of multiple userID's, this method only succeeds if all
     * userID's are signed using the given key.</p>
     *
     * @param key the key to use for verification
     *
     * @throws CertificateException if the certificate contains an invalid
     *         signature.
     * @throws NoSuchAlgorithmException this method does currently not throw
     *         this exception (a runtime exception is thrown instead if an
     *         algorithm is not found), but it may do so in the future.
     * @throws InvalidKeyException is the given public key is not a 
     *         cryptix.openpgp.PGPPublicKey
     * @throws NoSuchProviderException this method does not throw this 
     *         exception.
     * @throws SignatureException if the verification fails.
     */
    public void verify(PublicKey key)
        throws CertificateException, NoSuchAlgorithmException,
               InvalidKeyException, NoSuchProviderException, SignatureException
    {
    
        if (! (key instanceof PGPPublicKey)) {
            throw new InvalidKeyException("Key not of type: PGPPublicKey.");
        }
        
        boolean result = true;

        Vector userids = ((PGPPublicKey)key).getUserIDs();
        
        for (int i=0; i<userids.size(); i++) {
            PGPUserID userid = (PGPUserID)userids.elementAt(i);
            try {
                result &= userid.isSignedBy((PGPPublicKey)key);
            } catch (PGPFatalDataFormatException fdfe) {
                throw new CertificateException("Invalid signature - "+fdfe);
            }
        }
        
        if (! result) {
            throw new SignatureException("Not all userIDs are signed with "+
                                         "the given key.");
        }
        
    }


    /**
     * Braindamaged unsupported method
     *
     * <p>Multiple OpenPGP providers, yeah right!</p>
     */
    public void verify(PublicKey key, String sigProvider)
        throws CertificateException, NoSuchAlgorithmException,
               InvalidKeyException, NoSuchProviderException, SignatureException
    {
    
        throw new RuntimeException(
            "Brain damaged method signature. Not implemented.");
        
    }


    /**
     * Returns the encoded publickey
     *
     * <p>This class uses the binary OpenPGP representation of it's public
     * key</p>
     *
     * @return the binary encoded representation of the contained OpenPGP
     *         public key.
     *
     * @throws CertificateEncodingException this method does not throw this
     *         exception.
     */
    public byte[] getEncoded() throws CertificateEncodingException {
    
        return key.getEncoded();
        
    }
    
    
    /**
     * Return the public key that is contained in this certificate
     *
     * <p>This always returns a cryptix.openpgp.PGPPublicKey</p>
     */
    public PublicKey getPublicKey() {

        return key;

    }


    /**
     * Returns a human-readable string that is descriptive for this certificate.
     *
     * <p>For a certificate with one userID, this simply returns the userID.
     * For multiple userID's, all userID's are concatenated in a special way.
     * </p>
     */
    public String toString() {

        String result = "";

        Vector userids = key.getUserIDs();

        for (int i=0; i<userids.size(); i++) {
            PGPUserID userid = (PGPUserID)userids.elementAt(i);
            if (i>0) result += " + ";
            result += userid.getValue();
        }
        
        return result;

    }


}



1.1                  java/webfunds/openpgp/cert/SimpleOpenPGPCertificateFactorySpi.java

Index: SimpleOpenPGPCertificateFactorySpi.java
===================================================================
/* $Id: SimpleOpenPGPCertificateFactorySpi.java,v 1.1 2000/08/07 18:38:00 edwin Exp $
 *
 * Copyright (c) Systemics Ltd 2000 on behalf of
 * the WebFunds Development Team.  All Rights Reserved.
 */
package webfunds.openpgp.cert;


import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactorySpi;
import java.security.cert.CRL;
import java.security.cert.CRLException;

import java.io.InputStream;
import java.io.IOException;

import java.util.Collection;


/**
 * Simple OpenPGP Certificate class.
 * 
 * <p>Warning: this class is a hack, which will most likely disappear in favour
 * of a proper implementation.</p>
 */

public class SimpleOpenPGPCertificateFactorySpi extends CertificateFactorySpi { 


// Constructor
//.............................................................................


    /**
     * Empty constructor
     */
    public SimpleOpenPGPCertificateFactorySpi() {}
    
    

// Implemented abstract methods
//.............................................................................


    /**
     * Decode an OpenPGP certificate
     *
     * <p>Note that this method only works if exactly one certificate is 
     * present.</p>
     * <p>The certificate has to be binary encoded. If an application wants to
     * parse a base64 armoured key then the data has to be unarmoured first.</p>
     *
     * @param inStream the stream to read the certificate from
     * @return the certificate read
     * @throws CertificateException if an error occured while parsing the
     *         key or if an IOException is thrown while reading from inStream.
     */
    public Certificate engineGenerateCertificate(InputStream inStream)
        throws CertificateException
    {

        try {
            return new SimpleOpenPGPCertificate(inStream);
        } catch (IOException ioe) {
            throw new CertificateException("IOException on parsing key - "+ioe);
        }

    }


    /** Unsupported method */
    public Collection engineGenerateCertificates(InputStream inStream)
        throws CertificateException
    {
        throw new RuntimeException("Not implemented, bugger off");
    }


    /** Unsupported method */
    public CRL engineGenerateCRL(InputStream inStream)
        throws CRLException
    {
        throw new RuntimeException("Not implemented, bugger off");
    }
    
    
    /** Unsupported method */
    public Collection engineGenerateCRLs(InputStream inStream)
        throws CRLException
    {
        throw new RuntimeException("Not implemented, bugger off");
    }                                  
    

}