Hi All

I have some query regarding the serial number of the certificate.

Actually I am trying to get the Serial number of the der encoded certificate


AOL_Member_CA.der. For the better understanding I am attaching my code


I would be very very thankful if anyone could help me out.



Regards
Bhaarat.
#include <glib.h>
#include <stdlib.h>
#include <gck/gck.h>

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>
#include <openssl/err.h>

struct x509cert_info {
	unsigned char	subject[256];
	int		subject_len;
	unsigned char	issuer[256];
	int		issuer_len;
	unsigned char	serialnum[128];
	int		serialnum_len;
};

//static int find_cert(x509cert_info *, guchar *, gsize *, unsigned char *);

#define PKCS_MODULE "/usr/local/lib/gnome-keyring/gnome-keyring-pkcs11.so"

unsigned char sn[128];
static int i;

gchar *wrt_file = NULL;
gboolean do_list_objects = FALSE;
gboolean do_obj_search = FALSE;
gchar *object_type = NULL;
GckModule *module;
GError *pError = NULL;

struct x509cert_info cert;

guchar*
test_data_read (const gchar *basename, gsize *n_result)
{
        GError *error = NULL;
        gchar *result;
        gchar *file;

  	file = g_strdup(basename);	 
        if (!g_file_get_contents (file, &result, n_result, &error)) {
                printf ("could not read test data file: %s: %s", file, error->message);
                g_assert_not_reached ();
        }
	else
	{
		printf("\nRead the file successfully\n");
	}
        g_free (file);
        return (guchar*)result;
}

static int parse_certificate(struct x509cert_info *cert,
		unsigned char *data, int len)
{
	X509 *x;
	unsigned char *p;
	const unsigned char *pp;
	int n;

	pp = data;
	x = d2i_X509(NULL, &pp, len);
	if (!x) {
		g_printerr ("OpenSSL error during X509 certificate parsing");
		return -1;
	}

	p = cert->subject;
	n = i2d_X509_NAME(x->cert_info->subject, &p);
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding subject name");
		return -1;
	}
	printf("\nThe Certificate Subject name is %s\n",p);

	if (n > (int)sizeof (cert->subject))
	{
		g_printerr("subject name too long");
		return -1;
	}

	cert->subject_len = n;

	p = cert->issuer;
	n = i2d_X509_NAME(x->cert_info->issuer, &p);
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding issuer name");
		return -1;
	}

	if (n > (int)sizeof (cert->issuer))
	{
		g_printerr("issuer name too long");
		return -1;
	}
	
	cert->issuer_len = n;

	p = cert->serialnum;
	n = i2d_ASN1_INTEGER(x->cert_info->serialNumber, &p);
	if(i==0)
	{
		g_print("\nThe certificate serial number is copied in serialnumber\n");		
		if(g_strlcpy((gchar *)sn, (const gchar *)x->cert_info->serialNumber, sizeof(sn)))
		{
			i++;
			printf("\nSerial number copied successfully %s\n",sn);
		}
	}
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding serial number");
		return -1;
	}
	if (n > (int)sizeof (cert->serialnum))
	{
		g_printerr("serial number too long");
		return -1;
	}

	cert->serialnum_len = n;

	return 0;
}

static int find_cert(struct x509cert_info *cert,
		     unsigned char *data, int len,
		     unsigned char *sn)
{
	X509 *x;
	unsigned char *p;
	const unsigned char *pp;
	int n;

	pp = data;
	x = d2i_X509(NULL, &pp, len);
	if (!x) {
		g_printerr ("OpenSSL error during X509 certificate parsing");
		return -1;
	}

	p = cert->subject;
	n = i2d_X509_NAME(x->cert_info->subject, &p);
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding subject name");
		return -1;
	}
	printf("\nThe Certificate Subject name is %s\n",(unsigned char *)x->cert_info->subject);

	if (n > (int)sizeof (cert->subject))
	{
		g_printerr("subject name too long");
		return -1;
	}

	cert->subject_len = n;

	p = cert->issuer;
	n = i2d_X509_NAME(x->cert_info->issuer, &p);
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding issuer name");
		return -1;
	}

	if (n > (int)sizeof (cert->issuer))
	{
		g_printerr("issuer name too long");
		return -1;
	}
	
	cert->issuer_len = n;

	p = cert->serialnum;
	n = i2d_ASN1_INTEGER(x->cert_info->serialNumber, &p);

	if(!(g_strcmp0((const char *)sn,(const char *)x->cert_info->serialNumber)))
	{
		g_print("\nThe certificate with serial number found\n");		
		return 1;
	}
	if (n < 0)
	{
		g_printerr("OpenSSL error while encoding serial number");
		return -1;
	}
	if (n > (int)sizeof (cert->serialnum))
	{
		g_printerr("serial number too long");
		return -1;
	}

	cert->serialnum_len = n;

	return 0;
}

int main (int argc, char *argv[])
{
	DIR             *dip;
	struct dirent   *dit;

	g_type_init ();
	module = gck_module_initialize (PKCS_MODULE, NULL, 0, &pError);

	gsize cert_len;
	guchar *cert_data = test_data_read (argv[1], &cert_len);

	if (parse_certificate (&cert, cert_data, cert_len) == -1)
    	{
        	g_print ("Faild to parse the certificate: %s\n", wrt_file);
    	}

	g_print ("Certificate Parsed successfully for SERIAL NUMBER!!\n");
	if ((dip = opendir(argv[2])) == NULL)
	{
		perror("opendir");
		return 0;
	}
	/* Traverse the directory and provide the file name to the gck module to read the data */
	while ((dit = readdir(dip)) != NULL)
	{
		printf("\n%s", dit->d_name);
		printf("\nOpening directory to read the data\n");
		int len = 0;
		guchar *data = test_data_read (dit->d_name, &cert_len);
		if(find_cert(&cert, (unsigned char *)&data, len, sn))
		{
			printf("\n The certificate found is %s\n", dit->d_name);
			return 1;
		}
	}

}

Reply via email to