@@ -42,16 +42,22 @@ This file is part of the iText (R) project.
4242import com .itextpdf .commons .bouncycastle .asn1 .x509 .IDistributionPointName ;
4343import com .itextpdf .commons .bouncycastle .asn1 .x509 .IGeneralName ;
4444import com .itextpdf .commons .bouncycastle .asn1 .x509 .IGeneralNames ;
45+ import com .itextpdf .commons .bouncycastle .cert .IX509CertificateHolder ;
46+ import com .itextpdf .commons .bouncycastle .cert .jcajce .IJcaX509CertificateConverter ;
4547import com .itextpdf .commons .bouncycastle .cert .ocsp .AbstractOCSPException ;
4648import com .itextpdf .commons .bouncycastle .cert .ocsp .IBasicOCSPResp ;
4749import com .itextpdf .commons .bouncycastle .cert .ocsp .ICertificateID ;
50+ import com .itextpdf .commons .bouncycastle .openssl .IPEMParser ;
4851import com .itextpdf .commons .bouncycastle .operator .AbstractOperatorCreationException ;
4952import com .itextpdf .kernel .crypto .OID ;
53+ import com .itextpdf .kernel .exceptions .PdfException ;
54+ import com .itextpdf .signatures .exceptions .SignExceptionMessageConstant ;
5055import com .itextpdf .signatures .logs .SignLogMessageConstant ;
5156
5257import java .io .ByteArrayInputStream ;
5358import java .io .IOException ;
5459import java .io .InputStream ;
60+ import java .io .InputStreamReader ;
5561import java .net .URL ;
5662import java .nio .charset .StandardCharsets ;
5763import java .security .cert .CRL ;
@@ -63,6 +69,7 @@ This file is part of the iText (R) project.
6369import java .security .cert .X509Certificate ;
6470import java .util .ArrayList ;
6571import java .util .Arrays ;
72+ import java .util .Base64 ;
6673import java .util .Collection ;
6774import java .util .Enumeration ;
6875import java .util .List ;
@@ -519,6 +526,61 @@ public static IASN1Primitive getExtensionValue(CRL crl, String oid) throws IOExc
519526 return getExtensionValueFromByteArray (SignUtils .getExtensionValueByOid (crl , oid ));
520527 }
521528
529+ /**
530+ * Reads certificate from der encoded string.
531+ *
532+ * @param encodedCertificateBytes der encoded data
533+ *
534+ * @return {@link X509Certificate} object
535+ */
536+ public static X509Certificate createCertificateFromEncodedData (String encodedCertificateBytes ) {
537+ try {
538+ byte [] bytes = Base64 .getDecoder ().decode (encodedCertificateBytes );
539+ IX509CertificateHolder certificateHolder = FACTORY .createX509CertificateHolder (bytes );
540+ return FACTORY .createJcaX509CertificateConverter ().setProvider (FACTORY .getProvider ())
541+ .getCertificate (certificateHolder );
542+ } catch (CertificateException | IOException e ) {
543+ throw new PdfException (SignExceptionMessageConstant .FAILED_TO_RETRIEVE_CERTIFICATE , e );
544+ }
545+ }
546+
547+ /**
548+ * Read all certificates from an input stream in PEM format.
549+ *
550+ * @param pemFileStream {@link InputStream} in PEM format
551+ *
552+ * @return {@link Certificate} array
553+ */
554+ public static Certificate [] readCertificatesFromPem (InputStream pemFileStream ) {
555+ try {
556+ List <IX509CertificateHolder > certificatesHolders = readCertificates (pemFileStream );
557+ IJcaX509CertificateConverter converter =
558+ FACTORY .createJcaX509CertificateConverter ().setProvider (FACTORY .getProvider ());
559+ Certificate [] certificates = new Certificate [certificatesHolders .size ()];
560+ for (int i = 0 ; i < certificatesHolders .size (); i ++) {
561+ certificates [i ] = converter .getCertificate (certificatesHolders .get (i ));
562+ }
563+ return certificates ;
564+ } catch (CertificateException | IOException e ) {
565+ throw new PdfException (SignExceptionMessageConstant .FAILED_TO_RETRIEVE_CERTIFICATE , e );
566+ }
567+ }
568+
569+ private static List <IX509CertificateHolder > readCertificates (InputStream pemFileStream ) throws IOException {
570+ try (IPEMParser parser = FACTORY .createPEMParser (
571+ new InputStreamReader (pemFileStream , StandardCharsets .UTF_8 ))) {
572+ Object readObject = parser .readObject ();
573+ List <IX509CertificateHolder > certificateHolders = new ArrayList <>();
574+ while (readObject != null ) {
575+ if (readObject instanceof IX509CertificateHolder ) {
576+ certificateHolders .add ((IX509CertificateHolder ) readObject );
577+ }
578+ readObject = parser .readObject ();
579+ }
580+ return certificateHolders ;
581+ }
582+ }
583+
522584 /**
523585 * Converts extension value represented as byte array to {@link IASN1Primitive} object.
524586 *
0 commit comments