1# Development on Device Security Level Management 2 3## Overview 4 5### DSLM 6 7The OpenHarmony distributed technology can converge resources from different devices to form a Super Device. Poor security capabilities of any device may threaten the security of the Super Device. 8 9The Device Security Level Management (DSLM) module is introduced to manage the security levels of OpenHarmony devices. When different types of user data are hopped or processed in OpenHarmony distributed services, the DSLM APIs can be called to obtain the security levels of related devices for subsequent processing. 10 11### Basic Concepts 12 13- Device security level 14 15 The security level of an OpenHarmony device depends on the system security capabilities of the device. The OpenHarmony system security capabilities are based on the root of trust (RoT) for boot, RoT for storage, and RoT for compute on the hardware. Security technologies and capabilities focus on device integrity protection, data confidentiality protection, and vulnerability defense. 16 17 The following figure shows the OpenHarmony security architecture. 18 19 ![OpenHarmony system security architecture](figures/ohos_system_security_architecture.png) 20 21 The above figure shows the typical security architecture for a single device. The architecture may vary depending on the risk level as well as the software and hardware resources of the device. The security capabilities of OpenHarmony devices are classified into five levels from SL1 to SL5, based on the industry standard security classification model and actual OpenHarmony service scenarios and device types. In the OpenHarmony ecosystem, higher security levels include all the capabilities of lower security levels by default. The figure below shows the security levels of OpenHarmony devices. 22 23 ![OpenHarmony device security levels](figures/ohos_device_security_level.png) 24 25 - SL1: SL1 is the lowest security level of OpenHarmony devices. Usually equipped with a lightweight operating system and low-end microprocessors, such devices implement simple services and do not need to process sensitive data. SL1 devices are required to support software integrity protection and eliminate common errors. Devices that cannot meet the requirements of SL1 can only be controlled by OpenHarmony devices. They cannot control OpenHarmony devices for more complex service collaboration. 26 27 - SL2: OpenHarmony devices of SL2 can label their own data and define access control rules to implement discretionary access control (DAC). These devices must have basic anti-penetration capabilities. Devices of this level support a lightweight, secure, and isolated environment for deploying a small number of necessary security services. 28 29 - SL3: OpenHarmony devices of SL3 have comprehensive security protection capabilities, and their operating systems have relatively complete security semantics and support mandatory access control (MAC). The system data can be structured as critical elements and non-critical elements. The critical elements are protected by a well-defined security policy model. Devices of this level must have certain anti-penetration capabilities to defend against common vulnerability exploits. 30 31 - SL4: OpenHarmony devices of SL4 must have simplified trusted computing base (TCB) and come with anti-tampering capabilities. The implementation of SL4 should be concise and secure enough. Adequate authentication and arbitration are required for any access to critical elements. Devices of this level have considerable anti-penetration capabilities and can defend against most software attacks. 32 33 - SL5: SL5 indicates the highest security protection capabilities for OpenHarmony devices. The system core software modules must have passed formal verification. Key hardware modules, such as the RoT and cryptographic computing engine, must be able to defend against physical attacks and attacks simulated in labs. Devices at this level must have high-security units, such as dedicated security chips, to enhance the boot, storage, and running of the root of trust (RoT). 34 35- DSLM 36 37 DSLM is a module to manage the security levels of OpenHarmony devices. It verifies and updates device security level information for OpenHarmony devices in collaboration. It also provides an interface for querying the security level of each device. 38 39### Working Principles 40 41The security level of each device in a Super Device provides the decision-making criteria for processing or hopping various user data. For example, the distributed file storage service does not allow sensitive data to be stored on devices with security level lower than SL3. 42 43### Constraints 44 45The default security level of OpenHarmony devices is SL1. Device manufacturers can customize a higher security level based on service requirements. For details, see [Customizing Device Security Levels](#customizing-device-security-levels). 46 47If data processing or hopping fails because the device security level is low during debugging of distributed services, you can temporarily increase the security level of related devices. For details, see [Tool](#tool). 48 49## Development Guidelines 50 51### When to Use 52 53When processing or hopping various user data, a subsystem can invoke the APIs provided by the DSLM module to obtain the security level information of related devices. Then, the subsystems determine the subsequent processing based on the security level and data to be processed. 54 55### Available APIs 56 57All the APIs are native C interfaces for implementing underlying capabilities and are not open to apps. The APIs are described as follows: 58| API | Description | 59| :----------------------------------------------------------- | :------------------------------------------- | 60| int32_t RequestDeviceSecurityInfo(const DeviceIdentify \*identify, const RequestOption \*option, DeviceSecurityInfo \*\*info); | Requests the security level information of a device synchronously.| 61| int32_t RequestDeviceSecurityInfoAsync(const DeviceIdentify \*identify, const RequestOption \*option, DeviceSecurityInfoCallback callback); | Requests the security level information of a device asynchronously.| 62| void FreeDeviceSecurityInfo(DeviceSecurityInfo \*info); | Releases the device security level information.| 63| int32\_t GetDeviceSecurityLevelValue(const DeviceSecurityInfo \*info, int32_t \*level); | Obtains the device security level from the security level information.| 64 65### How to Develop 66 671. Add the dependencies for compilation. 68 69 ```undefined 70 external_deps += [ "device_security_level:dslm_sdk" ] 71 ``` 72 732. Add the header files of dependencies. 74 75 ```cpp 76 #include "device_security_defines.h" // Header file for defining critical data structures. 77 #include "device_security_info.h" // Header file for defining APIs. 78 ``` 79 803. Call APIs. 81 82 ```cpp 83 // Obtain the unique device identifier (UDID) of the device of which the security level is to be queried. 84 const DeviceIdentify *device = GetDestDeviceUdid(); 85 86 // Obtain the RequestOption. 87 const RequestOption *option = DEFAULT_OPTION; 88 89 // Define a pointer to the device security level obtained. 90 DeviceSecurityInfo *info = NULL; 91 92 // Call RequestDeviceSecurityInfo to obtain the device security level information of the peer device. 93 int32_t ret = RequestDeviceSecurityInfo(device, DEFAULT_OPTION, &info); 94 95 int32_t level = 0; 96 // Obtain the device security level from the device security level information. 97 ret = GetDeviceSecurityLevelValue(info, &level); 98 if (ret == SUCCESS) { 99 // The device security level is obtained. 100 FreeDeviceSecurityInfo(info); 101 return; 102 } 103 // Release the memory before the processing is complete. 104 FreeDeviceSecurityInfo(info); 105 ``` 106 107### Development Example 108 109A service with the file sharing function needs to be developed. To prevent sensitive files from being shared unintentionally, the following judgments must be performed before any file is sent: 110 111- If the security level of the destination device is SL3 or higher, the service sends the file. 112- If the security level of the destination device is lower than SL3, the service denies the file transfer and display a dialog box to notify the user. 113 114**Example of synchronously obtaining the device security level** 115 116```cpp 117void CheckDestDeviceSecurityLevel(const DeviceIdentify *device, RequestOption *option) 118{ 119 // Pointer to the device security level information. 120 DeviceSecurityInfo *info = NULL; 121 // Obtain the security level information of the device. 122 int32_t ret = RequestDeviceSecurityInfo(device, option, &info); 123 if (ret != SUCCESS) { 124 // Failed to obtain the information. You can develop a retry process as required. 125 return; 126 } 127 int32_t level = 0; 128 // Obtain the device security level from the device security level information. 129 ret = GetDeviceSecurityLevelValue(info, &level); 130 if (ret != SUCCESS) { 131 // Failed to obtain the security level. You can develop a retry process as required. 132 FreeDeviceSecurityInfo(info); 133 return; 134 } 135 // After the device security level is successfully obtained, check the lowest security level required for the current operation. 136 // The lowest device security level required for the current operation is 3. 137 if (level >= 3) { 138 // The security level of the target device meets the requirements. Services are processed properly. 139 } else { 140 // The security level of the target device does not meet the requirements. An alert or dialog box is displayed as required. 141 } 142 // Release the memory before the processing is complete. 143 FreeDeviceSecurityInfo(info); 144} 145``` 146 147**Example of asynchronously obtaining the device security level** 148 149```cpp 150// Callback 151void DeviceSecurityInfoCallback(const DeviceIdentify *identify, struct DeviceSecurityInfo *info) 152{ 153 int32_t level = 0; 154 // Obtain the device security level from the device security level information. 155 int32_t ret = GetDeviceSecurityLevelValue(info, &level); 156 if (ret != SUCCESS) { 157 // Failed to obtain the information. You can develop a retry process as required. 158 FreeDeviceSecurityInfo(info); 159 return; 160 } 161 // After the device security level is successfully obtained, check the lowest security level required for the current operation. 162 // The lowest device security level required for the current operation is 3. 163 if (level >= 3) { 164 // The security level of the target device meets the requirements. Services are processed properly. 165 } else { 166 // The security level of the target device does not meet the requirements. An alert or dialog box is displayed as required. 167 } 168 // Release the memory before the processing is complete. 169 FreeDeviceSecurityInfo(info); 170} 171 172void CheckDestDeviceSecurityLevelAsync(const DeviceIdentify *device, RequestOption *option) 173{ 174 // Invoke the asynchronous callback to return the device security level obtained. 175 int ret = RequestDeviceSecurityInfoAsync(device, option, DeviceSecurityInfoCallback); 176 if (ret != SUCCESS) { 177 // Failed to obtain the security level. You can develop a retry process as required. 178 // In this case, the callback will not be invoked. 179 return; 180 } 181 // The callback is invoked. Wait for the callback to return the device security level. 182} 183``` 184 185## Customizing Device Security Levels 186 187### Device Security Level Credential 188 189To ensure its integrity and non-repudiation, the security level information must be encapsulated in a "device security level credential" (credential for short) file for transmission between devices. In addition to the security level information of the device, the credential may include device attributes, such as the device model and version. Moreover, the credential must be signed using the public key infrastructure (PKI) technology. Other basic security capabilities of OpenHarmony, such as [Device Authentication](https://gitee.com/openharmony/security_device_auth) and [HUKS](https://gitee.com/openharmony/security_huks), are used to ensure secure transmission of credentials. 190 191### Default Implementation 192 193The DSLM module provides default implementation of security level information synchronization and verification. It is assumed that the security level of all OpenHarmony devices is SL1, and a loose verification scheme is used. For details, see the [source code](https://gitee.com/openharmony/security_device_security_level/tree/master/oem_property/ohos). 194 195You can change the device security level as required. For details about the OpenHarmony device security levels, see [Basic Concepts](#basic-concepts). You can also use more severe verification schemes, including but are not limited to using device-specific credential, periodically downloading updated credentials from a server and strictly authenticating the issuer and validity period of the credentials, and using Trusted Execution Environment (TEE) or even Secure Element (SE) to sign credential files. 196 197### Generating a Credential File 198 199The credential file consists of four Base64-encoded strings, separated by periods (.). The following is an example: 200 201```undefined 202<base64-header>.<base64-payload>.<base64-signature>.<base64-attestation> 203``` 204 205#### 1. Construct the `header`. 206 207The header is a fixed JSON string in the following format: 208 209``` json 210{ 211 "typ": "DSL" 212} 213``` 214 215Encode the header string to Base64 format to obtain `<base64-header>`. 216 217```undefined 218eyJ0eXAiOiAiRFNMIn0= 219``` 220 221#### 2. Construct the `payload`. 222 223Construct the payload in a JSON string. The following is an example: 224 225``` json 226{ 227 "type": "debug", 228 "manufacture": "ohos", 229 "brand": "rk3568", 230 "model": "rk3568", 231 "softwareVersion": "3.2.2", 232 "securityLevel": "SL1", 233 "signTime": "20220209150259", 234 "version": "1.0.1" 235} 236``` 237 238Encode the payload string to Base64 format to obtain `<base64-payload>`. 239 240```undefined 241eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9 242``` 243 244The fields in the `payload` are described as follows: 245 246| Field | Description | Mandatory| Value Range | 247| :-------------: | :----------------: | :----------: | :-------------------: | 248| type | Credential type. | Yes | [debug release] | 249| manufacture | Device manufacturer information. | Yes | string [0..128] | 250| brand | Device brand. | Yes | string [0..128] | 251| model | Device model. | Yes | string [0..128] | 252| softwareVersion | Device software version.| Yes | string [0..128] | 253| securityLevel | Device security level. | Yes | [SL1 SL2 SL3 SL4 SL5] | 254| signTime | Time when the credential was signed. | Yes | string [0..128] | 255| version | Credential version. | Yes | string [0..32] | 256| sn | Device SN. | No | string [0..128] | 257| udid | Device UDID. | No | string [0..128] | 258 259#### 3. Construct the `signature`. 260 261Construct the signature of the header and payload. 262 263##### 3.1 Construct the raw data to be signed. 264 265Combine the Base64-encoded header and payload with a period (.) in between to obtain `<base64-head>.<base64-payload>`. 266Example: 267 268```undefined 269eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9 270``` 271 272##### 3.2 Generate a private key for signing data. 273 274The Elliptic Curve Digital Signature algorithm (ECDSA) is used to sign the raw data in the credential file. Generate an ECDSA key pair `<ecc-l3-pk>` and `<ecc-l3-sk>` first. 275 276> ![notice](../public_sys-resources/icon-notice.gif)**NOTICE** 277> 278> This step must be performed in a secure and reliable environment, for example, a cryptographic machine that meets related security requirements, to ensure that the key generated is not disclosed. 279 280##### 3.3 Sign the raw data. 281 282Use the ECC private key `<ecc-l3-sk>` to sign `<base64-head>.<base64-payload>`, and encode the signature to Base64 format to obtain `<base64-signature>`. 283 284```undefined 285MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6vRTRs0xk6xKp8A0XwMMiIyjZlujPJfasCvFonpsvXLAqCAIYbe1J0k4Zfg== 286``` 287 288#### 4. Construct the `attestation`. 289 290> ![notice](../public_sys-resources/icon-notice.gif)**NOTICE** 291> 292> This step must be performed in a secure and reliable environment, for example, a cryptographic machine that meets related security requirements, to ensure that the key used for signature is not disclosed. 293> The key pairs involved in this step do not need to be generated each time. Secure key pairs can be reused. 294 295##### 4.1 Generate verification information for an end-entity certificate signature. 296 2971. Generate an ECDSA key pair `<ecc-l2-pk>` and `<ecc-l2-sk>` for an intermediate CA certificate signature. 2982. Use `<ecc-l2-sk>` to sign `<ecc-l3-pk>` (generated in step 3.2) to obtain `<ecc-l3-pk-signature>`. 2993. Combine `<ecc-l3-pk>` and `<ecc-l3-pk-signature>` into a JSON string. The following is an example: 300 301``` json 302{ 303 "userPublicKey": "<ecc-l3-pk>", 304 "signature": "<ecc-l3-pk-signature>" 305} 306``` 307 308##### 4.2 Generate verification information for an intermediate CA certificate signature. 309 3101. Generate an ECDSA key pair `<ecc-root-pk>` and `<ecc-root-sk>` for a root certificate signature. 3112. Use `<ecc-root-sk>` to sign `<ecc-l2-pk>` (generated in step 4.1) to obtain `<ecc-l2-pk-signature>`. 3123. Combine `<ecc-l3-pk>` and `<ecc-l3-pk-signature>` into a JSON string. 313The following is an example: 314 315``` json 316{ 317 "userPublicKey": "<ecc-l2-pk>", 318 "signature": "<ecc-l2-pk-signature>" 319} 320``` 321 322##### 4.3 Generate root signature verification information. 323 3241. Use `<ecc-root-sk>` to sign the `<ecc-root-pk>` (generated in step 4.2) to obtain `<ecc-root-pk-self-signature>` (a self-signature). 3252. Combine `<ecc-root-pk>` and `<ecc-root-pk-self-signature>` into a JSON string. The following is an example: 326 327``` json 328{ 329 "userPublicKey": "<ecc-root-pk>", 330 "signature": "<ecc-root-pk-self-signature>" 331} 332``` 333 334##### 4.4 Generate the `attestation`. 335 3361. Combine the preceding three pieces of signature information into a JSON array. 337 338 ```json 339 [ 340 { 341 "userPublicKey": "<ecc-l3-pk>", 342 "signature": "<ecc-l3-pk-signature>" 343 }, 344 { 345 "userPublicKey": "<ecc-l2-pk>", 346 "signature": "<ecc-l2-pk-signature>" 347 }, 348 { 349 "userPublicKey": "<ecc-root-pk>", 350 "signature": "<ecc-root-pk-self-signature>" 351 } 352 ] 353 ``` 354 3552. Encode the JSON array to Base64 format to obtain `<base64-attestation>`. 356 357 ```undefined 358 W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCREdOMU9xYWZrWFc2a0l1SEZrMVQ0TS84RVJUY3p0eWRDaGtramFROEkzNEc2Q3E1aTNJcnczVnRhQS9KTTF2a0lHOUZDVWRUaHZFUlJFUTFUdG9xemdxZW9SUzVwQW1EYUUyalEwYzdDem8rOHVUWTRIYW1weXZ1TENtenlYUXFnPT0iLCAic2lnbmF0dXJlIjogIk1HTUNMeHVjUnoyZndKZ092QkxyU1U3K1hlVTA3R0EyVXhZbDFMbEJLUnVIUS9wZlNWVHBEd0ZHSTNTb3h5ODR3NThIQWpBeGRtNEY3b3YvYUtEL0NFZi9QZlZDWHVlbE1mQys1L3pkUExXUUJEVnlGdWQrNVdYL3g4U083VXM5UGFhRW1mZz0ifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJHMWU3TDJVd1AyWWxTajB2RWViUGJpNVpLMDh5NS9UeHRWb3VrRFpIUGtSNlRtb2JoVGpyMVRVNzZpUkU4bDlWQlhuU1h1QVB6cjBuSHdKVkdVZVJMdmp4MVh0YUZReE9QNjhjNlIvRTdFWkZ2STdRUFg1N0tvRkhYdkEvVlJaNnc9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01FUVdFNnk0Rm42SFg1ekFvTzNkYzl5cG1Sd2lBclplc2o5aVBROTZEaEhuNXJkRTdNaGFMdWNRZ0MvaXhjSWJsZ0l3QkN5aFBvRUg2RjFITFlwM2xqbWVncVlZQ1E5NHEyZm1kbDB6dHhrWEVTOVpPOVRNSUZQRVpKYlpmUnU5ZHcyOSJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZRUUlDWmpWUTV4bkE0c2RMbUJzUmVaMzRJeWdkSmZhanA3SnRReFBzU2RwWTJXV0FneXp6Rm40OFFRRWhoU1BtdzhJYUU3VlJKRENBT3FYRnhGektJbFBFTDFvcFJDUmhhWmJrRzc5Y3ZrWC9HVVhlaFVYc2V2ZGhyb2VRVERFdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTUdQRndvSDJLbHhwbVZhWXRWV1ViMHpDSUJxYXFXY2F6czFqOVp4YklLUmVkR2tJY0VJdHN0UFoxdnVTanYvNDJnSXdSeGZPcTRoQTdNMHlGV2ZPSndqRTlTc2JsYXhvRDNiRTZCYzN2QjUyMmsyQ0ZJNWJqelpkeUFTVW04d2J2TW5WIn1d 359 ``` 360 361#### 5. Construct a complete credential. 362 363Put the four pieces of data together with a period (.) in between to obtain `<base64-header>.<base64-payload>.<base64-signature>.<base64-attestation>`. The following is an example: 364 365```undefined 366eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIm9ob3MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4yLjIiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDEiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTAyNTkiLCAidmVyc2lvbiI6ICIxLjAuMSJ9.MGUCMDb9xoiFzTWVkHDU3VWSVQ59gLyw4TchZ0+eQ3vUfQsLt3Hkg0r7a/PmhkNr3X/mTgIxAIywIRE6vRTRs0xk6xKp8A0XwMMiIyjZlujPJfasCvFonpsvXLAqCAIYbe1J0k4Zfg==.W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCREdOMU9xYWZrWFc2a0l1SEZrMVQ0TS84RVJUY3p0eWRDaGtramFROEkzNEc2Q3E1aTNJcnczVnRhQS9KTTF2a0lHOUZDVWRUaHZFUlJFUTFUdG9xemdxZW9SUzVwQW1EYUUyalEwYzdDem8rOHVUWTRIYW1weXZ1TENtenlYUXFnPT0iLCAic2lnbmF0dXJlIjogIk1HTUNMeHVjUnoyZndKZ092QkxyU1U3K1hlVTA3R0EyVXhZbDFMbEJLUnVIUS9wZlNWVHBEd0ZHSTNTb3h5ODR3NThIQWpBeGRtNEY3b3YvYUtEL0NFZi9QZlZDWHVlbE1mQys1L3pkUExXUUJEVnlGdWQrNVdYL3g4U083VXM5UGFhRW1mZz0ifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJHMWU3TDJVd1AyWWxTajB2RWViUGJpNVpLMDh5NS9UeHRWb3VrRFpIUGtSNlRtb2JoVGpyMVRVNzZpUkU4bDlWQlhuU1h1QVB6cjBuSHdKVkdVZVJMdmp4MVh0YUZReE9QNjhjNlIvRTdFWkZ2STdRUFg1N0tvRkhYdkEvVlJaNnc9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01FUVdFNnk0Rm42SFg1ekFvTzNkYzl5cG1Sd2lBclplc2o5aVBROTZEaEhuNXJkRTdNaGFMdWNRZ0MvaXhjSWJsZ0l3QkN5aFBvRUg2RjFITFlwM2xqbWVncVlZQ1E5NHEyZm1kbDB6dHhrWEVTOVpPOVRNSUZQRVpKYlpmUnU5ZHcyOSJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZRUUlDWmpWUTV4bkE0c2RMbUJzUmVaMzRJeWdkSmZhanA3SnRReFBzU2RwWTJXV0FneXp6Rm40OFFRRWhoU1BtdzhJYUU3VlJKRENBT3FYRnhGektJbFBFTDFvcFJDUmhhWmJrRzc5Y3ZrWC9HVVhlaFVYc2V2ZGhyb2VRVERFdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTUdQRndvSDJLbHhwbVZhWXRWV1ViMHpDSUJxYXFXY2F6czFqOVp4YklLUmVkR2tJY0VJdHN0UFoxdnVTanYvNDJnSXdSeGZPcTRoQTdNMHlGV2ZPSndqRTlTc2JsYXhvRDNiRTZCYzN2QjUyMmsyQ0ZJNWJqelpkeUFTVW04d2J2TW5WIn1d 367``` 368 369### Credential Exchange Protocol 370 371When detecting a device goes online, the DSLM module requests the device security level credential from the device through the channel provided by [DSoftBus](https://gitee.com/openharmony/communication_dsoftbus). 372 373The packet for requesting the credential is in the following format: 374 375``` json 376{ 377 "message": 1, 378 "payload": { 379 "version": 196608, 380 "challenge": "0102030405060708", 381 "support": [ 382 300 383 ] 384 } 385} 386``` 387 388The fields in the request message are described as follows: 389 390| Field | Description | 391| :-------: | :-----------------------------------: | 392| message | Message header. The value **1** indicates a request for the device security level credential.| 393| payload | Message payload, which is the specific request information.| 394| version | Version of the protocol used by the requester.| 395| challenge | Challenge value corresponding to this request.| 396| support | List of credential formats supported by the requester.| 397 398After receiving the request, the peer device returns a response in the following format: 399 400``` json 401{ 402 "message": 2, 403 "payload": { 404 "version": 196608, 405 "type": 300, 406 "challenge": "0102030405060708", 407 "info": "YWJjZAEDBQcJ..." 408 } 409} 410``` 411 412The fields in the response message are described as follows: 413| Field | Description | 414| :-------: | :--------------------------------------------------------: | 415| message | Message header. The value **2** indicates a response to the request for the device security level credential.| 416| payload | Message payload, which is the specific response information.| 417| version | Version of the protocol used by the responder. | 418| type | Format of the credential returned, which describes how to parse the **info** field.| 419| challenge | Challenge value corresponding to this response message.| 420| info | Signed credential information, which also includes the device information and challenge value verification information.| 421 422### Tool 423 424The DSLM module provides a [credential tool](https://gitee.com/openharmony/security_device_security_level/blob/master/oem_property/ohos/standard/dslm_cred_tool.py) to help you better understand the issuing and verification of credentials. This tool is a Python script encapsulated with OpenSSL commands. 425You can use the tool as follows: 426 4271. Initialize the signature key. 428 429 ``` undefined 430 ./dslm_cred_tool.py init 431 ``` 432 4332. Generate a credential. 434 435 For example, to generate a credential file **cred.txt** with the device model of **rk3568**, device version of **3.0.0**, and device security level of **SL3**, run the following command: 436 437 ``` undefined 438 ./dslm_cred_tool.py create --field-manufacture OHOS --field-brand rk3568 --field-model rk3568 --field-software-version 3.0.0 --field-security-level SL3 --cred-file cred.txt 439 ``` 440 441 A credential file is generated as follows: 442 443 ``` undefined 444 cat cred.txt 445 eyJ0eXAiOiAiRFNMIn0=.eyJ0eXBlIjogImRlYnVnIiwgIm1hbnVmYWN0dXJlIjogIk9IT1MiLCAiYnJhbmQiOiAicmszNTY4IiwgIm1vZGVsIjogInJrMzU2OCIsICJzb2Z0d2FyZVZlcnNpb24iOiAiMy4wLjAiLCAic2VjdXJpdHlMZXZlbCI6ICJTTDMiLCAic2lnblRpbWUiOiAiMjAyMjAyMDkxNTUzMDMiLCAidmVyc2lvbiI6ICIxLjAuMSJ9.MGQCMEqZy/snsRyjMupnEvTpQfhQn+IcdCc5Q3NGxllNQVhoZX8PNyw6ATTgyx+26ghmtQIwVH5KwQ4/VejxckeHmtkBVhofhgmRapzvyVnyiB3PdsU7nvHk8A/zC7PFy1CWBG3z.W3sidXNlclB1YmxpY0tleSI6ICJNSG93RkFZSEtvWkl6ajBDQVFZSkt5UURBd0lJQVFFTEEySUFCQzFXRUxSVlU1NGp1U1ZXWlUrT29CM3hacFd5MWg3QW5uSFdKWm5QbTB3S2l0ZlJZelJKZ3FiUGQyZ3ltVXBUWVl1cmhyRDQxbFdPbUNzcmt0VWdaNTFXdGNCTmc5SG1GODkzc2ZHVFM5eUJNS0JoMGcxSHZaSVFSN1k0S3FXaWpnPT0iLCAic2lnbmF0dXJlIjogIk1HUUNNRFVicTZ2Z2R1YVF0bFVwOTR0azd4VjRJcEx2WVZWY3Y4aFNOTkw0azdPRHhmbEVGTHJFaUdPRWhwMUcweGFGYlFJd1pUbTk1cWx4OTBFZnptV3VIOGlEY2ZWYVlQS2N5SEYwR2ZFcEUzb1NESzQwZEFOZ0FJMWVQY09rTzBPOTdnTFAifSwgeyJ1c2VyUHVibGljS2V5IjogIk1Ib3dGQVlIS29aSXpqMENBUVlKS3lRREF3SUlBUUVMQTJJQUJGKzY1a0lSYTM2dkE4QVZWNXFrcUozYXpXTkdGQy9oaVdPL0tFNHR0S1pMOUsyNlhzQ2hQbjVNc3BlT2F3b1dqSU02bTVLOFZTcU1DYlZNN0svY0VRU0tYdDJTeVJGZERVZU9TaFZmQm9YVmxqaXRUU2puN0V5Q2pERVZiWjFRNEE9PSIsICJzaWduYXR1cmUiOiAiTUdRQ01HanF2cnZ5VW1YNVZLVVc1UkFkUTNkZ2hBYmNBazBRQnppQlFWMVFZUTNQMVFPSzdMckM1b0RObXh6T2Y0QUtmd0l3SzVWU2x3ZG5JSUR6Zm9PUXBEUVAycGhTVGgxSGVjbXJRK1F4VGxWelo0aHJsdnJyd2xCNnp0T3pWRFdNblRELyJ9LCB7InVzZXJQdWJsaWNLZXkiOiAiTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkZCa2FDNE9mc2VTREt2cW8vbU5VaUtXQ3JtK1VDNGFQcjVsODRNM2tMVCtDdkd3OWhqOGJ6d2I1MzNtVVlFZVhWWWtUdFlRYWRURkRJZXV1dGIzNU1QZDlEKytNMFRFWnZvcTY4NFhoYTVQMzBUbVRhK0ZvOG02UWliZWc3TmFQdz09IiwgInNpZ25hdHVyZSI6ICJNR1FDTURJcmpNYzhvODVPRHFZT0R4c05PcmpYdUhvWjM5endpZlhVTkdDc0lkN2xjU2FWcnhCVlNqRjRyaWg5Y1R6T3dRSXdWQXA3RUF5c1pucEI5REJWVWczQzlMeGQ3eTQxWEMwYVVPcGZUKzI3REVvWmM1WVVldDFGa1FwdmFQckduaFhVIn1d 446 ``` 447 4483. Verify a credential. 449 450 ``` undefined 451 ./dslm_cred_tool.py verify --cred-file cred.txt 452 ``` 453 454 The command output is as follows: 455 456 ``` undefined 457 head: 458 { 459 "typ": "DSL" 460 } 461 payload: 462 { 463 "type": "debug", 464 "manufacture": "OHOS", 465 "brand": "rk3568", 466 "model": "rk3568", 467 "softwareVersion": "3.0.0", 468 "securityLevel": "SL3", 469 "signTime": "20220209155303", 470 "version": "1.0.1" 471 } 472 verify success! 473 ``` 474 4754. Send the generated credential file to the target device and make it take effect. 476 477 Temporarily disable write protection. 478 ``` undefined 479 hdc_std target mount 480 hdc_std shell "setenforce 0" 481 ``` 482 483 Send the generated credential file to the device. 484 ``` undefined 485 hdc_std file send cred.txt /system/etc/dslm_finger.cfg 486 ``` 487 488 Restart the device to make the new credential file take effect. 489 ``` undefined 490 hdc_std reboot 491 ``` 492 493## FAQs 494 495- Q: How can I use the credential tool in a production environment? 496 497 A: The credential tool cannot be directly used in the production environment. It is used to demonstrate the format and generation process of credentials. In the production environment, you are advised to generate credentials and save related keys in a cryptographic machine that meets related security requirements. 498 499- Q: How do I verify a credential in a production environment? 500 501 A: You are advised to use a properly kept private key to sign the credential and use more severe signature verification process instead of the default verification process provided by the DSLM module. For example, allow only the credentials issued by trusted certification authorities (CAs), and bind the credential and device ID to enhance the security. 502 503- Q: The default security level of OpenHarmony devices is SL1. How do I do if the distributed service (distributed file system) fails to process sensitive data due to insufficient permission? 504 505 A: You can solve the problem by temporarily increasing the security level of the related devices. For details, see [Tool](#tool). 506