/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * 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.icepdf.core.pobjects.acroform.signature; import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers; import org.bouncycastle.asn1.nist.NISTObjectIdentifiers; import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers; import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers; import org.bouncycastle.asn1.x509.X509ObjectIdentifiers; import org.bouncycastle.asn1.x9.X9ObjectIdentifiers; import org.bouncycastle.cms.CMSSignedDataGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.util.HashMap; /** * Utility method for mapping the hard to read DigestAlgorithmIdentifier to the more descriptive layman form. */ public class AlgorithmIdentifier { private static final HashMap<String, String> encryptionAlgorithms = new HashMap<String, String>(); private static final HashMap<String, String> digestAlgorithms = new HashMap<String, String>(); static { // common encryption numbers/names used in PDF encryptionAlgorithms.put(X9ObjectIdentifiers.id_dsa_with_sha1.getId(), "DSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.id_dsa.getId(), "DSA"); encryptionAlgorithms.put(OIWObjectIdentifiers.dsaWithSHA1.getId(), "DSA"); encryptionAlgorithms.put(PKCSObjectIdentifiers.rsaEncryption.getId(), "RSA"); encryptionAlgorithms.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "RSA"); encryptionAlgorithms.put(TeleTrusTObjectIdentifiers.teleTrusTRSAsignatureAlgorithm.getId(), "RSA"); encryptionAlgorithms.put(X509ObjectIdentifiers.id_ea_rsa.getId(), "RSA"); encryptionAlgorithms.put(CMSSignedDataGenerator.ENCRYPTION_ECDSA, "ECDSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.ecdsa_with_SHA2.getId(), "ECDSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.ecdsa_with_SHA224.getId(), "ECDSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.ecdsa_with_SHA256.getId(), "ECDSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.ecdsa_with_SHA384.getId(), "ECDSA"); encryptionAlgorithms.put(X9ObjectIdentifiers.ecdsa_with_SHA512.getId(), "ECDSA"); encryptionAlgorithms.put(CMSSignedDataGenerator.ENCRYPTION_RSA_PSS, "RSAandMGF1"); encryptionAlgorithms.put(CryptoProObjectIdentifiers.gostR3410_94.getId(), "GOST3410"); encryptionAlgorithms.put(CryptoProObjectIdentifiers.gostR3410_2001.getId(), "ECGOST3410"); encryptionAlgorithms.put("1.3.6.1.4.1.5849.1.6.2", "ECGOST3410"); encryptionAlgorithms.put("1.3.6.1.4.1.5849.1.1.5", "GOST3410"); encryptionAlgorithms.put("1.2.840.113549.1.1.11", "RSA"); // common digest numbesr/names used in PDF. digestAlgorithms.put(PKCSObjectIdentifiers.md5.getId(), "MD5"); digestAlgorithms.put(OIWObjectIdentifiers.idSHA1.getId(), "SHA1"); digestAlgorithms.put(NISTObjectIdentifiers.id_sha224.getId(), "SHA224"); digestAlgorithms.put(NISTObjectIdentifiers.id_sha256.getId(), "SHA256"); digestAlgorithms.put(NISTObjectIdentifiers.id_sha384.getId(), "SHA384"); digestAlgorithms.put(NISTObjectIdentifiers.id_sha512.getId(), "SHA512"); digestAlgorithms.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "SHA1"); digestAlgorithms.put(PKCSObjectIdentifiers.sha224WithRSAEncryption.getId(), "SHA224"); digestAlgorithms.put(PKCSObjectIdentifiers.sha256WithRSAEncryption.getId(), "SHA256"); digestAlgorithms.put(PKCSObjectIdentifiers.sha384WithRSAEncryption.getId(), "SHA384"); digestAlgorithms.put(PKCSObjectIdentifiers.sha512WithRSAEncryption.getId(), "SHA512"); digestAlgorithms.put(TeleTrusTObjectIdentifiers.ripemd128.getId(), "RIPEMD128"); digestAlgorithms.put(TeleTrusTObjectIdentifiers.ripemd160.getId(), "RIPEMD160"); digestAlgorithms.put(TeleTrusTObjectIdentifiers.ripemd256.getId(), "RIPEMD256"); digestAlgorithms.put(CryptoProObjectIdentifiers.gostR3411.getId(), "GOST3411"); digestAlgorithms.put("1.3.6.1.4.1.5849.1.2.1", "GOST3411"); } /** * Gets an instance of a MessageDigest for the given algorithm and provider. * * @param algorithm algorithm reference number as a string. * @param provider provider, optional, can be null. * @return message digest * @throws NoSuchProviderException provider could not be found associated with a MD. * @throws NoSuchAlgorithmException algorithm could not be found associated with a MD. */ public static MessageDigest getDigestInstance(String algorithm, String provider) throws NoSuchProviderException, NoSuchAlgorithmException { if (provider != null) { try { return MessageDigest.getInstance(algorithm, provider); } catch (NoSuchAlgorithmException e) { return MessageDigest.getInstance(algorithm); } catch (NoSuchProviderException e) { return MessageDigest.getInstance(algorithm); } } else { return MessageDigest.getInstance(algorithm); } } /** * Gets the encryption algorithm name for the specified encryption object ID. * * @param encryptionAlgorithmOID object id to reference. * @return algorithm name in layman form. */ public static String getEncryptionAlgorithmName(String encryptionAlgorithmOID) { String algName = encryptionAlgorithms.get(encryptionAlgorithmOID); if (algName != null) { return algName; } return encryptionAlgorithmOID; } /** * Get the digest algorithm name for the given object ID. * * @param digestAlgorithmOID OID of the digest. * @return algorithm name in layman form. */ public static String getDigestAlgorithmName(String digestAlgorithmOID) { String name = digestAlgorithms.get(digestAlgorithmOID); if (name != null) { return name; } return digestAlgorithmOID; } }