|
@@ -779,6 +779,55 @@ deleteMembers_sp_basic256sha256(UA_SecurityPolicy *securityPolicy) {
|
|
securityPolicy->policyContext = NULL;
|
|
securityPolicy->policyContext = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static UA_StatusCode
|
|
|
|
+updateCertificateAndPrivateKey_sp_basic256sha256(UA_SecurityPolicy *securityPolicy,
|
|
|
|
+ const UA_ByteString newCertificate,
|
|
|
|
+ const UA_ByteString newPrivateKey) {
|
|
|
|
+ if(securityPolicy == NULL)
|
|
|
|
+ return UA_STATUSCODE_BADINTERNALERROR;
|
|
|
|
+
|
|
|
|
+ if(securityPolicy->policyContext == NULL)
|
|
|
|
+ return UA_STATUSCODE_BADINTERNALERROR;
|
|
|
|
+
|
|
|
|
+ Basic256Sha256_PolicyContext *pc =
|
|
|
|
+ (Basic256Sha256_PolicyContext *) securityPolicy->policyContext;
|
|
|
|
+
|
|
|
|
+ UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
|
|
|
|
+
|
|
|
|
+ UA_StatusCode retval =
|
|
|
|
+ UA_ByteString_allocBuffer(&securityPolicy->localCertificate, newCertificate.length + 1);
|
|
|
|
+ if(retval != UA_STATUSCODE_GOOD)
|
|
|
|
+ return retval;
|
|
|
|
+ memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length);
|
|
|
|
+ securityPolicy->localCertificate.data[newCertificate.length] = '\0';
|
|
|
|
+ securityPolicy->localCertificate.length--;
|
|
|
|
+
|
|
|
|
+ /* Set the new private key */
|
|
|
|
+ mbedtls_pk_free(&pc->localPrivateKey);
|
|
|
|
+ mbedtls_pk_init(&pc->localPrivateKey);
|
|
|
|
+ int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey,
|
|
|
|
+ newPrivateKey.data, newPrivateKey.length,
|
|
|
|
+ NULL, 0);
|
|
|
|
+ UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED);
|
|
|
|
+ if(retval != UA_STATUSCODE_GOOD)
|
|
|
|
+ goto error;
|
|
|
|
+
|
|
|
|
+ retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy,
|
|
|
|
+ &securityPolicy->localCertificate,
|
|
|
|
+ &pc->localCertThumbprint);
|
|
|
|
+ if(retval != UA_STATUSCODE_GOOD)
|
|
|
|
+ goto error;
|
|
|
|
+
|
|
|
|
+ return retval;
|
|
|
|
+
|
|
|
|
+ error:
|
|
|
|
+ UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
|
|
|
|
+ "Could not update certificate and private key");
|
|
|
|
+ if(securityPolicy->policyContext != NULL)
|
|
|
|
+ deleteMembers_sp_basic256sha256(securityPolicy);
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
policyContext_newContext_sp_basic256sha256(UA_SecurityPolicy *securityPolicy,
|
|
policyContext_newContext_sp_basic256sha256(UA_SecurityPolicy *securityPolicy,
|
|
const UA_ByteString localPrivateKey) {
|
|
const UA_ByteString localPrivateKey) {
|
|
@@ -984,6 +1033,7 @@ UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy, UA_CertificateVerifi
|
|
channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *))
|
|
channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *))
|
|
channelContext_compareCertificate_sp_basic256sha256;
|
|
channelContext_compareCertificate_sp_basic256sha256;
|
|
|
|
|
|
|
|
+ policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic256sha256;
|
|
policy->deleteMembers = deleteMembers_sp_basic256sha256;
|
|
policy->deleteMembers = deleteMembers_sp_basic256sha256;
|
|
|
|
|
|
return policyContext_newContext_sp_basic256sha256(policy, localPrivateKey);
|
|
return policyContext_newContext_sp_basic256sha256(policy, localPrivateKey);
|