• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }