1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: 多精度整数(Multi-precision integer)mbedTLS实现(此文件为DEMO,需集成方适配修改)
15 */
16 #include "hilink_sal_mpi.h"
17
18 #include <stddef.h>
19 #include "mbedtls/bignum.h"
20 #include "hilink_mem_adapter.h"
21 #include "hilink_sal_defines.h"
22
HILINK_SAL_MpiInit(void)23 HiLinkMpi HILINK_SAL_MpiInit(void)
24 {
25 mbedtls_mpi *mpi = (mbedtls_mpi *)HILINK_Malloc(sizeof(mbedtls_mpi));
26 if (mpi == NULL) {
27 HILINK_SAL_WARN("malloc error\r\n");
28 return NULL;
29 }
30 mbedtls_mpi_init(mpi);
31 return mpi;
32 }
33
GetMbedtlsMpi(HiLinkMpi mpi)34 mbedtls_mpi *GetMbedtlsMpi(HiLinkMpi mpi)
35 {
36 return mpi;
37 }
38
HILINK_SAL_MpiFree(HiLinkMpi mpi)39 void HILINK_SAL_MpiFree(HiLinkMpi mpi)
40 {
41 if (mpi == NULL) {
42 return;
43 }
44 mbedtls_mpi_free(mpi);
45 HILINK_Free(mpi);
46 }
47
HILINK_SAL_MpiExpMod(HiLinkMpi x,HiLinkMpi a,HiLinkMpi e,HiLinkMpi n)48 int HILINK_SAL_MpiExpMod(HiLinkMpi x, HiLinkMpi a, HiLinkMpi e, HiLinkMpi n)
49 {
50 if ((x == NULL) || (a == NULL) || (e == NULL) || (n == NULL)) {
51 HILINK_SAL_WARN("invalid param\r\n");
52 return HILINK_SAL_PARAM_INVALID;
53 }
54 int ret = mbedtls_mpi_exp_mod(x, a, e, n, NULL);
55 if (ret != 0) {
56 HILINK_SAL_WARN("exp mod error %d\r\n", ret);
57 }
58 return ret;
59 }
60
HILINK_SAL_MpiCmpInt(HiLinkMpi x,int64_t z)61 int HILINK_SAL_MpiCmpInt(HiLinkMpi x, int64_t z)
62 {
63 if (x == NULL) {
64 HILINK_SAL_WARN("invalid param\r\n");
65 return HILINK_SAL_PARAM_INVALID;
66 }
67
68 return mbedtls_mpi_cmp_int(x, z);
69 }
70
HILINK_SAL_MpiSubInt(HiLinkMpi x,HiLinkMpi a,int64_t b)71 int HILINK_SAL_MpiSubInt(HiLinkMpi x, HiLinkMpi a, int64_t b)
72 {
73 if ((x == NULL) || (a == NULL)) {
74 HILINK_SAL_WARN("invalid param\r\n");
75 return HILINK_SAL_PARAM_INVALID;
76 }
77 int ret = mbedtls_mpi_sub_int(x, a, b);
78 if (ret != 0) {
79 HILINK_SAL_WARN("sub int error %d\r\n", ret);
80 }
81 return ret;
82 }
83
HILINK_SAL_MpiCmpMpi(HiLinkMpi x,HiLinkMpi y)84 int HILINK_SAL_MpiCmpMpi(HiLinkMpi x, HiLinkMpi y)
85 {
86 if ((x == NULL) || (y == NULL)) {
87 HILINK_SAL_WARN("invalid param\r\n");
88 return HILINK_SAL_PARAM_INVALID;
89 }
90 return mbedtls_mpi_cmp_mpi(x, y);
91 }
92
HILINK_SAL_MpiReadString(HiLinkMpi mpi,unsigned char radix,const char * s)93 int HILINK_SAL_MpiReadString(HiLinkMpi mpi, unsigned char radix, const char *s)
94 {
95 if ((mpi == NULL) || (s == NULL) || (radix < 2) || (radix > 16)) {
96 HILINK_SAL_WARN("invalid param\r\n");
97 return HILINK_SAL_PARAM_INVALID;
98 }
99 int ret = mbedtls_mpi_read_string(mpi, radix, s);
100 if (ret != 0) {
101 HILINK_SAL_WARN("read string error %d\r\n", ret);
102 }
103 return ret;
104 }
105
HILINK_SAL_MpiWriteString(HiLinkMpi mpi,unsigned int radix,char * buf,unsigned int * bufLen)106 int HILINK_SAL_MpiWriteString(HiLinkMpi mpi, unsigned int radix, char *buf, unsigned int *bufLen)
107 {
108 if ((mpi == NULL) || (buf == NULL) || (radix < 2) || (radix > 16) || (bufLen == NULL) ||
109 (*bufLen == 0)) {
110 HILINK_SAL_WARN("invalid param\r\n");
111 return HILINK_SAL_PARAM_INVALID;
112 }
113 size_t oLen = 0;
114 int ret = mbedtls_mpi_write_string(mpi, radix, buf, *bufLen, &oLen);
115 if (ret != 0) {
116 HILINK_SAL_WARN("write string error %d\r\n", ret);
117 } else {
118 *bufLen = oLen;
119 }
120 return ret;
121 }
122
HILINK_SAL_MpiReadBinary(HiLinkMpi mpi,const unsigned char * buf,unsigned int bufLen)123 int HILINK_SAL_MpiReadBinary(HiLinkMpi mpi, const unsigned char *buf, unsigned int bufLen)
124 {
125 if ((mpi == NULL) || (buf == NULL) || (bufLen == 0)) {
126 HILINK_SAL_WARN("invalid param\r\n");
127 return HILINK_SAL_PARAM_INVALID;
128 }
129 int ret = mbedtls_mpi_read_binary(mpi, buf, bufLen);
130 if (ret != 0) {
131 HILINK_SAL_WARN("read binary error %d\r\n", ret);
132 }
133 return ret;
134 }
135
HILINK_SAL_MpiWriteBinary(HiLinkMpi mpi,unsigned char * buf,unsigned int bufLen)136 int HILINK_SAL_MpiWriteBinary(HiLinkMpi mpi, unsigned char *buf, unsigned int bufLen)
137 {
138 if ((mpi == NULL) || (buf == NULL) || (bufLen == 0)) {
139 HILINK_SAL_WARN("invalid param\r\n");
140 return HILINK_SAL_PARAM_INVALID;
141 }
142 int ret = mbedtls_mpi_write_binary(mpi, buf, bufLen);
143 if (ret != 0) {
144 HILINK_SAL_WARN("write binary error %d\r\n", ret);
145 }
146 return ret;
147 }