if( !X509_set_version( c, 2 ) ) {
throw "Setting X509-version to 3 failed";
}
+
+ X509_NAME* subjectP = X509_NAME_new();
+
+ if( !subjectP ) {
+ throw "malloc failure";
+ }
+
+ subject = std::shared_ptr<X509_NAME>( subjectP, X509_NAME_free );
+}
+
+void X509Cert::addRDN( int nid, std::string data ) {
+ if( ! X509_NAME_add_entry_by_NID( subject.get(), nid, MBSTRING_UTF8, ( unsigned char* )const_cast<char*>( data.data() ), data.size(), -1, 0 ) ) {
+ throw "malloc failure";
+ }
}
void X509Cert::setIssuerNameFrom( std::shared_ptr<X509> caCert ) {
}
std::shared_ptr<SignedCertificate> X509Cert::sign( std::shared_ptr<EVP_PKEY> caKey ) {
+ if( !X509_set_subject_name( target.get(), subject.get() ) ) {
+ throw "error setting subject";
+ }
+
if( !X509_sign( target.get(), caKey.get(), EVP_sha512() ) ) {
throw "Signing failed.";
}
class X509Cert {
private:
std::shared_ptr<X509> target;
+ std::shared_ptr<X509_NAME> subject;
public:
X509Cert();
+ void addRDN( int nid, std::string data );
void setIssuerNameFrom( std::shared_ptr<X509> ca );
void setPubkeyFrom( std::shared_ptr<X509Req> r );
void setSerialNumber( BIGNUM* num );
throw "Creating X509 failed.";
}
+ X509_NAME* subjectP = X509_NAME_new();
+
+ if( !subjectP ) {
+ throw "malloc failure";
+ }
+
+ std::shared_ptr<X509_NAME> subject = std::shared_ptr<X509_NAME>( subjectP, X509_NAME_free );
+ const char* strdata = "commonName";
+ X509_NAME_add_entry_by_NID( subject.get(), NID_commonName, MBSTRING_UTF8, ( unsigned char* )const_cast<char*>( strdata ), 10, -1, 0 ); // guard
+ c.addRDN( NID_commonName, "common-Content" );
c.setIssuerNameFrom( caCert );
c.setPubkeyFrom( req );
std::shared_ptr<BIGNUM> ser = nextSerial();