Commit efd4446e authored by ASN.1 Documenter's avatar ASN.1 Documenter
Browse files

add debug messages in asn1certgen; support for openssl package on cygwin

parent 607acd18
Loading
Loading
Loading
Loading
+1 −0
Changes for tools/itscertgen/asn1certgen/Makefile: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ bins = asn1certgen
sources       := asn1certgen.c ecc_openssl.c mkgmtime.c
cflags        += -Wno-pointer-sign -Wno-enum-compare
sources-WIN32  := applink.c
#sources-CYGWIN := applink.c
packages      += cshared openssl
predirs       := asncodec
includes      += asncodec
+17 −10
Changes for tools/itscertgen/asn1certgen/applink.c: 17 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -29,17 +29,24 @@
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

#ifdef _MSC_VER
#define fileno _fileno
#define open _open
#define read _read
#define write _write
#define lseek _lseek
#define close _close
#else
#include <unistd.h>
#endif
static void *app_stdin(void)		{ return stdin;  }
static void *app_stdout(void)		{ return stdout; }
static void *app_stderr(void)		{ return stderr; }
static int   app_feof(FILE *fp)		{ return feof(fp); }
static int   app_ferror(FILE *fp)	{ return ferror(fp); }
static void  app_clearerr(FILE *fp)	{ clearerr(fp); }
static int   app_fileno(FILE *fp)	{ return _fileno(fp); }
static int   app_fsetmod(FILE *fp,char mod)
{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); }

static int   app_fileno(FILE *fp)	{ return fileno(fp); }
static int   app_fsetmod(FILE *fp,char mod) { return _setmode (fileno(fp),mod=='b'?O_BINARY:O_TEXT); }
#ifdef __cplusplus
extern "C" {
#endif
@@ -77,11 +84,11 @@ OPENSSL_Applink(void)
	OPENSSL_ApplinkTable[APPLINK_CLEARERR]	= app_clearerr;
	OPENSSL_ApplinkTable[APPLINK_FILENO]	= app_fileno;

	OPENSSL_ApplinkTable[APPLINK_OPEN]	= _open;
	OPENSSL_ApplinkTable[APPLINK_READ]	= _read;
	OPENSSL_ApplinkTable[APPLINK_WRITE]	= _write;
	OPENSSL_ApplinkTable[APPLINK_LSEEK]	= _lseek;
	OPENSSL_ApplinkTable[APPLINK_CLOSE]	= _close;
	OPENSSL_ApplinkTable[APPLINK_OPEN]	= open;
	OPENSSL_ApplinkTable[APPLINK_READ]	= read;
	OPENSSL_ApplinkTable[APPLINK_WRITE]	= write;
	OPENSSL_ApplinkTable[APPLINK_LSEEK]	= lseek;
	OPENSSL_ApplinkTable[APPLINK_CLOSE]	= close;

	once = 0;
    }
+71 −11
Changes for tools/itscertgen/asn1certgen/asn1certgen.c: 71 added lines, 11 removed lines.
Original line number Diff line number Diff line
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <math.h>
#include "../cshared/copts.h"
#include "../cshared/cstr.h"
#include "ecc_api.h"
#include <ctype.h>
#include "mkgmtime.h"

#include "asn_application.h"
#include "EtsiTs103097Certificate.h"
@@ -139,7 +143,7 @@ static asn_enc_rval_t ToBeSignedCertificate_oer_encoder(const asn_TYPE_descripto
		if(_debug){
			char hex[257*2];
			*_bin2hex(hex, sizeof(hex)-1, oer, ((rc.encoded>256)?256:rc.encoded)) = 0;
			fprintf(stderr, "DEBUG: ToBeSigned OER[%ld]=%s\n", rc.encoded, hex);
			fprintf(stderr, "DEBUG: ToBeSigned OER[%zu]=%s\n", rc.encoded, hex);
		}
		// calculate hash
		if (tbs->verifyKeyIndicator.present == VerificationKeyIndicator_PR_verificationKey &&
@@ -162,6 +166,13 @@ static ecc_curve_id _pk_type_to_curveid[] = {
	ecies_brainpoolp384r  //Signature_PR_ecdsaBrainpoolP384r1Signature
};

static const char * _pk_curve_names[] = {
	"nistp256",
	"brainpoolp256r",
	"brainpoolp384r",
	"unsupported"
};

static ecc_curve_id _pk_type_to_hashid[] = {
	0,
	sha_256,       //Signature_PR_ecdsaNistP256Signature,
@@ -181,11 +192,21 @@ static asn_enc_rval_t Signature_oer_encoder(const asn_TYPE_descriptor_t *td,
		const char * sName = _signerName;

		if (sName == NULL && _cert->issuer.present == IssuerIdentifier_PR_self)
			sName = _profileName;
			sName = _certName;

		char* pk = cvstrdup(_keyPath, "/", sName, EXT_VKEY, NULL);
		void *k = ecc_key_private_load(pk, alg);
		if (k){
		if (k==NULL){
			free(pk);
			pk = cvstrdup(_searchPath, "/", sName, EXT_VKEY, NULL);
			k = ecc_key_private_load(pk, alg);
			if (k==NULL){
				fprintf(stderr, "%s: Private key not found\n", pk);
				ASN__ENCODE_FAILED;
			}
		}
		free(pk);
	
			char h[48];
			int hl = 0;
			// calculate joint hash
@@ -218,7 +239,6 @@ static asn_enc_rval_t Signature_oer_encoder(const asn_TYPE_descriptor_t *td,

			ecc_sign(k, h, hl, s->choice.ecdsaNistP256Signature.rSig.choice.x_only.buf, s->choice.ecdsaNistP256Signature.sSig.buf);
		}
	}
	return asn_OP_CHOICE.oer_encoder(td, constraints, sptr, cb, app_key);
}

@@ -238,6 +258,22 @@ static asn_dec_rval_t ServiceSpecificPermissions_oer_decoder(const struct asn_co
}


static int Time32_print_struct(const asn_TYPE_descriptor_t *td, const void *sptr,
                    int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	int rc = NativeInteger_print(td, sptr, ilevel, cb, app_key);
	if(rc == 0){
	    const long *native = (const long *)sptr;
	    if(native) {
			const char * s = stritsdate32(*native);
			if(s){
                if(cb(" --(", 4, app_key) < 0) return -1;
                if(cb(s, strlen(s), app_key) < 0) return -1;
                if(cb(")", 1, app_key) < 0) return -1;
			}
		}
	}
	return rc;
}
int main(int argc, char ** argv)
{
	// set default time to the begining of this year
@@ -246,7 +282,7 @@ int main(int argc, char ** argv)
	//parse options
	argc = coptions(argc, argv, COPT_HELP_NOVALUES , _options);
	if(argc < 2){
		if(argc<0 && (0-argc)<((sizeof(_options)/sizeof(_options[0]))-1)){
		if(argc<0 && (((int)0)-argc)<((sizeof(_options)/sizeof(_options[0]))-1)){
			printf("Unknown option %s\n", argv[0-argc]);
		}
		const char * a = strrchr(argv[0], '/');
@@ -267,6 +303,7 @@ int main(int argc, char ** argv)
	}
	
	if(ecc_api_init()){
		fprintf(stderr, "Cannot initialize ECC engine\n");
		return -1;
	}

@@ -275,6 +312,10 @@ int main(int argc, char ** argv)
		char * p = strrchr(_profileName, '.');
		if(p) *p = 0;
	}
	if (_certName == NULL) {
		_certName = _profileName;
	}


	//load XER file
	char * buf = malloc(CERT_MAX_SIZE);
@@ -309,12 +350,16 @@ int main(int argc, char ** argv)
	asn_TYPE_operation_t serviceSpecificPermissionsOps = *asn_DEF_ServiceSpecificPermissions.op;
	asn_DEF_ServiceSpecificPermissions.op = &serviceSpecificPermissionsOps;

	asn_TYPE_operation_t time32Ops = *asn_DEF_Time32.op;
	asn_DEF_Time32.op = &time32Ops;

	issuerOps.xer_decoder = IssuerIdentifier_xer_decoder;
	tbsOps.oer_encoder = ToBeSignedCertificate_oer_encoder;
	signatureOps.oer_encoder = Signature_oer_encoder;
	countryOnlyOps.xer_decoder = CountryOnly_xer_decoder;
	publicVerificationKeyOps.oer_decoder = PublicVerificationKey_oer_decoder;
	serviceSpecificPermissionsOps.oer_decoder = ServiceSpecificPermissions_oer_decoder;
	time32Ops.print_struct = Time32_print_struct;

	if(_view) {
		char hash[50], hash_hex[256];
@@ -448,7 +493,7 @@ int main(int argc, char ** argv)
	// generate keys if necessary
	// buf = name of private key file
	int rc = -1;
	cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, EXT_VKEY, NULL);
	cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _certName, EXT_VKEY, NULL);
	switch (cert->toBeSigned.verifyKeyIndicator.present){
	case VerificationKeyIndicator_PR_verificationKey:
		switch (cert->toBeSigned.verifyKeyIndicator.choice.verificationKey.present){
@@ -463,6 +508,13 @@ int main(int argc, char ** argv)
			break;
		default:
			fprintf(stderr, "Unknown verification key curve type\n");
			return -1;
		}
		if (rc < 0) {
			fprintf(stderr, "%s: Cannot prepare verification key of type %s\n", buf,
				asn_MBR_PublicVerificationKey_1[cert->toBeSigned.verifyKeyIndicator.choice.verificationKey.present - 1].name
			);
			return -1;
		}
		break;
	case VerificationKeyIndicator_PR_reconstructionValue:
@@ -470,7 +522,7 @@ int main(int argc, char ** argv)
		break;
	case VerificationKeyIndicator_PR_NOTHING:
	default:
		fprintf(stderr, "Unknown verification key indicator type\n");
		fprintf(stderr, "%s: Unknown verification key indicator type %d\n", buf, cert->toBeSigned.verifyKeyIndicator.present-1);
		break;
	}
	if (rc < 0){
@@ -478,7 +530,7 @@ int main(int argc, char ** argv)
	}
	if (cert->toBeSigned.encryptionKey){
		rc = -1;
		cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _profileName, EXT_EKEY, NULL);
		cvstrncpy(buf, CERT_MAX_SIZE, _keyPath, "/", _certName, EXT_EKEY, NULL);
		switch (cert->toBeSigned.encryptionKey->publicKey.present){
		case BasePublicEncryptionKey_PR_NOTHING:
			cert->toBeSigned.encryptionKey->publicKey.present = BasePublicEncryptionKey_PR_eciesNistP256;
@@ -489,15 +541,16 @@ int main(int argc, char ** argv)
			rc = fill_curve_point_eccP256(&cert->toBeSigned.encryptionKey->publicKey.choice.eciesBrainpoolP256r1, ecies_brainpoolp256r, buf);
			break;
		default:
			fprintf(stderr, "Unknown encryption key curve type\n");
			fprintf(stderr, "Unknown encryption key curve type %d\n", cert->toBeSigned.encryptionKey->publicKey.present);
			break;
		}
		if (rc < 0){
			fprintf(stderr, "%s: Cannot prepare encryption key\n", buf);
			return -1;
		}
	}

	cvstrncpy(buf, CERT_MAX_SIZE, _outPath, "/", _profileName, EXT_CERT, NULL);
	cvstrncpy(buf, CERT_MAX_SIZE, _outPath, "/", _certName, EXT_CERT, NULL);
	f = fopen(buf, "wb");
	if (f == NULL){
		perror(buf);
@@ -508,7 +561,7 @@ int main(int argc, char ** argv)
	// Encode as OER
	rc_e = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EtsiTs103097Certificate, cert, buf, CERT_MAX_SIZE);
	if (rc_e.encoded <0){
		fprintf(stderr, "%s: OER encoding failed for %s\n", _profileName, rc_e.failed_type->name);
		fprintf(stderr, "%s: OER encoding failed for %s\n", _certName, rc_e.failed_type->name);
		return -1;
	}

@@ -570,6 +623,10 @@ static int fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id cur
				fprintf(stderr, "DEBUG: generate key %s\n", keyPath);
			}
			key = ecc_key_gen(curveType);
			if(key == NULL){
				fprintf(stderr, "ERROR: key %s generation failed for curve %s\n", keyPath, _pk_curve_names[curveType & 3]);
			    return rc;
			}    
			ecc_key_private_save(key, keyPath, _outKeyFormat);
			strcpy(e_pub, EXT_PUB);
			ecc_key_public_save(key, keyPath, _outKeyFormat);
@@ -579,6 +636,7 @@ static int fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id cur
			}
		}
	}

	fsize = ecc_key_public(key, x, y, &compressed_y);
	if (fsize > 0){
		OCTET_STRING_fromBuf(&point->choice.x_only, x, fsize);
@@ -596,6 +654,8 @@ static int fill_curve_point_eccP384(EccP384CurvePoint_t* point, ecc_curve_id cur
			fprintf(stderr, "DEBUG: %s_pub.y=%s\n", keyPath, hex);
		}
		rc = 0;
	}else{
        fprintf(stderr, "ERROR: %s - unknown public key\n", keyPath);
	}
	ecc_key_free(key);
	return rc;
+5 −0
Changes for tools/itscertgen/asn1certgen/asncodec/asn_system.h: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -138,8 +138,13 @@ typedef unsigned int uint32_t;
#define ASN_PRIuMAX PRIuMAX
#define ASN_PRIdMAX PRIdMAX
#else
#if _MSC_VER >= 1800
#define ASN_PRI_SIZE "zu"
#define ASN_PRI_SSIZE "zd"
#else
#define ASN_PRI_SIZE "lu"
#define ASN_PRI_SSIZE "ld"
#endif
#if LLONG_MAX > LONG_MAX
#define ASN_PRIuMAX "llu"
#define ASN_PRIdMAX "lld"
+7 −1
Changes for tools/itscertgen/asn1certgen/ecc_openssl.c: 7 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -49,6 +49,9 @@ int ecc_api_init()
	int i;
	for (i = 0; i < ARRAYSIZE(_config); i++){
		_curves[i] = EC_GROUP_new_by_curve_name(_config[i].nid);
		if(_curves[i] == NULL){
		    fprintf(stderr, "ERROR: unknown curve %s\n", _config[i].name);
		}
	}
	return 0;
}
@@ -459,9 +462,12 @@ int ecc_verify(void * key, const char * hash, int hlength, const char *r, con
		sr = BN_new(); ss = BN_new();
		BN_bin2bn(r, fsize, sr);
		BN_bin2bn(s, fsize, ss);
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
		ECDSA_SIG_set0(ecdsa, sr, ss);
#else
        ecdsa->r = sr;
        ecdsa->s = ss;
    //		ECDSA_SIG_set0(ecdsa, sr, ss);
#endif
		rc = ECDSA_do_verify(hash, hlength, ecdsa, eckey);
		ECDSA_SIG_free(ecdsa);
		BN_free(sr); BN_free(ss);
Loading