@@ -26647,6 +26647,132 @@ int wc_EncodeNameCanonical(EncodedName* name, const char* nameStr,
2664726647}
2664826648#endif /* WOLFSSL_CERT_GEN || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
2664926649
26650+ #if (defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT)) || \
26651+ (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA))
26652+
26653+ /* Convert key usage string (comma delimited, null terminated) to word16
26654+ * Returns 0 on success, negative on error */
26655+ int ParseKeyUsageStr(const char* value, word16* keyUsage, void* heap)
26656+ {
26657+ int ret = 0;
26658+ char *token, *str, *ptr;
26659+ word32 len = 0;
26660+ word16 usage = 0;
26661+
26662+ if (value == NULL || keyUsage == NULL) {
26663+ return BAD_FUNC_ARG;
26664+ }
26665+
26666+ /* duplicate string (including terminator) */
26667+ len = (word32)XSTRLEN(value);
26668+ str = (char*)XMALLOC(len + 1, heap, DYNAMIC_TYPE_TMP_BUFFER);
26669+ if (str == NULL) {
26670+ return MEMORY_E;
26671+ }
26672+ XMEMCPY(str, value, len + 1);
26673+
26674+ /* parse value, and set corresponding Key Usage value */
26675+ if ((token = XSTRTOK(str, ",", &ptr)) == NULL) {
26676+ XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER);
26677+ return KEYUSAGE_E;
26678+ }
26679+ while (token != NULL) {
26680+ if (!XSTRCASECMP(token, "digitalSignature"))
26681+ usage |= KEYUSE_DIGITAL_SIG;
26682+ else if (!XSTRCASECMP(token, "nonRepudiation") ||
26683+ !XSTRCASECMP(token, "contentCommitment"))
26684+ usage |= KEYUSE_CONTENT_COMMIT;
26685+ else if (!XSTRCASECMP(token, "keyEncipherment"))
26686+ usage |= KEYUSE_KEY_ENCIPHER;
26687+ else if (!XSTRCASECMP(token, "dataEncipherment"))
26688+ usage |= KEYUSE_DATA_ENCIPHER;
26689+ else if (!XSTRCASECMP(token, "keyAgreement"))
26690+ usage |= KEYUSE_KEY_AGREE;
26691+ else if (!XSTRCASECMP(token, "keyCertSign"))
26692+ usage |= KEYUSE_KEY_CERT_SIGN;
26693+ else if (!XSTRCASECMP(token, "cRLSign"))
26694+ usage |= KEYUSE_CRL_SIGN;
26695+ else if (!XSTRCASECMP(token, "encipherOnly"))
26696+ usage |= KEYUSE_ENCIPHER_ONLY;
26697+ else if (!XSTRCASECMP(token, "decipherOnly"))
26698+ usage |= KEYUSE_DECIPHER_ONLY;
26699+ else {
26700+ ret = KEYUSAGE_E;
26701+ break;
26702+ }
26703+
26704+ token = XSTRTOK(NULL, ",", &ptr);
26705+ }
26706+
26707+ XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER);
26708+
26709+ if (ret == 0) {
26710+ *keyUsage = usage;
26711+ }
26712+
26713+ return ret;
26714+ }
26715+
26716+ /* Convert extended key usage string (comma delimited, null terminated) to byte
26717+ * Returns 0 on success, negative on error */
26718+ int ParseExtKeyUsageStr(const char* value, byte* extKeyUsage, void* heap)
26719+ {
26720+ int ret = 0;
26721+ char *token, *str, *ptr;
26722+ word32 len = 0;
26723+ byte usage = 0;
26724+
26725+ if (value == NULL || extKeyUsage == NULL) {
26726+ return BAD_FUNC_ARG;
26727+ }
26728+
26729+ /* duplicate string (including terminator) */
26730+ len = (word32)XSTRLEN(value);
26731+ str = (char*)XMALLOC(len + 1, heap, DYNAMIC_TYPE_TMP_BUFFER);
26732+ if (str == NULL) {
26733+ return MEMORY_E;
26734+ }
26735+ XMEMCPY(str, value, len + 1);
26736+
26737+ /* parse value, and set corresponding Key Usage value */
26738+ if ((token = XSTRTOK(str, ",", &ptr)) == NULL) {
26739+ XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER);
26740+ return EXTKEYUSAGE_E;
26741+ }
26742+ while (token != NULL) {
26743+ if (!XSTRCASECMP(token, "any"))
26744+ usage |= EXTKEYUSE_ANY;
26745+ else if (!XSTRCASECMP(token, "serverAuth"))
26746+ usage |= EXTKEYUSE_SERVER_AUTH;
26747+ else if (!XSTRCASECMP(token, "clientAuth"))
26748+ usage |= EXTKEYUSE_CLIENT_AUTH;
26749+ else if (!XSTRCASECMP(token, "codeSigning"))
26750+ usage |= EXTKEYUSE_CODESIGN;
26751+ else if (!XSTRCASECMP(token, "emailProtection"))
26752+ usage |= EXTKEYUSE_EMAILPROT;
26753+ else if (!XSTRCASECMP(token, "timeStamping"))
26754+ usage |= EXTKEYUSE_TIMESTAMP;
26755+ else if (!XSTRCASECMP(token, "OCSPSigning"))
26756+ usage |= EXTKEYUSE_OCSP_SIGN;
26757+ else {
26758+ ret = EXTKEYUSAGE_E;
26759+ break;
26760+ }
26761+
26762+ token = XSTRTOK(NULL, ",", &ptr);
26763+ }
26764+
26765+ XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER);
26766+
26767+ if (ret == 0) {
26768+ *extKeyUsage = usage;
26769+ }
26770+
26771+ return ret;
26772+ }
26773+
26774+ #endif /* (CERT_GEN && CERT_EXT) || (OPENSSL_ALL || OPENSSL_EXTRA) */
26775+
2665026776#ifdef WOLFSSL_CERT_GEN
2665126777/* Encodes one attribute of the name (issuer/subject)
2665226778 * call we_EncodeName_ex with 0x16, IA5String for email type
@@ -30471,109 +30597,29 @@ int wc_SetAuthKeyId(Cert *cert, const char* file)
3047130597int wc_SetKeyUsage(Cert *cert, const char *value)
3047230598{
3047330599 int ret = 0;
30474- char *token, *str, *ptr;
30475- word32 len;
3047630600
3047730601 if (cert == NULL || value == NULL)
3047830602 return BAD_FUNC_ARG;
3047930603
3048030604 cert->keyUsage = 0;
3048130605
30482- /* duplicate string (including terminator) */
30483- len = (word32)XSTRLEN(value);
30484- str = (char*)XMALLOC(len+1, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
30485- if (str == NULL)
30486- return MEMORY_E;
30487- XMEMCPY(str, value, len+1);
30488-
30489- /* parse value, and set corresponding Key Usage value */
30490- if ((token = XSTRTOK(str, ",", &ptr)) == NULL) {
30491- XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
30492- return KEYUSAGE_E;
30493- }
30494- while (token != NULL)
30495- {
30496- if (!XSTRCASECMP(token, "digitalSignature"))
30497- cert->keyUsage |= KEYUSE_DIGITAL_SIG;
30498- else if (!XSTRCASECMP(token, "nonRepudiation") ||
30499- !XSTRCASECMP(token, "contentCommitment"))
30500- cert->keyUsage |= KEYUSE_CONTENT_COMMIT;
30501- else if (!XSTRCASECMP(token, "keyEncipherment"))
30502- cert->keyUsage |= KEYUSE_KEY_ENCIPHER;
30503- else if (!XSTRCASECMP(token, "dataEncipherment"))
30504- cert->keyUsage |= KEYUSE_DATA_ENCIPHER;
30505- else if (!XSTRCASECMP(token, "keyAgreement"))
30506- cert->keyUsage |= KEYUSE_KEY_AGREE;
30507- else if (!XSTRCASECMP(token, "keyCertSign"))
30508- cert->keyUsage |= KEYUSE_KEY_CERT_SIGN;
30509- else if (!XSTRCASECMP(token, "cRLSign"))
30510- cert->keyUsage |= KEYUSE_CRL_SIGN;
30511- else if (!XSTRCASECMP(token, "encipherOnly"))
30512- cert->keyUsage |= KEYUSE_ENCIPHER_ONLY;
30513- else if (!XSTRCASECMP(token, "decipherOnly"))
30514- cert->keyUsage |= KEYUSE_DECIPHER_ONLY;
30515- else {
30516- ret = KEYUSAGE_E;
30517- break;
30518- }
30519-
30520- token = XSTRTOK(NULL, ",", &ptr);
30521- }
30606+ ret = ParseKeyUsageStr(value, &cert->keyUsage, cert->heap);
3052230607
30523- XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
3052430608 return ret;
3052530609}
3052630610
3052730611/* Set ExtendedKeyUsage from human readable string */
3052830612int wc_SetExtKeyUsage(Cert *cert, const char *value)
3052930613{
3053030614 int ret = 0;
30531- char *token, *str, *ptr;
30532- word32 len;
3053330615
3053430616 if (cert == NULL || value == NULL)
3053530617 return BAD_FUNC_ARG;
3053630618
3053730619 cert->extKeyUsage = 0;
3053830620
30539- /* duplicate string (including terminator) */
30540- len = (word32)XSTRLEN(value);
30541- str = (char*)XMALLOC(len+1, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
30542- if (str == NULL)
30543- return MEMORY_E;
30544- XMEMCPY(str, value, len+1);
30545-
30546- /* parse value, and set corresponding Key Usage value */
30547- if ((token = XSTRTOK(str, ",", &ptr)) == NULL) {
30548- XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
30549- return EXTKEYUSAGE_E;
30550- }
30551-
30552- while (token != NULL)
30553- {
30554- if (!XSTRCASECMP(token, "any"))
30555- cert->extKeyUsage |= EXTKEYUSE_ANY;
30556- else if (!XSTRCASECMP(token, "serverAuth"))
30557- cert->extKeyUsage |= EXTKEYUSE_SERVER_AUTH;
30558- else if (!XSTRCASECMP(token, "clientAuth"))
30559- cert->extKeyUsage |= EXTKEYUSE_CLIENT_AUTH;
30560- else if (!XSTRCASECMP(token, "codeSigning"))
30561- cert->extKeyUsage |= EXTKEYUSE_CODESIGN;
30562- else if (!XSTRCASECMP(token, "emailProtection"))
30563- cert->extKeyUsage |= EXTKEYUSE_EMAILPROT;
30564- else if (!XSTRCASECMP(token, "timeStamping"))
30565- cert->extKeyUsage |= EXTKEYUSE_TIMESTAMP;
30566- else if (!XSTRCASECMP(token, "OCSPSigning"))
30567- cert->extKeyUsage |= EXTKEYUSE_OCSP_SIGN;
30568- else {
30569- ret = EXTKEYUSAGE_E;
30570- break;
30571- }
30572-
30573- token = XSTRTOK(NULL, ",", &ptr);
30574- }
30621+ ret = ParseExtKeyUsageStr(value, &cert->extKeyUsage, cert->heap);
3057530622
30576- XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER);
3057730623 return ret;
3057830624}
3057930625
0 commit comments