Package org.nimbustools.auto_common.ezpz_ca

Source Code of org.nimbustools.auto_common.ezpz_ca.CertFilenameHash

/*
* Copyright 1999-2009 University of Chicago
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/

package org.nimbustools.auto_common.ezpz_ca;

import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.security.auth.x500.X500Principal;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Principal;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class CertFilenameHash {

  private MessageDigest md5 = null;

  public CertFilenameHash() throws NoSuchAlgorithmException {
    this.md5 = MessageDigest.getInstance("MD5");
    Security.addProvider(new BouncyCastleProvider());
  }

  /**
  * Returns equivalent of:
  * openssl x509 -in "cert-file" -hash -noout
  *
  * @param subjectDN dn object
  * @return hash for certificate names
  * @throws java.io.IOException issue
  */
  public String nameHash(Principal subjectDN) throws IOException {
    return hash(encodePrincipal(subjectDN));
  }

  public static byte[] encodePrincipal(Principal subject) throws IOException {
    if (subject instanceof X500Principal) {
      return ((X500Principal) subject).getEncoded();
    } else if (subject instanceof X509Name) {
      final ByteArrayOutputStream bout = new ByteArrayOutputStream();
      final DEROutputStream der = new DEROutputStream(bout);
      final DEREncodable nm = (DEREncodable) subject;
      der.writeObject(nm.getDERObject());
      return bout.toByteArray();
    } else {
      throw new ClassCastException("unsupported input class: "
          + subject.getClass().toString());
    }
  }

  private String hash(byte[] data) {

    this.md5.reset();
    this.md5.update(data);

    final byte[] md = this.md5.digest();

    final long ret = (fixByte(md[0]) | (fixByte(md[1]) << 8L) |
        fixByte(md[2]) << 16L | fixByte(md[3]) << 24L) & 0xffffffffL;

    return Long.toHexString(ret);
  }

  private static long fixByte(byte b) {
    return (b < 0) ? (long) (b + 256) : (long) b;
  }

  public String hashFromPath(String existingFile)
      throws IOException, CertificateException, NoSuchProviderException {

    final File certFile = new File(existingFile);
        if (!certFile.canRead()) {
            final String msg = "File '" + existingFile + "' can not be read.";
            throw new IOException(msg);
        }

    final FileReader fr = new FileReader(certFile);
    try {
      final PEMReader reader =
          new PEMReader(fr, null, BouncyCastleProvider.PROVIDER_NAME);
      try {
        final X509Certificate cert = (X509Certificate) reader.readObject();
        return this.nameHash(cert.getSubjectDN());
      } finally {
        reader.close();
      }
    } finally {
      fr.close();
    }
  }


    // -------------------------------------------------------------------------
    // MAIN
    // -------------------------------------------------------------------------

    public static void main(String[] args) {

        if (args == null || args.length != 1) {
            System.err.println("Needs these arguments:\n" +
                    "1 - the cert file you want hashed name of");
            System.exit(1);
        }

        try {
            final String newhex = new CertFilenameHash().hashFromPath(args[0]);
      System.out.println(newhex);
        } catch (Exception e) {
            System.err.println("Problem: " + e.getMessage());
      e.printStackTrace();
            System.exit(1);
        }
    }
}
TOP

Related Classes of org.nimbustools.auto_common.ezpz_ca.CertFilenameHash

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.