diff --git a/ctaocrypt/src/asn.c b/ctaocrypt/src/asn.c index be76fc14b..b82748dd2 100644 --- a/ctaocrypt/src/asn.c +++ b/ctaocrypt/src/asn.c @@ -4450,21 +4450,35 @@ void InitCert(Cert* cert) XMEMSET(cert->serial, 0, CTC_SERIAL_SIZE); cert->issuer.country[0] = '\0'; + cert->issuer.countryEnc = CTC_PRINTABLE; cert->issuer.state[0] = '\0'; + cert->issuer.stateEnc = CTC_UTF8; cert->issuer.locality[0] = '\0'; + cert->issuer.localityEnc = CTC_UTF8; cert->issuer.sur[0] = '\0'; + cert->issuer.surEnc = CTC_UTF8; cert->issuer.org[0] = '\0'; + cert->issuer.orgEnc = CTC_UTF8; cert->issuer.unit[0] = '\0'; + cert->issuer.unitEnc = CTC_UTF8; cert->issuer.commonName[0] = '\0'; + cert->issuer.commonNameEnc = CTC_UTF8; cert->issuer.email[0] = '\0'; cert->subject.country[0] = '\0'; + cert->subject.countryEnc = CTC_PRINTABLE; cert->subject.state[0] = '\0'; + cert->subject.stateEnc = CTC_UTF8; cert->subject.locality[0] = '\0'; + cert->subject.localityEnc = CTC_UTF8; cert->subject.sur[0] = '\0'; + cert->subject.surEnc = CTC_UTF8; cert->subject.org[0] = '\0'; + cert->subject.orgEnc = CTC_UTF8; cert->subject.unit[0] = '\0'; + cert->subject.unitEnc = CTC_UTF8; cert->subject.commonName[0] = '\0'; + cert->subject.commonNameEnc = CTC_UTF8; cert->subject.email[0] = '\0'; #ifdef CYASSL_CERT_REQ @@ -4823,6 +4837,37 @@ static const char* GetOneName(CertName* name, int idx) } +/* Get Which Name Encoding from index */ +static char GetNameType(CertName* name, int idx) +{ + switch (idx) { + case 0: + return name->countryEnc; + + case 1: + return name->stateEnc; + + case 2: + return name->localityEnc; + + case 3: + return name->surEnc; + + case 4: + return name->orgEnc; + + case 5: + return name->unitEnc; + + case 6: + return name->commonNameEnc; + + default: + return 0; + } +} + + /* Get ASN Name from index */ static byte GetNameId(int idx) { @@ -4972,10 +5017,7 @@ static int SetName(byte* output, CertName* name) /* id type */ names[i].encoded[idx++] = bType; /* str type */ - if (bType == ASN_COUNTRY_NAME) - names[i].encoded[idx++] = 0x13; /* printable */ - else - names[i].encoded[idx++] = 0x0c; /* utf8 */ + names[i].encoded[idx++] = GetNameType(name, i); } /* second length */ XMEMCPY(names[i].encoded + idx, secondLen, secondSz); diff --git a/cyassl/ctaocrypt/asn_public.h b/cyassl/ctaocrypt/asn_public.h index 3ad601709..0a6d62530 100644 --- a/cyassl/ctaocrypt/asn_public.h +++ b/cyassl/ctaocrypt/asn_public.h @@ -76,14 +76,26 @@ enum Ctc_Misc { CTC_SERIAL_SIZE = 8 }; +enum Ctc_Encoding { + CTC_UTF8 = 0x0c, /* utf8 */ + CTC_PRINTABLE = 0x13 /* printable */ +}; + typedef struct CertName { char country[CTC_NAME_SIZE]; + char countryEnc; char state[CTC_NAME_SIZE]; + char stateEnc; char locality[CTC_NAME_SIZE]; + char localityEnc; char sur[CTC_NAME_SIZE]; + char surEnc; char org[CTC_NAME_SIZE]; + char orgEnc; char unit[CTC_NAME_SIZE]; + char unitEnc; char commonName[CTC_NAME_SIZE]; + char commonNameEnc; char email[CTC_NAME_SIZE]; /* !!!! email has to be last !!!! */ } CertName;