• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Converting Compressed or Uncompressed ECC Point Data (C/C++)
2
3<!--Kit: Crypto Architecture Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @zxz--3-->
6<!--Designer: @lanming-->
7<!--Tester: @PAFT-->
8<!--Adviser: @zengyawen-->
9
10You can convert compressed or uncompressed point data into a **Point** object for generating a key object, or convert a **Point** object into compressed or uncompressed point data.<br>
11For details about the ECC algorithm specifications, see [ECC](crypto-asym-key-generation-conversion-spec.md#ecc).<br>
12You can pass in the string parameter **format** to specify the format of the point data to obtain. To obtain compressed point data, set **format** to **COMPRESSED**. To obtain uncompressed point data, set **format** to **UNCOMPRESSED**.
13
14## Converting Uncompressed Point Data into Compressed Point Data
15
161. Pass the uncompressed ECC point data of the uint8_t type, and call [OH_CryptoEcPoint_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoecpoint_create) to construct a [OH_CryptoEcPoint](../../reference/apis-crypto-architecture-kit/capi-cryptoasymkeyapi-oh-cryptoecpoint.md) object for generating point data.
172. Call [OH_CryptoEcPoint_Encode](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoecpoint_encode) to obtain the compressed point data.
18
19```C++
20#include "CryptoArchitectureKit/crypto_architecture_kit.h"
21
22static OH_Crypto_ErrCode doTestEccPointUncompressedToCompressed()
23{
24    uint8_t pk[] = {
25        4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111,
26        40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206,
27        200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152
28    };
29    Crypto_DataBlob pkData = {pk, sizeof(pk)};
30    OH_CryptoEcPoint *point = nullptr;
31    OH_Crypto_ErrCode ret = OH_CryptoEcPoint_Create("NID_brainpoolP256r1", &pkData, &point);
32    if (ret != CRYPTO_SUCCESS) {
33        return ret;
34    }
35    Crypto_DataBlob returnPointBlobData = {0};
36    ret = OH_CryptoEcPoint_Encode(point, "COMPRESSED", &returnPointBlobData);
37    if (ret != CRYPTO_SUCCESS) {
38        OH_CryptoEcPoint_Destroy(point);
39        return ret;
40    }
41    OH_Crypto_FreeDataBlob(&returnPointBlobData);
42    OH_CryptoEcPoint_Destroy(point);
43    return ret;
44}
45```
46
47## Converting Compressed Point Data into a Key Object
48
491. Pass the compressed ECC point data of the uint8_t type, and call [OH_CryptoEcPoint_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoecpoint_create) to construct a [OH_CryptoEcPoint](../../reference/apis-crypto-architecture-kit/capi-cryptoasymkeyapi-oh-cryptoecpoint.md) object for generating point data.
502. Call [OH_CryptoEcPoint_Encode](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoecpoint_encode) to obtain the uncompressed point data.
51
52```C++
53#include "CryptoArchitectureKit/crypto_architecture_kit.h"
54
55static OH_Crypto_ErrCode doTestEccPointeccPointCompressedToPoint()
56{
57    uint8_t pk[] = {
58        2, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111,
59        40, 217, 215, 148, 120, 224, 205, 82
60    };
61    Crypto_DataBlob pkData = {pk, sizeof(pk)};
62    OH_CryptoEcPoint *point = nullptr;
63    OH_Crypto_ErrCode ret = OH_CryptoEcPoint_Create("NID_brainpoolP256r1", &pkData, &point);
64    if (ret != CRYPTO_SUCCESS) {
65        return ret;
66    }
67    Crypto_DataBlob returnPointBlobData = {0};
68    ret = OH_CryptoEcPoint_Encode(point, "UNCOMPRESSED", &returnPointBlobData);
69    if (ret != CRYPTO_SUCCESS) {
70        OH_CryptoEcPoint_Destroy(point);
71        return ret;
72    }
73    OH_Crypto_FreeDataBlob(&returnPointBlobData);
74    OH_CryptoEcPoint_Destroy(point);
75    return ret;
76}
77```
78