⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdfpkcs7.java

📁 源码包含生成 PDF 和 HTML 的类库
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    /**     * Generates a signature.     * @param privKey the private key     * @param certChain the certificate chain     * @param crlList the certificate revocation list     * @param hashAlgorithm the hash algorithm     * @param provider the provider or <code>null</code> for the default provider     * @param hasRSAdata <CODE>true</CODE> if the sub-filter is adbe.pkcs7.sha1     * @throws InvalidKeyException on error     * @throws NoSuchProviderException on error     * @throws NoSuchAlgorithmException on error     */        public PdfPKCS7(PrivateKey privKey, Certificate[] certChain, CRL[] crlList,                    String hashAlgorithm, String provider, boolean hasRSAdata)      throws InvalidKeyException, NoSuchProviderException,      NoSuchAlgorithmException    {        this.privKey = privKey;                if (hashAlgorithm.equals("MD5")) {            digestAlgorithm = ID_MD5;        }        else if (hashAlgorithm.equals("MD2")) {            digestAlgorithm = ID_MD2;        }        else if (hashAlgorithm.equals("SHA")) {            digestAlgorithm = ID_SHA1;        }        else if (hashAlgorithm.equals("SHA1")) {            digestAlgorithm = ID_SHA1;        }        else {            throw new NoSuchAlgorithmException("Unknown Hash Algorithm "+hashAlgorithm);        }                version = signerversion = 1;        certs = new ArrayList();        crls = new ArrayList();        digestalgos = new HashSet();        digestalgos.add(digestAlgorithm);                //        // Copy in the certificates and crls used to sign the private key.        //        signCert = (X509Certificate)certChain[0];        for (int i = 0;i < certChain.length;i++) {            certs.add(certChain[i]);        }                if (crlList != null) {            for (int i = 0;i < crlList.length;i++) {                crls.add(crlList[i]);            }        }                if (privKey != null) {            //            // Now we have private key, find out what the digestEncryptionAlgorithm is.            //            digestEncryptionAlgorithm = privKey.getAlgorithm();            if (digestEncryptionAlgorithm.equals("RSA")) {                digestEncryptionAlgorithm = ID_RSA;            }            else if (digestEncryptionAlgorithm.equals("DSA")) {                digestEncryptionAlgorithm = ID_DSA;            }            else {                throw new NoSuchAlgorithmException("Unknown Key Algorithm "+digestEncryptionAlgorithm);            }        }        if (hasRSAdata) {            RSAdata = new byte[0];            if (provider == null || provider.startsWith("SunPKCS11"))                messageDigest = MessageDigest.getInstance(getHashAlgorithm());            else                messageDigest = MessageDigest.getInstance(getHashAlgorithm(), provider);        }        if (privKey != null) {            if (provider == null)                sig = Signature.getInstance(getDigestAlgorithm());            else                sig = Signature.getInstance(getDigestAlgorithm(), provider);            sig.initSign(privKey);        }    }    /**     * Update the digest with the specified bytes. This method is used both for signing and verifying     * @param buf the data buffer     * @param off the offset in the data buffer     * @param len the data length     * @throws SignatureException on error     */    public void update(byte[] buf, int off, int len) throws SignatureException {        if (RSAdata != null || digestAttr != null)            messageDigest.update(buf, off, len);        else            sig.update(buf, off, len);    }        /**     * Verify the digest.     * @throws SignatureException on error     * @return <CODE>true</CODE> if the signature checks out, <CODE>false</CODE> otherwise     */    public boolean verify() throws SignatureException {        if (verified)            return verifyResult;        if (sigAttr != null) {            sig.update(sigAttr);            if (RSAdata != null) {                byte msd[] = messageDigest.digest();                messageDigest.update(msd);            }            verifyResult = (Arrays.equals(messageDigest.digest(), digestAttr) && sig.verify(digest));        }        else {            if (RSAdata != null)                sig.update(messageDigest.digest());            verifyResult = sig.verify(digest);        }        verified = true;        return verifyResult;    }        /**     * Get the X.509 certificates associated with this PKCS#7 object     * @return the X.509 certificates associated with this PKCS#7 object     */    public Certificate[] getCertificates() {        return (X509Certificate[])certs.toArray(new X509Certificate[certs.size()]);    }        /**     * Get the X.509 certificate revocation lists associated with this PKCS#7 object     * @return the X.509 certificate revocation lists associated with this PKCS#7 object     */    public Collection getCRLs() {        return crls;    }        /**     * Get the X.509 certificate actually used to sign the digest.     * @return the X.509 certificate actually used to sign the digest     */    public X509Certificate getSigningCertificate() {        return signCert;    }        /**     * Get the version of the PKCS#7 object. Always 1     * @return the version of the PKCS#7 object. Always 1     */    public int getVersion() {        return version;    }        /**     * Get the version of the PKCS#7 "SignerInfo" object. Always 1     * @return the version of the PKCS#7 "SignerInfo" object. Always 1     */    public int getSigningInfoVersion() {        return signerversion;    }        /**     * Get the algorithm used to calculate the message digest     * @return the algorithm used to calculate the message digest     */    public String getDigestAlgorithm() {        String dea = digestEncryptionAlgorithm;                if (digestEncryptionAlgorithm.equals(ID_RSA) || digestEncryptionAlgorithm.equals(ID_MD5RSA)            || digestEncryptionAlgorithm.equals(ID_MD2RSA) || digestEncryptionAlgorithm.equals(ID_SHA1RSA)) {            dea = "RSA";        }        else if (digestEncryptionAlgorithm.equals(ID_DSA)) {            dea = "DSA";        }                return getHashAlgorithm() + "with" + dea;    }    /**     * Returns the algorithm.     * @return the digest algorithm     */    public String getHashAlgorithm() {        String da = digestAlgorithm;                if (digestAlgorithm.equals(ID_MD5) || digestAlgorithm.equals(ID_MD5RSA)) {            da = "MD5";        }        else if (digestAlgorithm.equals(ID_MD2) || digestAlgorithm.equals(ID_MD2RSA)) {            da = "MD2";        }        else if (digestAlgorithm.equals(ID_SHA1) || digestAlgorithm.equals(ID_SHA1RSA)) {            da = "SHA1";        }        return da;    }    /**     * Loads the default root certificates at &lt;java.home&gt;/lib/security/cacerts     * with the default provider.     * @return a <CODE>KeyStore</CODE>     */        public static KeyStore loadCacertsKeyStore() {        return loadCacertsKeyStore(null);    }    /**     * Loads the default root certificates at &lt;java.home&gt;/lib/security/cacerts.     * @param provider the provider or <code>null</code> for the default provider     * @return a <CODE>KeyStore</CODE>     */        public static KeyStore loadCacertsKeyStore(String provider) {        File file = new File(System.getProperty("java.home"), "lib");        file = new File(file, "security");        file = new File(file, "cacerts");        FileInputStream fin = null;        try {            fin = new FileInputStream(file);            KeyStore k;            if (provider == null)                k = KeyStore.getInstance("JKS");            else                k = KeyStore.getInstance("JKS", provider);            k.load(fin, null);            return k;        }        catch (Exception e) {            throw new ExceptionConverter(e);        }        finally {            try{if (fin != null) {fin.close();}}catch(Exception ex){}        }    }        /**     * Verifies a single certificate.     * @param cert the certificate to verify     * @param crls the certificate revocation list or <CODE>null</CODE>     * @param calendar the date or <CODE>null</CODE> for the current date     * @return a <CODE>String</CODE> with the error description or <CODE>null</CODE>     * if no error     */        public static String verifyCertificate(X509Certificate cert, Collection crls, Calendar calendar) {        if (calendar == null)            calendar = new GregorianCalendar();        if (cert.hasUnsupportedCriticalExtension())            return "Has unsupported critical extension";        try {            cert.checkValidity(calendar.getTime());        }        catch (Exception e) {            return e.getMessage();        }        if (crls != null) {            for (Iterator it = crls.iterator(); it.hasNext();) {                if (((CRL)it.next()).isRevoked(cert))                    return "Certificate revoked";            }        }        return null;    }        /**     * Verifies a certificate chain against a KeyStore.     * @param certs the certificate chain     * @param keystore the <CODE>KeyStore</CODE>     * @param crls the certificate revocation list or <CODE>null</CODE>     * @param calendar the date or <CODE>null</CODE> for the current date     * @return <CODE>null</CODE> if the certificate chain could be validated or a     * <CODE>Object[]{cert,error}</CODE> where <CODE>cert</CODE> is the     * failed certificate and <CODE>error</CODE> is the error message     */        public static Object[] verifyCertificates(Certificate certs[], KeyStore keystore, Collection crls, Calendar calendar) {        if (calendar == null)            calendar = new GregorianCalendar();        for (int k = 0; k < certs.length; ++k) {            X509Certificate cert = (X509Certificate)certs[k];            String err = verifyCertificate(cert, crls, calendar);            if (err != null)                return new Object[]{cert, err};            try {                for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {                    try {                        String alias = (String)aliases.nextElement();                        if (!keystore.isCertificateEntry(alias))                            continue;                        X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);                        if (verifyCertificate(certStoreX509, crls, calendar) != null)                            continue;                        try {                            cert.verify(certStoreX509.getPublicKey());                            return null;                        }                        catch (Exception e) {                            continue;                        }                    }                    catch (Exception ex) {                    }                }            }            catch (Exception e) {            }            int j;            for (j = 0; j < certs.length; ++j) {                if (j == k)                    continue;                X509Certificate certNext = (X509Certificate)certs[j];                try {                    cert.verify(certNext.getPublicKey());                    break;                }                catch (Exception e) {                }            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -