From 1014e9577583dfd53494b338d8527e5722f7adba Mon Sep 17 00:00:00 2001
From: Paul Bakker
Date: Mon, 9 Sep 2013 13:59:42 +0200
Subject: [PATCH] Use issuer_name from the issuer_certificate in cert_write app
---
programs/x509/cert_write.c | 62 +++++++++++++++++++++++++++++++++++++-
1 file changed, 61 insertions(+), 1 deletion(-)
diff --git a/programs/x509/cert_write.c b/programs/x509/cert_write.c
index dc9f00a99..9c3766c93 100644
--- a/programs/x509/cert_write.c
+++ b/programs/x509/cert_write.c
@@ -53,6 +53,7 @@ int main( int argc, char *argv[] )
}
#else
+#define DFL_ISSUER_CRT ""
#define DFL_SUBJECT_KEY "subject.key"
#define DFL_ISSUER_KEY "ca.key"
#define DFL_SUBJECT_PWD ""
@@ -73,6 +74,7 @@ int main( int argc, char *argv[] )
*/
struct options
{
+ char *issuer_crt; /* filename of the issuer certificate */
char *subject_key; /* filename of the subject key file */
char *issuer_key; /* filename of the issuer key file */
char *subject_pwd; /* password for the subject key file */
@@ -118,6 +120,9 @@ int write_certificate( x509write_cert *crt, char *output_file )
"\n acceptable parameters:\n" \
" subject_key=%%s default: subject.key\n" \
" subject_pwd=%%s default: (empty)\n" \
+ " issuer_crt=%%s default: (empty)\n" \
+ " If issuer_crt is specified, issuer_name is\n" \
+ " ignored!\n" \
" issuer_key=%%s default: ca.key\n" \
" issuer_pwd=%%s default: (empty)\n" \
" output_file=%%s default: cert.crt\n" \
@@ -151,6 +156,7 @@ int write_certificate( x509write_cert *crt, char *output_file )
int main( int argc, char *argv[] )
{
int ret = 0;
+ x509_cert issuer_crt;
rsa_context issuer_rsa, subject_rsa;
char buf[1024];
int i, j, n;
@@ -166,6 +172,7 @@ int main( int argc, char *argv[] )
rsa_init( &issuer_rsa, RSA_PKCS_V15, 0 );
rsa_init( &subject_rsa, RSA_PKCS_V15, 0 );
mpi_init( &serial );
+ memset( &issuer_crt, 0, sizeof(x509_cert) );
memset( buf, 0, 1024 );
if( argc == 0 )
@@ -176,6 +183,7 @@ int main( int argc, char *argv[] )
goto exit;
}
+ opt.issuer_crt = DFL_ISSUER_CRT;
opt.subject_key = DFL_SUBJECT_KEY;
opt.issuer_key = DFL_ISSUER_KEY;
opt.subject_pwd = DFL_SUBJECT_PWD;
@@ -214,6 +222,8 @@ int main( int argc, char *argv[] )
opt.subject_pwd = q;
else if( strcmp( p, "issuer_pwd" ) == 0 )
opt.issuer_pwd = q;
+ else if( strcmp( p, "issuer_crt" ) == 0 )
+ opt.issuer_crt = q;
else if( strcmp( p, "output_file" ) == 0 )
opt.output_file = q;
else if( strcmp( p, "subject_name" ) == 0 )
@@ -306,6 +316,8 @@ int main( int argc, char *argv[] )
goto usage;
}
+ printf("\n");
+
// Parse serial to MPI
//
if( ( ret = mpi_read_string( &serial, 10, opt.serial ) ) != 0 )
@@ -317,6 +329,40 @@ int main( int argc, char *argv[] )
goto exit;
}
+ // Parse issuer certificate if present
+ //
+ if( strlen( opt.issuer_crt ) )
+ {
+ /*
+ * 1.0. Load the certificates
+ */
+ printf( " . Loading the issuer certificate ..." );
+ fflush( stdout );
+
+ if( ( ret = x509parse_crtfile( &issuer_crt, opt.issuer_crt ) ) != 0 )
+ {
+#ifdef POLARSSL_ERROR_C
+ error_strerror( ret, buf, 1024 );
+#endif
+ printf( " failed\n ! x509parse_crtfile returned -0x%02x - %s\n\n", -ret, buf );
+ goto exit;
+ }
+
+ ret = x509parse_dn_gets( buf, sizeof(buf), &issuer_crt.issuer );
+ if( ret < 0 )
+ {
+#ifdef POLARSSL_ERROR_C
+ error_strerror( ret, buf, 1024 );
+#endif
+ printf( " failed\n ! x509parse_dn_gets returned -0x%02x - %s\n\n", -ret, buf );
+ goto exit;
+ }
+
+ opt.issuer_name = buf;
+
+ printf( " ok\n" );
+ }
+
/*
* 1.0. Check the names for validity
*/
@@ -341,7 +387,7 @@ int main( int argc, char *argv[] )
/*
* 1.1. Load the keys
*/
- printf( "\n . Loading the subject key ..." );
+ printf( " . Loading the subject key ..." );
fflush( stdout );
ret = x509parse_keyfile_rsa( &subject_rsa, opt.subject_key, opt.subject_pwd );
@@ -373,6 +419,20 @@ int main( int argc, char *argv[] )
goto exit;
}
+ // Check if key and issuer certificate match
+ //
+ if( strlen( opt.issuer_crt ) )
+ {
+ if( !pk_can_do( &issuer_crt.pk, POLARSSL_PK_RSA ) ||
+ mpi_cmp_mpi( &pk_rsa( issuer_crt.pk )->N, &issuer_rsa.N ) != 0 ||
+ mpi_cmp_mpi( &pk_rsa( issuer_crt.pk )->E, &issuer_rsa.E ) != 0 )
+ {
+ printf( " failed\n ! issuer_key does not match issuer certificate\n\n" );
+ ret = -1;
+ goto exit;
+ }
+ }
+
x509write_crt_set_issuer_key( &crt, &issuer_rsa );
printf( " ok\n" );