org.apache.harmony.security.asn1 throwing null pointer exception
----------------------------------------------------------------

                 Key: COMMONSSITE-70
                 URL: https://issues.apache.org/jira/browse/COMMONSSITE-70
             Project: Commons All
          Issue Type: Bug
          Components: Commons Build
    Affects Versions: 19
         Environment: Android application development.
            Reporter: Srijan Basu
             Fix For: 19


I am trying to parse a .cer certificate issued by Thwate(find it attacthed).I 
am getting a null pointer exception while parsing the certificate.But I am able 
to parse other .cer certificates without any problem.

package com.ams;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.ams.certparser.CertificateParserUtil;

public class CertificateParserTestActivity extends Activity {
        /** Called when the activity is first created. */
        private static String TAG = "CertificateParserTestActivity";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                CertificateParserUtil certParserUtil = new 
CertificateParserUtil(
                                "sdcard/Thwate.cer","null");
                certParserUtil.parse(); 

        //      Log.i(TAG, "Type:" + certParserUtil.getCertType());
                Log.i(TAG, "Version:" + certParserUtil.getVersion());
                Log.i(TAG, "Basic Constraint Extensions:" + 
certParserUtil.getBasicConstraints());
                Log.i(TAG, "IssuerUniqueID:" + 
certParserUtil.getIssuerUniqueID());
                Log.i(TAG, "IssuerName:" + 
certParserUtil.getIssuerX500Principal());
                Log.i(TAG, "Public Key:"+ certParserUtil.getPublicKey());
                Log.i(TAG, "Issuer DN:" + certParserUtil.getIssuerDN());
                Log.i(TAG, "Subject:" + certParserUtil.getSubjectDN());
                Log.i(TAG, "Valid From:" + certParserUtil.getValidFrom());
                Log.i(TAG, "Valid Till:" + certParserUtil.getValidTill());
                Log.i(TAG, "Public Key:" + 
certParserUtil.getPublicKey().getAlgorithm());
                Log.i(TAG, "Serial Number:" + certParserUtil.getSerialNumber());
                Log.i(TAG, "Key:" + certParserUtil.getKeyUsage());
                Log.i(TAG, "Signature:" + certParserUtil.getSignature());
                Log.i(TAG, "SignSlgoName:" + certParserUtil.getSigAlgName());
                
                        //Log.i(TAG, "Signature:" + 
certParserUtil.getTBSCertificate());

        }
}

package com.ams.certparser;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.PublicKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.Enumeration;

import javax.security.auth.x500.X500Principal;

import android.os.Environment;
 
import android.util.Log;

public class CertificateParserUtil {

        private static final String TAG = "CertificateParserUtil";
        public static final String PFX = "PFX";
        public static final String CER = "CER";
        FileInputStream fin = null;
        private String filePath;
        private String password;
        X509Certificate cert;

        public CertificateParserUtil(String filePath, String password) {
                this.filePath = filePath;
                this.password = password;

        }

        private String getExtension() {
                String ext = "";
                int mid = filePath.lastIndexOf(".");
                ext = filePath.substring(mid + 1, filePath.length());
                return ext;
        }

        public void parse() {
                String ext = getExtension();
                File file = new File(filePath);
                if (PFX.equalsIgnoreCase(ext)) {
                        
                        KeyStore ks = null;
                        try {
                                ks = KeyStore.getInstance("PKCS12");
                                 
                                //fin = new FileInputStream(file);
                                ks.load(fin, password.toCharArray());
                                Enumeration<String> aliasesEnum = null;
                                aliasesEnum = ks.aliases();
                                while (aliasesEnum.hasMoreElements()) {
                                        String alias = (String) 
aliasesEnum.nextElement();
                                        cert = (X509Certificate) 
ks.getCertificate(alias);

                                }
                        } catch (KeyStoreException e) {
                      Log.i(TAG, "KeyStoreException:" + e.getMessage());
                        } catch (FileNotFoundException e) {
              Log.i(TAG, "FileNOTFoundException:" + e.getMessage());
                        } catch (CertificateException e) {
                                Log.i(TAG, "CertificateException:" + 
e.getMessage());
                        } catch (IOException e) {
                                Log.i(TAG, "IOException:" + e.getMessage());
                        } catch (NoSuchAlgorithmException e) {
                                Log.i(TAG, "AlgorithmException:" + 
e.getMessage());
                        } catch (Exception e) {
                                Log.i(TAG, "Exception:" + e.getMessage());

                        }

                } else if (CER.equalsIgnoreCase(ext)) {
                        try {

                                fin = new FileInputStream(file);
                                BufferedInputStream bf = new 
BufferedInputStream(fin);
                                CertificateFactory cf = null;
                                cf = CertificateFactory.getInstance("X.509");
                                while (bf.available() > 0) {
                                        cert = (X509Certificate) 
cf.generateCertificate(bf);

                                }
                        } catch (FileNotFoundException e) {
                                Log.i(TAG, "FileNOTFoundException:" + 
e.getMessage());
                        } catch (CertificateException e) {
                                Log.i(TAG, "CertificateException:" + 
e.getMessage());
                        } catch (IOException e) {
                                Log.i(TAG, "IOException:" + e.getMessage());
                        } catch (Exception e) {
                                Log.i(TAG, "Exception:" + e.getMessage());
                        }

                }

        }

        
 
        public String getCertType() {
                return cert.getType();
        }

        public int getVersion() {
                return cert.getVersion();
        }

        public int getBasicConstraints() {
                return cert.getBasicConstraints();
        }

        public boolean[] getIssuerUniqueID() {
                return cert.getIssuerUniqueID();
        }

        public X500Principal getIssuerX500Principal() {
                return cert.getIssuerX500Principal();
        }

        public PublicKey getPublicKey() {
                return cert.getPublicKey();
        }

        public Principal getIssuerDN() {
                return cert.getIssuerDN();
        }

        public Principal getSubjectDN() {
                return cert.getSubjectDN();
        }

        public Date getValidFrom() {
                return cert.getNotBefore();
        }

        public Date getValidTill() {
                return cert.getNotAfter();
        }

        public String getAlgorithm() {
                return cert.getPublicKey().getAlgorithm();
        }

        public BigInteger getSerialNumber() {
                return cert.getSerialNumber();
        }

        public boolean[] getKeyUsage() {
                return cert.getKeyUsage();
        }

        public byte[] getSignature() {
                return cert.getSignature();
        }

        public String getSigAlgName() {
                return cert.getSigAlgName();
        }

}


CertificateException:org.apache.harmony.security.asn1.ASN1Exception: ASN.1 
Sequence: mandatory value is missing at [4].

The folllowing is the stacktrace for your refrence.

03-22 12:16:30.667: W/dalvikvm(1749): threadid=1: thread exiting with uncaught 
exception (group=0x409c01f8)
03-22 12:16:30.717: E/AndroidRuntime(1749): FATAL EXCEPTION: main
03-22 12:16:30.717: E/AndroidRuntime(1749): java.lang.RuntimeException: Unable 
to start activity ComponentInfo{com.ams/com.ams.CertificateParserTestActivity}: 
java.lang.NullPointerException
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread.access$600(ActivityThread.java:123)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.os.Handler.dispatchMessage(Handler.java:99)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.os.Looper.loop(Looper.java:137)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread.main(ActivityThread.java:4424)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
java.lang.reflect.Method.invokeNative(Native Method)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
java.lang.reflect.Method.invoke(Method.java:511)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
dalvik.system.NativeStart.main(Native Method)
03-22 12:16:30.717: E/AndroidRuntime(1749): Caused by: 
java.lang.NullPointerException
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
com.ams.certparser.CertificateParserUtil.getVersion(CertificateParserUtil.java:115)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
com.ams.CertificateParserTestActivity.onCreate(CertificateParserTestActivity.java:23)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.Activity.performCreate(Activity.java:4465)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-22 12:16:30.717: E/AndroidRuntime(1749):     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-22 12:16:30.717: E/AndroidRuntime(1749):     ... 11 more


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to