2 * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /******************************************************************************
19 * @brief CSI Source File for RSA Driver
22 ******************************************************************************/
29 #define ERR_RSA(errno) (CSI_DRV_ERRNO_RSA_BASE | errno)
30 #define RSA_NULL_PARAM_CHK(para) \
33 return ERR_RSA(EDRV_PARAMETER); \
42 rsa_data_bits_e data_bit;
43 rsa_endian_mode_e endian;
44 rsa_padding_t padding;
48 extern int32_t target_get_rsa_count(void);
49 extern int32_t target_get_rsa(int32_t idx, uint32_t *base, uint32_t *irq);
51 static ck_rsa_priv_t rsa_handle[CONFIG_RSA_NUM];
53 extern uint8_t modulus[];
54 static ck_rsa_reg_t *rsa_reg = NULL;
55 /* Driver Capabilities */
56 static const rsa_capabilities_t driver_capabilities = {
57 .bits_192 = 1, /* 192bits modular mode */
58 .bits_256 = 1, /* 256bits modular mode */
59 .bits_512 = 1, /* 512bits modular mode */
60 .bits_1024 = 1, /* 1024bits modular mode */
61 .bits_2048 = 1 /* 2048bits modular mode */
64 extern int32_t target_get_rsa(int32_t idx, uint32_t *base, uint32_t *irq);
65 extern int32_t target_get_rsa_count(void);
70 static uint32_t sw_exptmod_2_2m(const uint32_t *modulus, uint32_t words, uint32_t *tmp_c);
71 static uint32_t get_valid_bits(const uint32_t *addr, uint32_t wordsize, uint32_t keywords);
73 #ifdef RSA_USING_ID2KEY
74 static uint32_t g_acc[RSA_KEY_WORD];
77 static inline void rsa_clear_int(void)
79 rsa_reg->rsa_isr = 0xffff;
80 rsa_reg->rsa_imr = 0x0000;
83 static inline void rsa_setm_width(uint32_t width)
85 rsa_reg->rsa_mwid = width;
88 static inline void rsa_setd_width(uint32_t width)
90 rsa_reg->rsa_ckid = width;
93 static inline void rsa_setb_width(uint32_t width)
95 rsa_reg->rsa_bwid = width;
98 static inline void rsa_cal_q(void)
100 rsa_reg->rsa_ctrl = RAS_CALCULATE_Q;
103 static inline void rsa_opr_start(void)
105 rsa_reg->rsa_ctrl = RSA_ENABLE_MODULE;
108 static inline void rsa_opr_reset(void)
110 rsa_reg->rsa_ctrl = RSA_ENDIAN_MODE;
111 rsa_reg->rsa_rst |= RSA_RESET;
113 while (rsa_reg->rsa_rst);
116 static inline uint32_t rsa_loop_cnt(void)
118 return rsa_reg->rsa_lp_cnt;
121 static inline uint32_t rsa_cal_q_done(void)
123 return (rsa_reg->rsa_isr >> RSA_CAL_Q_DONE_OFFSET) & 0x1;
126 static inline uint32_t rsa_opr_done(void)
128 return (rsa_reg->rsa_isr) & 0x1;
131 static inline uint32_t rsa_raise_exception(void)
133 return (rsa_reg->rsa_isr) & 0x1E;
136 static inline uint32_t rsa_loadm(uint32_t *data, uint32_t length)
139 uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfm;
141 for (i = 0; i < length; i++) {
142 *(volatile uint32_t *)baseaddr = data[i];
143 baseaddr = baseaddr + 4;
149 static void rsa_loadd(uint32_t *data, uint32_t length)
152 uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfd;
154 for (i = 0; i < length; i++) {
155 *(volatile uint32_t *)baseaddr = data[i];
156 baseaddr = baseaddr + 4;
160 static void rsa_loadc(uint32_t *data, uint32_t length)
163 uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfc;
165 for (i = 1; i < length + 1; i++) {
166 *(volatile uint32_t *)baseaddr = data[i - 1];
167 baseaddr = baseaddr + 4;
171 static void rsa_loadb(uint32_t *data, uint32_t length)
174 uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfb;
176 for (i = 0; i < length; i++) {
177 *(volatile uint32_t *)baseaddr = data[i];
178 baseaddr = baseaddr + 4;
182 static void rsa_read_r(uint32_t data[], uint32_t length)
185 uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfr;
187 for (i = 0; i < length; i++) {
188 data[i] = *(uint32_t *)baseaddr;
189 baseaddr = baseaddr + 4;
193 #if (CONFIG_PLATFORM_HOBBIT1_2 > 0)
195 // Since there is a piece of memory hole in RSA engine. we should
196 // jump the hold to continue run without disable interrupt
197 #define RSA_SP_HOLE_DOWN 0x60000900
198 #define RSA_SP_HOLE_UP 0x600009FF
199 #define TEE_CONEXT_SIZE 128
200 static uint32_t rsa_run_adjust_sp_if_need(uint32_t sp)
204 // if current sp is in hole, adjust new sp
205 if ((sp < (RSA_SP_HOLE_UP + TEE_CONEXT_SIZE)) && (sp > RSA_SP_HOLE_DOWN))
213 static void rsa_run_by_assemble(void)
215 __asm__ __volatile__ (
225 "lrw r5, 0x4000a00c \n"
230 "lrw r5, 0x4000a020 \n"
235 "lrw r5, 0x4000a020 \n"
242 "lrw r5, 0x4000a014 \n"
260 static uint32_t rsa_exptmod(const uint32_t *modulus, const uint32_t *exponent,
261 const uint32_t *base, uint32_t *out, uint32_t keywords,
265 if ((NULL == exponent) || (NULL == base) || (NULL == out)) {
269 #ifdef RSA_USING_ID2KEY
270 memcpy(tmp_c, g_acc, sizeof(g_acc));
275 /* clear and disable int */
278 rsa_setm_width(keywords >> 1);
279 rsa_loadm((uint32_t *)modulus, keywords);
281 rsa_setd_width(get_valid_bits(exponent, keywords, keywords) - 1);
282 rsa_loadd((uint32_t *)exponent, keywords);
284 rsa_setb_width(keywords >> 1);
285 rsa_loadb((uint32_t *)base, keywords);
287 #ifndef RSA_USING_ID2KEY
288 rsa_loadc(tmp_c, keywords);
290 rsa_loadc(g_acc, keywords);
295 while (!rsa_cal_q_done() && (!rsa_raise_exception()));
297 if (!rsa_raise_exception()) {
298 #if (CONFIG_PLATFORM_HOBBIT1_2 > 0)
299 ///////////////// FIXME ////////////////////////
300 if (rsa_run_adjust_sp_if_need(get_old_sp())) {
301 rsa_run_by_assemble();
305 while ((!rsa_opr_done()) && (rsa_loop_cnt() < MAX_RSA_LP_CNT) && (!rsa_raise_exception()));
306 #if (CONFIG_PLATFORM_HOBBIT1_2 > 0)
309 if ((rsa_loop_cnt() >= MAX_RSA_LP_CNT)
310 || rsa_raise_exception()) {
313 rsa_read_r(out, keywords);
325 static uint32_t get_valid_bits(const uint32_t *addr, uint32_t wordsize, uint32_t keywords)
330 for (i = wordsize; i > 0; i--) {
336 for (j = keywords; j > 0; j--) {
337 if (addr[i - 1] & (0x1 << (j - 1))) {
342 return ((i - 1) << 5) + j;
345 static uint32_t get_first_nonzero_words(uint32_t *a, uint32_t max_words)
349 for (i = max_words; i > 0; i--) {
358 static uint32_t word_array_left_shift(uint32_t *a, uint32_t words,
359 uint32_t shift_bits, uint32_t *r)
362 uint32_t w = shift_bits >> 5;
363 uint32_t b = shift_bits - (w << 5);
365 for (i = 0; i < w; i++) {
371 for (i = 0; i < words; i++) {
372 r[w + i] = (tmp | ((a[i] << b) & (~((0x1 << b) - 1))));
373 tmp = ((a[i] >> (32 - b)) & ((0x1 << b) - 1));
382 static uint32_t _word_array_sub(uint32_t *a, uint32_t a_words,
383 uint32_t *b, uint32_t b_words,
390 for (i = 0; i < b_words; i++) {
391 tmp = UINT32_TO_UINT64(a[i]) - UINT32_TO_UINT64(b[i]) - UINT32_TO_UINT64(borrow);
392 r[i] = UINT64L_TO_UINT32(tmp);
393 borrow = ((UINT64H_TO_UINT32(tmp) == 0) ? (0) : (0xffffffff - UINT64H_TO_UINT32(tmp) + 1));
396 for (i = b_words; i < a_words; i++) {
397 tmp = UINT32_TO_UINT64(a[i]) - UINT32_TO_UINT64(borrow);
398 r[i] = UINT64L_TO_UINT32(tmp);
399 borrow = ((UINT64H_TO_UINT32(tmp) == 0) ? (0) : (0xffffffff - UINT64H_TO_UINT32(tmp) + 1));
409 static uint32_t word_array_mod(uint32_t *a, uint32_t a_words,
410 uint32_t *b, uint32_t b_words,
411 uint32_t *r, uint32_t keywords)
417 memset(&tmpa, 0, sizeof(tmpa));
418 memset(&tmpb, 0, sizeof(tmpa));
420 uint32_t b_valid_bits = get_valid_bits(b, b_words, keywords);
422 memcpy(tmpa.pdata, a, (a_words << 2));
425 uint32_t tmpa_words = get_first_nonzero_words(tmpa.pdata, a_words);
426 uint32_t tmpa_valid_bits = get_valid_bits(tmpa.pdata, tmpa_words, keywords);
428 if (tmpa_valid_bits > b_valid_bits + 1) {
429 memset(tmpb.pdata, 0, (a_words << 2));
430 word_array_left_shift(b, b_words, tmpa_valid_bits - b_valid_bits - 1,
432 uint32_t tmpb_words = get_first_nonzero_words(tmpb.pdata, a_words);
433 ret = _word_array_sub(tmpa.pdata, tmpa_words, tmpb.pdata, tmpb_words, tmpa.pdata);
434 } else if (tmpa_words == b_words) {
435 memcpy(r, tmpa.pdata, (tmpa_words << 2));
436 ret = _word_array_sub(r, tmpa_words, b, b_words, tmpa.pdata);
438 ret = _word_array_sub(tmpa.pdata, tmpa_words, b, b_words, tmpa.pdata);
445 static uint32_t sw_exptmod_2_2m(const uint32_t *modulus, uint32_t words, uint32_t *tmp_c)
449 memset(&tmp, 0, sizeof(bignum_t));
451 uint32_t m_valid_bits = (words << 5);
453 uint32_t data1 = 0x1;
454 word_array_left_shift(&data1, 1, (m_valid_bits << 1), tmp.pdata);
455 tmp.words = get_first_nonzero_words(tmp.pdata, words * 2 + 1);
457 uint32_t ret = word_array_mod(tmp.pdata, tmp.words,
458 (uint32_t *)modulus, words, tmp_c, words);
467 static void convert_byte_array(uint8_t *in, uint8_t *out, uint32_t len)
469 uint32_t idx, round = len >> 1;
471 for (idx = 0; idx < round; idx++) {
472 uint8_t tmp = *(in + idx);
473 *(out + idx) = *(in + len - 1 - idx);
474 *(out + len - 1 - idx) = tmp;
478 *(out + round) = *(in + round);
482 static void convert_buf_to_bndata(const uint8_t *src, uint32_t src_bytes,
483 uint32_t *dst, uint32_t dst_words)
485 memset(dst, 0, dst_words << 2);
486 convert_byte_array((uint8_t *)src, (uint8_t *)dst, src_bytes);
489 static void convert_bndata_to_buf(const uint32_t *src, uint32_t src_words,
490 uint8_t *dst, uint32_t dst_bytes)
492 memset(dst, 0, dst_bytes);
493 convert_byte_array((uint8_t *)src, (uint8_t *)dst, dst_bytes);
496 static const uint8_t der_sha256_t[] = {
499 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, /* id-sha256 */
504 static const uint8_t der_sha1_t[] = {
507 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
512 static const uint8_t der_md5_t[] = {
513 0x30, 0x20, /* type Sequence, length 0x20 (32) */
514 0x30, 0x0c, /* type Sequence, length 0x09 */
515 0x06, 0x08, /* type OID, length 0x05 */
516 0x2a, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, /* id-md5 */
517 0x05, 0x00, /* NULL */
518 0x04, 0x10 /* Octet string, length 0x10 (16), followed by md5 hash */
521 static uint32_t rsa_padding_pkcs(uint8_t *dgst,
534 if (type == MD5_PADDING) {
535 der = (uint8_t *)der_md5_t;
536 der_len = sizeof(der_md5_t);
537 hashlen = MD5_HASH_SZ;
538 } else if (type == SHA256_PADDING) {
539 der = (uint8_t *)der_sha256_t;
540 der_len = sizeof(der_sha256_t);
541 hashlen = SHA256_HASH_SZ;
543 der = (uint8_t *)der_sha1_t;
544 der_len = sizeof(der_sha1_t);
545 hashlen = SHA1_HASH_SZ;
553 /* pad out with 0xff data */
554 pslen = keybytes - 3 - der_len - hashlen;
556 for (i = 0; i < pslen; i++) {
557 p[i] = 0xff; /* PS */
563 for (i = 0; i < der_len; i++) {
569 for (i = 0; i < hashlen; i++) {
576 static uint32_t rsa_checking_pkcs(uint8_t *dgst,
587 uint32_t der_len = 0;
588 uint32_t hashlen = 0;
591 if (type == MD5_PADDING) {
592 der = (uint8_t *)der_md5_t;
593 der_len = sizeof(der_md5_t);
594 hashlen = MD5_HASH_SZ;
595 } else if (type == SHA1_PADDING) {
596 der = (uint8_t *)der_sha1_t;
597 der_len = sizeof(der_sha1_t);
598 hashlen = SHA1_HASH_SZ;
599 } else if (type == SHA256_PADDING) {
600 der = (uint8_t *)der_sha256_t;
601 der_len = sizeof(der_sha256_t);
602 hashlen = SHA256_HASH_SZ;
607 pslen = keybytes - 3 - der_len - hashlen;
619 for (i = 0; i < pslen; i++) {
620 if (*(p + i) != 0xff) {
636 for (i = 0; i < der_len; i++) {
637 if (*(p + i) != der[i]) {
645 for (i = 0; i < hashlen; i++) {
646 if (*(p + i) != dgst[i]) {
660 static uint32_t rsa_padding_es_pkcs(uint8_t *dgst,
676 /* pad out with 0xff data */
677 pslen = keybytes - 3 - dgstlen;
679 for (i = 0; i < pslen; i++) {
680 p[i] = 0xff; /* PS */
686 for (i = 0; i < dgstlen; i++) {
693 static uint32_t rsa_checking_es_pkcs(uint8_t *out,
709 if (padding == PKCS1_PADDING) {
710 if (*(p++) != 0x02) {
714 if (*(p++) != 0x01) {
719 pslen = src_size - 2;
727 if (padding == PKCS1_PADDING) {
730 *out_size = keybytes;
733 for (i = 0; i < *out_size; i++) {
734 if (padding == PKCS1_PADDING) {
744 int rsa_encrypt(uint8_t *n, uint8_t *e,
745 uint8_t *src, uint32_t src_size,
746 uint8_t *out, uint32_t *out_size,
747 uint32_t padding, uint32_t keybits_len,
751 uint32_t tmp_n[RSA_KEY_WORD];
752 uint32_t tmp_e[RSA_KEY_WORD];
753 uint32_t tmp_in_out[RSA_KEY_WORD];
754 uint32_t keywords = 0, keybytes = 0;
756 keywords = GET_KEY_WORD(keybits_len);
757 keybytes = GET_KEY_BYTE(keybits_len);
759 convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
760 convert_buf_to_bndata(e, keybytes, tmp_e, keywords);
762 if (padding == PKCS1_PADDING) {
763 ret = rsa_padding_es_pkcs(src,
765 (uint8_t *)tmp_in_out,
773 convert_byte_array((uint8_t *)tmp_in_out, (uint8_t *)tmp_in_out, keybytes);
775 convert_byte_array((uint8_t *)src, (uint8_t *)tmp_in_out, keybytes);
778 ret = rsa_exptmod(tmp_n, tmp_e, tmp_in_out, tmp_in_out, keywords, tmp_c);
784 convert_bndata_to_buf(tmp_in_out, keywords, out, keybytes);
785 *out_size = keybytes;
789 int rsa_decrypt(uint8_t *n, uint8_t *d,
790 uint8_t *src, uint32_t src_size,
791 uint8_t *out, uint32_t *out_size,
792 uint32_t padding, uint32_t keybits_len,
796 uint32_t tmp_n[RSA_KEY_WORD];
797 uint32_t tmp_d[RSA_KEY_WORD];
798 uint32_t tmp_in_out[RSA_KEY_WORD];
799 uint32_t keywords = 0, keybytes = 0;
801 keywords = GET_KEY_WORD(keybits_len);
802 keybytes = GET_KEY_BYTE(keybits_len);
804 convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
805 convert_buf_to_bndata(d, keybytes, tmp_d, keywords);
806 convert_buf_to_bndata(src, src_size, tmp_in_out, keywords);
808 ret = rsa_exptmod(tmp_n, tmp_d, tmp_in_out, tmp_in_out, keywords, tmp_c);
814 convert_byte_array((uint8_t *)tmp_in_out, (uint8_t *)tmp_in_out, keybytes);
816 ret = rsa_checking_es_pkcs(out,
818 (uint8_t *)tmp_in_out,
826 int rsa_sign(uint8_t *n, uint8_t *d,
827 uint8_t *src, uint32_t src_size,
828 uint8_t *signature, uint32_t *sig_size,
829 uint32_t type, uint32_t keybits_len,
833 uint32_t tmp_n[RSA_KEY_WORD];
834 uint32_t tmp_d[RSA_KEY_WORD];
835 uint32_t tmp_in_out[RSA_KEY_WORD];
837 uint32_t keywords = 0, keybytes = 0;
839 keywords = GET_KEY_WORD(keybits_len);
840 keybytes = GET_KEY_BYTE(keybits_len);
842 convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
843 convert_buf_to_bndata(d, keybytes, tmp_d, keywords);
845 ret = rsa_padding_pkcs(src,
846 (uint8_t *)tmp_in_out,
854 convert_byte_array((uint8_t *)tmp_in_out, (uint8_t *)tmp_in_out, keybytes);
856 ret = rsa_exptmod(tmp_n, tmp_d, tmp_in_out, tmp_in_out, keywords, tmp_c);
862 convert_bndata_to_buf(tmp_in_out, keywords, signature, keybytes);
863 *sig_size = keybytes;
868 int rsa_verify(uint8_t *n, uint8_t *e,
869 uint8_t *src, uint32_t src_size,
870 uint8_t *signature, uint32_t sig_size,
871 uint32_t type, uint32_t keybits_len,
872 uint8_t *result, uint32_t *tmp_c)
875 uint32_t tmp_n[RSA_KEY_WORD];
876 uint32_t tmp_e[RSA_KEY_WORD];
877 uint32_t tmp_in_out[RSA_KEY_WORD];
878 uint32_t keywords = 0, keybytes = 0;
882 keywords = GET_KEY_WORD(keybits_len);
883 keybytes = GET_KEY_BYTE(keybits_len);
885 convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
886 convert_buf_to_bndata(e, keybytes, tmp_e, keywords);
887 convert_buf_to_bndata(signature, sig_size, tmp_in_out, keywords);
889 ret = rsa_exptmod(tmp_n, tmp_e, tmp_in_out, tmp_in_out, keywords, tmp_c);
895 convert_byte_array((uint8_t *)tmp_in_out, (uint8_t *)tmp_in_out, keybytes);
897 ret = rsa_checking_pkcs(src,
898 (uint8_t *)tmp_in_out,
907 static int rsa_sw_exptmod_2_2m(uint8_t *modulus, uint32_t keybits_len, uint32_t *tmp_c)
909 uint32_t keywords = 0, keybytes = 0;
910 uint32_t tmp_n[RSA_KEY_WORD];
912 keywords = GET_KEY_WORD(keybits_len);
913 keybytes = GET_KEY_BYTE(keybits_len);
915 convert_buf_to_bndata(modulus, keybytes, tmp_n, keywords);
917 sw_exptmod_2_2m(tmp_n, keywords, tmp_c);
921 int rsa_sw_calc_modulus(uint8_t *modulus, uint32_t keybits_len)
923 #ifdef RSA_USING_ID2KEY
924 static uint32_t current_keybits_len;
926 if (current_keybits_len != keybits_len) {
927 rsa_sw_exptmod_2_2m((uint8_t *)modulus, keybits_len, g_acc);
928 current_keybits_len = keybits_len;
936 \brief get rsa handle count.
937 \return rsa handle count
939 int32_t csi_rsa_get_instance_count(void)
941 return target_get_rsa_count();
945 \brief Initialize RSA Interface. 1. Initializes the resources needed for the RSA interface 2.registers event callback function
946 \param[in] idx must not exceed return value of csi_rsa_get_instance_count()
947 \param[in] cb_event Pointer to \ref rsa_event_cb_t
948 \return pointer to rsa handle
950 rsa_handle_t csi_rsa_initialize(int32_t idx, rsa_event_cb_t cb_event)
952 if (idx < 0 || idx >= CONFIG_RSA_NUM) {
956 /* obtain the rsa information */
959 int32_t real_idx = target_get_rsa(idx, &base, &irq);
961 if (real_idx != idx) {
965 ck_rsa_priv_t *rsa_priv = &rsa_handle[idx];
967 rsa_priv->base = base;
970 /* initialize the rsa context */
971 rsa_priv->cb = cb_event;
972 rsa_priv->data_bit = RSA_DATA_BITS_1024;
973 rsa_priv->endian = RSA_ENDIAN_MODE_LITTLE;
974 rsa_priv->padding.padding_type = RSA_PADDING_MODE_PKCS1;
975 rsa_priv->padding.hash_type = RSA_HASH_TYPE_SHA1;
976 rsa_priv->status.busy = 0;
978 #ifdef RSA_USING_ID2KEY
979 memset(g_acc, 0x0, sizeof(g_acc));
982 return (rsa_handle_t)rsa_priv;
986 \brief De-initialize RSA Interface. stops operation and releases the software resources used by the interface
987 \param[in] handle rsa handle to operate.
990 int32_t csi_rsa_uninitialize(rsa_handle_t handle)
992 RSA_NULL_PARAM_CHK(handle);
994 ck_rsa_priv_t *rsa_priv = handle;
1001 \brief Get driver capabilities.
1002 \param[in] handle rsa handle to operate.
1003 \return \ref rsa_capabilities_t
1005 rsa_capabilities_t csi_rsa_get_capabilities(rsa_handle_t handle)
1007 return driver_capabilities;
1011 \brief config rsa mode.
1012 \param[in] handle rsa handle to operate.
1013 \param[in] data_bits \ref rsa_data_bits_e
1014 \param[in] endian \ref rsa_endian_mode_e
1017 int32_t csi_rsa_config(rsa_handle_t handle,
1018 rsa_data_bits_e data_bits,
1019 rsa_endian_mode_e endian,
1023 RSA_NULL_PARAM_CHK(handle);
1025 ck_rsa_priv_t *rsa_priv = handle;
1026 rsa_reg = (ck_rsa_reg_t *)(rsa_priv->base);
1028 /* config the data bits */
1029 switch (data_bits) {
1030 case RSA_DATA_BITS_192:
1031 case RSA_DATA_BITS_256:
1032 case RSA_DATA_BITS_512:
1033 return ERR_RSA(EDRV_UNSUPPORTED);
1035 case RSA_DATA_BITS_1024:
1036 case RSA_DATA_BITS_2048:
1037 rsa_priv->data_bit = data_bits;
1041 return ERR_RSA(EDRV_PARAMETER);
1044 /* config the endian mode */
1045 if (endian == RSA_ENDIAN_MODE_LITTLE) {
1046 rsa_priv->endian = endian;
1047 } else if (endian == RSA_ENDIAN_MODE_BIG) {
1048 return ERR_RSA(EDRV_UNSUPPORTED);
1050 return ERR_RSA(EDRV_PARAMETER);
1054 #ifdef RSA_USING_ID2KEY
1055 uint32_t keybits_len = 1024;
1057 if (data_bits == RSA_DATA_BITS_2048) {
1061 rsa_sw_calc_modulus(arg, keybits_len);
1063 //memcpy(g_acc, arg, sizeof(g_acc));
1072 \param[in] handle rsa handle to operate.
1073 \param[in] n Pointer to the public modulus
1074 \param[in] e Pointer to the public exponent
1075 \param[in] src Pointer to the source data.
1076 \param[in] src_size the source data len
1077 \param[out] out Pointer to the result buffer
1078 \param[out] out_size the result size
1079 \param[in] padding \ref rsa_padding_t
1082 int32_t csi_rsa_encrypt(rsa_handle_t handle, void *n, void *e, void *src, int32_t src_size, void *out, uint32_t *out_size, rsa_padding_t padding)
1084 #ifndef RSA_USING_ID2KEY
1085 uint32_t tmp_c[RSA_KEY_WORD];
1087 RSA_NULL_PARAM_CHK(handle);
1088 RSA_NULL_PARAM_CHK(n);
1089 RSA_NULL_PARAM_CHK(e);
1090 RSA_NULL_PARAM_CHK(src);
1091 RSA_NULL_PARAM_CHK(out);
1092 RSA_NULL_PARAM_CHK(out_size);
1094 if (src_size <= 0 || (padding.padding_type != RSA_PADDING_MODE_PKCS1 && padding.padding_type != RSA_PADDING_MODE_NO)) {
1095 return ERR_RSA(EDRV_PARAMETER);
1098 ck_rsa_priv_t *rsa_priv = handle;
1099 rsa_priv->status.busy = 1U;
1101 uint32_t bit_length = 1024;
1103 if (rsa_priv->data_bit == RSA_DATA_BITS_2048) {
1107 #ifndef RSA_USING_ID2KEY
1108 rsa_sw_exptmod_2_2m(n, bit_length, tmp_c);
1111 rsa_encrypt((uint8_t *)n, (uint8_t *)e, (uint8_t *)src, (uint32_t)src_size, (uint8_t *)out, (uint32_t *)out_size, (uint32_t)(padding.padding_type), bit_length, tmp_c);
1112 rsa_priv->status.busy = 0U;
1115 rsa_priv->cb(RSA_EVENT_ENCRYPT_COMPLETE);
1123 \param[in] handle rsa handle to operate.
1124 \param[in] n Pointer to the public modulus
1125 \param[in] d Pointer to the privte exponent
1126 \param[in] src Pointer to the source data.
1127 \param[in] src_size the source data len
1128 \param[out] out Pointer to the result buffer
1129 \param[out] out_size the result size
1130 \param[in] padding \ref rsa_padding_t
1133 int32_t csi_rsa_decrypt(rsa_handle_t handle, void *n, void *d, void *src, uint32_t src_size, void *out, uint32_t *out_size, rsa_padding_t padding)
1135 #ifndef RSA_USING_ID2KEY
1136 uint32_t tmp_c[RSA_KEY_WORD];
1138 RSA_NULL_PARAM_CHK(handle);
1139 RSA_NULL_PARAM_CHK(n);
1140 RSA_NULL_PARAM_CHK(d);
1141 RSA_NULL_PARAM_CHK(src);
1142 RSA_NULL_PARAM_CHK(out);
1143 RSA_NULL_PARAM_CHK(out_size);
1145 if (src_size <= 0 || (padding.padding_type != RSA_PADDING_MODE_PKCS1 && padding.padding_type != RSA_PADDING_MODE_NO)) {
1146 return ERR_RSA(EDRV_PARAMETER);
1149 ck_rsa_priv_t *rsa_priv = handle;
1150 rsa_priv->status.busy = 1U;
1152 uint32_t bit_length = 1024;
1154 if (rsa_priv->data_bit == RSA_DATA_BITS_2048) {
1158 #ifndef RSA_USING_ID2KEY
1159 rsa_sw_exptmod_2_2m(n, bit_length, tmp_c);
1162 rsa_decrypt((uint8_t *)n, (uint8_t *)d, (uint8_t *)src, (uint32_t)src_size, (uint8_t *)out, (uint32_t *)out_size, (uint32_t)(padding.padding_type), bit_length, tmp_c);
1163 rsa_priv->status.busy = 0U;
1166 rsa_priv->cb(RSA_EVENT_DECRYPT_COMPLETE);
1174 \param[in] handle rsa handle to operate.
1175 \param[in] n Pointer to the public modulus
1176 \param[in] d Pointer to the privte exponent
1177 \param[in] src Pointer to the source data.
1178 \param[in] src_size the source data len
1179 \param[out] signature Pointer to the signature
1180 \param[out] sig_size the signature size
1181 \param[in] padding \ref rsa_padding_t
1184 int32_t csi_rsa_sign(rsa_handle_t handle, void *n, void *d, void *src, uint32_t src_size, void *signature, void *sig_size, rsa_padding_t padding)
1186 #ifndef RSA_USING_ID2KEY
1187 uint32_t tmp_c[RSA_KEY_WORD];
1189 RSA_NULL_PARAM_CHK(handle);
1190 RSA_NULL_PARAM_CHK(n);
1191 RSA_NULL_PARAM_CHK(d);
1192 RSA_NULL_PARAM_CHK(src);
1193 RSA_NULL_PARAM_CHK(signature);
1194 RSA_NULL_PARAM_CHK(sig_size);
1196 if (src_size <= 0 || (padding.hash_type != RSA_HASH_TYPE_MD5
1197 && padding.hash_type != RSA_HASH_TYPE_SHA1
1198 && padding.hash_type != RSA_HASH_TYPE_SHA256)) {
1199 return ERR_RSA(EDRV_PARAMETER);
1202 ck_rsa_priv_t *rsa_priv = handle;
1203 rsa_priv->status.busy = 1U;
1204 uint32_t bit_length = 1024;
1206 if (rsa_priv->data_bit == RSA_DATA_BITS_2048) {
1210 #ifndef RSA_USING_ID2KEY
1211 rsa_sw_exptmod_2_2m(n, bit_length, tmp_c);
1214 rsa_sign((uint8_t *)n, (uint8_t *)d, (uint8_t *)src, (uint32_t)src_size, (uint8_t *)signature, (uint32_t *)sig_size, (uint32_t)(padding.hash_type), bit_length, tmp_c);
1215 rsa_priv->status.busy = 0U;
1218 rsa_priv->cb(RSA_EVENT_SIGN_COMPLETE);
1226 \param[in] handle rsa handle to operate.
1227 \param[in] n Pointer to the public modulus
1228 \param[in] e Pointer to the public exponent
1229 \param[in] src Pointer to the source data.
1230 \param[in] src_size the source data len
1231 \param[in] signature Pointer to the signature
1232 \param[in] sig_size the signature size
1233 \param[out] result Pointer to the result
1234 \param[in] padding \ref rsa_padding_t
1237 int32_t csi_rsa_verify(rsa_handle_t handle, void *n, void *e, void *src, uint32_t src_size, void *signature, uint32_t sig_size, void *result, rsa_padding_t padding)
1239 #ifndef RSA_USING_ID2KEY
1240 uint32_t tmp_c[RSA_KEY_WORD];
1242 RSA_NULL_PARAM_CHK(handle);
1243 RSA_NULL_PARAM_CHK(n);
1244 RSA_NULL_PARAM_CHK(e);
1245 RSA_NULL_PARAM_CHK(src);
1246 RSA_NULL_PARAM_CHK(signature);
1247 RSA_NULL_PARAM_CHK(result);
1249 if (src_size <= 0 || sig_size <= 0 || (padding.hash_type != RSA_HASH_TYPE_MD5 && padding.hash_type != RSA_HASH_TYPE_SHA1 && padding.hash_type != RSA_HASH_TYPE_SHA256)) {
1250 return ERR_RSA(EDRV_PARAMETER);
1253 ck_rsa_priv_t *rsa_priv = handle;
1254 rsa_priv->status.busy = 1U;
1256 uint32_t bit_length = 1024;
1258 if (rsa_priv->data_bit == RSA_DATA_BITS_2048) {
1262 #ifndef RSA_USING_ID2KEY
1263 rsa_sw_exptmod_2_2m(n, bit_length, tmp_c);
1266 rsa_verify((uint8_t *)n, (uint8_t *)e, (uint8_t *)src, (uint32_t)src_size, (uint8_t *)signature, sig_size, (uint32_t)(padding.hash_type), bit_length, (uint8_t *)result, tmp_c);
1267 rsa_priv->status.busy = 0U;
1270 rsa_priv->cb(RSA_EVENT_VERIFY_COMPLETE);
1277 \brief Get RSA status.
1278 \param[in] handle rsa handle to operate.
1279 \return RSA status \ref rsa_status_t
1281 rsa_status_t csi_rsa_get_status(rsa_handle_t handle)
1283 ck_rsa_priv_t *rsa_priv = handle;
1284 return rsa_priv->status;