Kaynağa Gözat

CMO create file objects for certificates added

micsat 3 yıl önce
ebeveyn
işleme
64c4df03c9

+ 42 - 17
source/src/cip/cip_security/certificatemanagement.c

@@ -52,6 +52,9 @@
 #include "certificatemanagement.h"
 #include "cipsecurity.h"
 
+#include "OpENerFileObject/cipfile.h" //TODO: check
+#include "cipepath.h"
+
 /* ********************************************************************
  * defines
  */
@@ -78,25 +81,11 @@ const CipShortString default_name = {
   .string = (EipByte *)(&instance_1_name),
 };
 
-const Certificate default_device_certificate = {
-  .certificate_status =
-    kCertificateManagementObjectCertificateStateValueVerified
-    // TODO: add path
-};
+Certificate default_device_certificate;
 
-const Certificate default_ca_certificate = {
-  .certificate_status =
-    kCertificateManagementObjectCertificateStateValueVerified
-    // TODO: add path
-};
+Certificate default_ca_certificate;
 
-CertificateManagementObject g_certificate_management = {
-  .name = default_name,                                      /*Attribute 1*/
-  .state = kCertificateManagementObjectStateValueVerified,   /*Attribute 2*/
-  .device_certificate = default_device_certificate,          /*Attribute 3*/
-  .ca_certificate = default_ca_certificate,                  /*Attribute 4*/
-  .certificate_encoding = kCertificateManagementObjectCertificateEncodingPEM,   /*Attribute 5*/
-};
+CertificateManagementObject g_certificate_management;
 
 /** @brief Produce the data according to CIP encoding onto the message buffer.
  *
@@ -545,5 +534,41 @@ EipStatus CertificateManagementObjectInit(void) {
                 "CertificateManagementObjectVerifyCertificate"
                 );
 
+  /* create file object for device certificate */
+  CipInstance device_certificate_file_object = CipFileCreateInstance(
+    "Device Certificate");
+
+  default_device_certificate.certificate_status =
+    kCertificateManagementObjectCertificateStateValueVerified;
+
+  //bind epath of file object to certificate
+  default_device_certificate.path = CipEpathCreate(2,
+                                                   kCipFileObjectClassCode,
+                                                   device_certificate_file_object.instance_number,
+                                                   0);
+
+  /* create file object for CA certificate */
+  CipInstance ca_certificate_file_object = CipFileCreateInstance(
+    "CA Certificate");
+
+  default_ca_certificate.certificate_status =
+    kCertificateManagementObjectCertificateStateValueVerified;
+
+  //bind epath of file object to certificate
+  default_ca_certificate.path = CipEpathCreate(2,
+                                               kCipFileObjectClassCode,
+                                               ca_certificate_file_object.instance_number,
+                                               0);
+
+  /* Add data to static instance number 1 (default certificates)*/
+  g_certificate_management.name = default_name;                                      /*Attribute 1*/
+  g_certificate_management.state =
+    kCertificateManagementObjectStateValueVerified;                                  /*Attribute 2*/
+  g_certificate_management.device_certificate = default_device_certificate;          /*Attribute 3*/
+  g_certificate_management.ca_certificate = default_ca_certificate;                  /*Attribute 4*/
+  g_certificate_management.certificate_encoding =
+    kCertificateManagementObjectCertificateEncodingPEM;                                                 /*Attribute 5*/
+
   return kEipStatusOk;
+
 }

+ 15 - 0
source/src/cip/cipepath.c

@@ -692,3 +692,18 @@ bool CipEpathEqual(const CipOctet *const path1,
   return true;
 }
 
+CipEpath CipEpathCreate(size_t path_size,
+                        CipUdint class_id,
+                        CipUdint instance_number,
+                        CipUdint attribute_number) {
+  CipEpath epath = {
+    .path_size = path_size,
+    .class_id = class_id,
+    .instance_number = instance_number
+  };
+  if(0 != attribute_number) {
+    epath.attribute_number = attribute_number;
+  }
+  return epath;
+}
+

+ 13 - 0
source/src/cip/cipepath.h

@@ -389,4 +389,17 @@ bool CipEpathEqual(const CipOctet *const path1,
                    const CipOctet *const path2,
                    const CipUint path2_length);
 
+/** @brief Create EPath from object functions
+ *
+ * @param path_size EPath size in 16 bit words (path_size * 16 bit)
+ * @param class_id Class ID of the linked object
+ * @param instance_number Instance Number of the linked object
+ * @param attribute_number Attribute Number of the linked object
+ * @return created EPath
+ */
+CipEpath CipEpathCreate(size_t path_size,
+                        CipUdint class_id,
+                        CipUdint instance_number,
+                        CipUdint attribute_number);
+
 #endif /* SRC_CIP_CIPEPATH_H_ */