ck_rsa.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256
  1. /*
  2. * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
  3. *
  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
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  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.
  15. */
  16. /******************************************************************************
  17. * @file ck_rsa.c
  18. * @brief CSI Source File for RSA Driver
  19. * @version V1.0
  20. * @date 02. June 2017
  21. ******************************************************************************/
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include "drv_rsa.h"
  25. #include "ck_rsa.h"
  26. #define ERR_RSA(errno) (CSI_DRV_ERRNO_RSA_BASE | errno)
  27. #define RSA_NULL_PARAM_CHK(para) \
  28. do { \
  29. if (para == NULL) { \
  30. return ERR_RSA(EDRV_PARAMETER); \
  31. } \
  32. } while (0)
  33. typedef struct {
  34. uint32_t base;
  35. uint32_t irq;
  36. rsa_event_cb_t cb;
  37. rsa_data_bits_e data_bit;
  38. rsa_endian_mode_e endian;
  39. rsa_padding_t padding;
  40. rsa_status_t status;
  41. } ck_rsa_priv_t;
  42. static ck_rsa_priv_t rsa_handle[CONFIG_RSA_NUM];
  43. extern uint8_t modulus[];
  44. static ck_rsa_reg_t *rsa_reg = NULL;
  45. static uint32_t g_acc[RSA_KEY_WORD];
  46. /* Driver Capabilities */
  47. static const rsa_capabilities_t driver_capabilities = {
  48. .bits_192 = 1, /* 192bits modular mode */
  49. .bits_256 = 1, /* 256bits modular mode */
  50. .bits_512 = 1, /* 512bits modular mode */
  51. .bits_1024 = 1, /* 1024bits modular mode */
  52. .bits_2048 = 1 /* 2048bits modular mode */
  53. };
  54. //
  55. // Functions
  56. //
  57. static uint32_t sw_exptmod_2_2m(const uint32_t *modulus, uint32_t words, uint32_t *tmp_c);
  58. static uint32_t get_valid_bits(const uint32_t *addr, uint32_t wordsize);
  59. static uint32_t g_acc[RSA_KEY_WORD];
  60. static inline void rsa_clear_int(void)
  61. {
  62. rsa_reg->rsa_isr = 0xffff;
  63. rsa_reg->rsa_imr = 0x0000;
  64. }
  65. static inline void rsa_setm_width(uint32_t width)
  66. {
  67. rsa_reg->rsa_mwid = width;
  68. }
  69. static inline void rsa_setd_width(uint32_t width)
  70. {
  71. rsa_reg->rsa_ckid = width;
  72. }
  73. static inline void rsa_setb_width(uint32_t width)
  74. {
  75. rsa_reg->rsa_bwid = width;
  76. }
  77. static inline void rsa_cal_q(void)
  78. {
  79. rsa_reg->rsa_ctrl = RAS_CALCULATE_Q;
  80. }
  81. static inline void rsa_opr_start(void)
  82. {
  83. rsa_reg->rsa_ctrl = RSA_ENABLE_MODULE;
  84. }
  85. static inline void rsa_opr_reset(void)
  86. {
  87. rsa_reg->rsa_ctrl = RSA_ENDIAN_MODE;
  88. rsa_reg->rsa_rst |= RSA_RESET;
  89. while (rsa_reg->rsa_rst);
  90. }
  91. static inline uint32_t rsa_loop_cnt(void)
  92. {
  93. return rsa_reg->rsa_lp_cnt;
  94. }
  95. static inline uint32_t rsa_cal_q_done(void)
  96. {
  97. return (rsa_reg->rsa_isr >> RSA_CAL_Q_DONE_OFFSET) & 0x1;
  98. }
  99. static inline uint32_t rsa_opr_done(void)
  100. {
  101. return (rsa_reg->rsa_isr) & 0x1;
  102. }
  103. static inline uint32_t rsa_raise_exception(void)
  104. {
  105. return (rsa_reg->rsa_isr) & 0x1E;
  106. }
  107. static inline uint32_t rsa_loadm(uint32_t *data, uint32_t length)
  108. {
  109. uint32_t i;
  110. uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfm;
  111. for (i = 0; i < length; i++) {
  112. *(volatile uint32_t *)baseaddr = data[i];
  113. baseaddr = baseaddr + 4;
  114. }
  115. return 0;
  116. }
  117. static void rsa_loadd(uint32_t *data, uint32_t length)
  118. {
  119. uint32_t i;
  120. uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfd;
  121. for (i = 0; i < length; i++) {
  122. *(volatile uint32_t *)baseaddr = data[i];
  123. baseaddr = baseaddr + 4;
  124. }
  125. }
  126. static void rsa_loadc(uint32_t *data, uint32_t length)
  127. {
  128. uint32_t i;
  129. uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfc;
  130. for (i = 1; i < length + 1; i++) {
  131. *(volatile uint32_t *)baseaddr = data[i - 1];
  132. baseaddr = baseaddr + 4;
  133. }
  134. }
  135. static void rsa_loadb(uint32_t *data, uint32_t length)
  136. {
  137. uint32_t i;
  138. uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfb;
  139. for (i = 0; i < length; i++) {
  140. *(volatile uint32_t *)baseaddr = data[i];
  141. baseaddr = baseaddr + 4;
  142. }
  143. }
  144. static void rsa_read_r(uint32_t data[], uint32_t length)
  145. {
  146. uint32_t i;
  147. uint32_t baseaddr = (uint32_t)&rsa_reg->rsa_rfr;
  148. for (i = 0; i < length; i++) {
  149. data[i] = *(uint32_t *)baseaddr;
  150. baseaddr = baseaddr + 4;
  151. }
  152. }
  153. static uint32_t rsa_exptmod_1024(const uint32_t *modulus, const uint32_t *exponent,
  154. const uint32_t *base, uint32_t *out)
  155. {
  156. #ifndef RSA_USING_MALLOC
  157. #ifndef RSA_USING_ID2KEY
  158. uint32_t tmp_c[RSA_KEY_WORD];
  159. #endif
  160. uint32_t ret = 0;
  161. if ((NULL == exponent) || (NULL == base) || (NULL == out)) {
  162. return 1;
  163. }
  164. #ifndef RSA_USING_ID2KEY
  165. ret = sw_exptmod_2_2m(modulus, RSA_KEY_WORD, tmp_c);
  166. if (ret != 0) {
  167. return ret;
  168. }
  169. #endif
  170. /* reset for safe */
  171. rsa_opr_reset();
  172. /* clear and disable int */
  173. rsa_clear_int();
  174. /* set m */
  175. rsa_setm_width(RSA_KEY_WORD >> 1);
  176. rsa_loadm((uint32_t *)modulus, RSA_KEY_WORD);
  177. /* set d */
  178. rsa_setd_width(get_valid_bits(exponent, RSA_KEY_WORD) - 1);
  179. rsa_loadd((uint32_t *)exponent, RSA_KEY_WORD);
  180. /* set b */
  181. rsa_setb_width(RSA_KEY_WORD >> 1);
  182. rsa_loadb((uint32_t *)base, RSA_KEY_WORD);
  183. /* set c */
  184. #ifndef RSA_USING_ID2KEY
  185. rsa_loadc(tmp_c, RSA_KEY_WORD);
  186. #else
  187. rsa_loadc(g_acc, RSA_KEY_WORD);
  188. #endif
  189. rsa_cal_q();
  190. while (!rsa_cal_q_done() && (!rsa_raise_exception()));
  191. if (!rsa_raise_exception()) {
  192. rsa_opr_start();
  193. while ((!rsa_opr_done()) && (rsa_loop_cnt() < MAX_RSA_LP_CNT) && (!rsa_raise_exception()));
  194. if ((rsa_loop_cnt() >= MAX_RSA_LP_CNT)
  195. || rsa_raise_exception()) {
  196. ret = 1;
  197. } else {
  198. rsa_read_r(out, RSA_KEY_WORD);
  199. }
  200. } else {
  201. ret = 1;
  202. }
  203. rsa_opr_reset();
  204. return ret;
  205. #else
  206. uint32_t ret;
  207. uint32_t *tmp_c = (uint32_t *)tee_malloc(RSA_KEY_BYTE);
  208. if (tmp_c == NULL) {
  209. return -1;
  210. }
  211. if ((NULL == modulus) || (NULL == exponent) || (NULL == base) || (NULL == out)) {
  212. return -1;
  213. }
  214. #if 0
  215. ret = sw_exptmod_2_2m(modulus, RSA_KEY_WORD, tmp_c);
  216. if (ret != 0) {
  217. tee_free(tmp_c);
  218. return ret;
  219. }
  220. #else
  221. memcpy(tmp_c, g_acc, RSA_KEY_BYTE);
  222. #endif
  223. /* reset for safe */
  224. rsa_opr_reset();
  225. /* clear and disable int */
  226. rsa_clear_int();
  227. /* set m */
  228. rsa_setm_width(RSA_KEY_WORD >> 1);
  229. rsa_loadm((uint32_t *)modulus, RSA_KEY_WORD);
  230. /* set d */
  231. rsa_setd_width(get_valid_bits(exponent, RSA_KEY_WORD) - 1);
  232. rsa_loadd((uint32_t *)exponent, RSA_KEY_WORD);
  233. /* set b */
  234. rsa_setb_width(RSA_KEY_WORD >> 1);
  235. rsa_loadb((uint32_t *)base, RSA_KEY_WORD);
  236. /* set c */
  237. rsa_loadc(tmp_c, RSA_KEY_WORD);
  238. rsa_cal_q();
  239. while (!rsa_cal_q_done() && (!rsa_raise_exception()));
  240. if (!rsa_raise_exception()) {
  241. rsa_opr_start();
  242. while ((!rsa_opr_done()) && (rsa_loop_cnt() < MAX_RSA_LP_CNT) && (!rsa_raise_exception()));
  243. if ((rsa_loop_cnt() >= MAX_RSA_LP_CNT)
  244. || rsa_raise_exception()) {
  245. ret = 1;
  246. } else {
  247. rsa_read_r(out, RSA_KEY_WORD);
  248. }
  249. } else {
  250. ret = 1;
  251. }
  252. rsa_opr_reset();
  253. tee_free(tmp_c);
  254. return ret;
  255. #endif
  256. }
  257. static uint32_t get_valid_bits(const uint32_t *addr, uint32_t wordsize)
  258. {
  259. uint32_t i = 0;
  260. uint32_t j = 0;
  261. for (i = wordsize; i > 0; i--) {
  262. if (addr[i - 1]) {
  263. break;
  264. }
  265. }
  266. for (j = RSA_KEY_WORD; j > 0; j--) {
  267. if (addr[i - 1] & (0x1 << (j - 1))) {
  268. break;
  269. }
  270. }
  271. return ((i - 1) << 5) + j;
  272. }
  273. static uint32_t get_first_nonzero_words(uint32_t *a, uint32_t max_words)
  274. {
  275. uint32_t i = 0;
  276. for (i = max_words; i > 0; i--) {
  277. if (a[i - 1]) {
  278. return i;
  279. }
  280. }
  281. return 0;
  282. }
  283. static uint32_t word_array_left_shift(uint32_t *a, uint32_t words,
  284. uint32_t shift_bits, uint32_t *r)
  285. {
  286. uint32_t i = 0;
  287. uint32_t w = shift_bits >> 5;
  288. uint32_t b = shift_bits - (w << 5);
  289. for (i = 0; i < w; i++) {
  290. r[i] = 0;
  291. }
  292. uint32_t tmp = 0;
  293. for (i = 0; i < words; i++) {
  294. r[w + i] = (tmp | ((a[i] << b) & (~((0x1 << b) - 1))));
  295. tmp = ((a[i] >> (RSA_KEY_WORD - b)) & ((0x1 << b) - 1));
  296. }
  297. r[w + i] = tmp;
  298. return 0;
  299. }
  300. /* r = a - b */
  301. static uint32_t _word_array_sub(uint32_t *a, uint32_t a_words,
  302. uint32_t *b, uint32_t b_words,
  303. uint32_t *r)
  304. {
  305. uint32_t i;
  306. uint64_t tmp = 0;
  307. uint32_t borrow = 0;
  308. for (i = 0; i < b_words; i++) {
  309. tmp = UINT32_TO_UINT64(a[i]) - UINT32_TO_UINT64(b[i]) - UINT32_TO_UINT64(borrow);
  310. r[i] = UINT64L_TO_UINT32(tmp);
  311. borrow = ((UINT64H_TO_UINT32(tmp) == 0) ? (0) : (0xffffffff - UINT64H_TO_UINT32(tmp) + 1));
  312. }
  313. for (i = b_words; i < a_words; i++) {
  314. tmp = UINT32_TO_UINT64(a[i]) - UINT32_TO_UINT64(borrow);
  315. r[i] = UINT64L_TO_UINT32(tmp);
  316. borrow = ((UINT64H_TO_UINT32(tmp) == 0) ? (0) : (0xffffffff - UINT64H_TO_UINT32(tmp) + 1));
  317. }
  318. if (borrow) {
  319. return -1;
  320. }
  321. return 0;
  322. }
  323. static uint32_t word_array_mod(uint32_t *a, uint32_t a_words,
  324. uint32_t *b, uint32_t b_words,
  325. uint32_t *r)
  326. {
  327. #ifndef RSA_USING_MALLOC
  328. uint32_t ret;
  329. bignum_t tmpa;
  330. bignum_t tmpb;
  331. memset(&tmpa, 0, sizeof(tmpa));
  332. memset(&tmpb, 0, sizeof(tmpa));
  333. uint32_t b_valid_bits = get_valid_bits(b, b_words);
  334. memcpy(tmpa.pdata, a, (a_words << 2));
  335. do {
  336. uint32_t tmpa_words = get_first_nonzero_words(tmpa.pdata, a_words);
  337. uint32_t tmpa_valid_bits = get_valid_bits(tmpa.pdata, tmpa_words);
  338. if (tmpa_valid_bits > b_valid_bits + 1) {
  339. memset(tmpb.pdata, 0, (a_words << 2));
  340. word_array_left_shift(b, b_words, tmpa_valid_bits - b_valid_bits - 1,
  341. tmpb.pdata);
  342. uint32_t tmpb_words = get_first_nonzero_words(tmpb.pdata, a_words);
  343. ret = _word_array_sub(tmpa.pdata, tmpa_words, tmpb.pdata, tmpb_words, tmpa.pdata);
  344. } else if (tmpa_words == b_words) {
  345. memcpy(r, tmpa.pdata, (tmpa_words << 2));
  346. ret = _word_array_sub(r, tmpa_words, b, b_words, tmpa.pdata);
  347. } else {
  348. ret = _word_array_sub(tmpa.pdata, tmpa_words, b, b_words, tmpa.pdata);
  349. }
  350. } while (ret == 0);
  351. return 0;
  352. #else
  353. uint32_t ret;
  354. bignum_t *tmpa = tee_malloc(sizeof(bignum_t));
  355. bignum_t *tmpb = tee_malloc(sizeof(bignum_t));
  356. if ((tmpa == NULL) || (tmpb == NULL)) {
  357. return -1;
  358. }
  359. uint32_t b_valid_bits = get_valid_bits(b, b_words);
  360. memcpy(tmpa->pdata, a, (a_words << 2));
  361. do {
  362. uint32_t tmpa_words = get_first_nonzero_words(tmpa->pdata, a_words);
  363. uint32_t tmpa_valid_bits = get_valid_bits(tmpa->pdata, tmpa_words);
  364. if (tmpa_valid_bits > b_valid_bits + 1) {
  365. memset(tmpb->pdata, 0, (a_words << 2));
  366. word_array_left_shift(b, b_words, tmpa_valid_bits - b_valid_bits - 1,
  367. tmpb->pdata);
  368. uint32_t tmpb_words = get_first_nonzero_words(tmpb->pdata, a_words);
  369. ret = _word_array_sub(tmpa->pdata, tmpa_words, tmpb->pdata, tmpb_words, tmpa->pdata);
  370. } else if (tmpa_words == b_words) {
  371. memcpy(r, tmpa->pdata, (tmpa_words << 2));
  372. ret = _word_array_sub(r, tmpa_words, b, b_words, tmpa->pdata);
  373. } else {
  374. ret = _word_array_sub(tmpa->pdata, tmpa_words, b, b_words, tmpa->pdata);
  375. }
  376. } while (ret == 0);
  377. tee_free(tmpa);
  378. tee_free(tmpb);
  379. return 0;
  380. #endif
  381. }
  382. static uint32_t sw_exptmod_2_2m(const uint32_t *modulus, uint32_t words, uint32_t *tmp_c)
  383. {
  384. #ifndef RSA_USING_MALLOC
  385. bignum_t tmp;
  386. memset(&tmp, 0, sizeof(bignum_t));
  387. uint32_t m_valid_bits = (words << 5);
  388. uint32_t data1 = 0x1;
  389. word_array_left_shift(&data1, 1, (m_valid_bits << 1), tmp.pdata);
  390. tmp.words = get_first_nonzero_words(tmp.pdata, words * 2 + 1);
  391. uint32_t ret = word_array_mod(tmp.pdata, tmp.words,
  392. (uint32_t *)modulus, words, tmp_c);
  393. if (ret != 0) {
  394. return ret;
  395. }
  396. return 0;
  397. #else
  398. bignum_t *tmp = tee_malloc(sizeof(bignum_t));
  399. if (tmp == NULL) {
  400. return -1;
  401. }
  402. uint32_t m_valid_bits = (words << 5);
  403. uint32_t data1 = 0x1;
  404. word_array_left_shift(&data1, 1, (m_valid_bits << 1), tmp->pdata);
  405. tmp->words = get_first_nonzero_words(tmp->pdata, words * 2 + 1);
  406. uint32_t ret = word_array_mod(tmp->pdata, tmp->words,
  407. (uint32_t *)modulus, words, tmp_c);
  408. if (ret != 0) {
  409. tee_free(tmp);
  410. return ret;
  411. }
  412. tee_free(tmp);
  413. return 0;
  414. #endif
  415. }
  416. static void convert_byte_array(uint8_t *in, uint8_t *out, uint32_t len)
  417. {
  418. uint32_t idx, round = len >> 1;
  419. for (idx = 0; idx < round; idx++) {
  420. uint8_t tmp = *(in + idx);
  421. *(out + idx) = *(in + len - 1 - idx);
  422. *(out + len - 1 - idx) = tmp;
  423. }
  424. if (len & 0x1) {
  425. *(out + round) = *(in + round);
  426. }
  427. }
  428. static void convert_buf_to_bndata(const uint8_t *src, uint32_t src_bytes,
  429. uint32_t *dst, uint32_t dst_words)
  430. {
  431. memset(dst, 0, dst_words << 2);
  432. convert_byte_array((uint8_t *)src, (uint8_t *)dst, src_bytes);
  433. }
  434. static void convert_bndata_to_buf(const uint32_t *src, uint32_t src_words,
  435. uint8_t *dst, uint32_t dst_bytes)
  436. {
  437. memset(dst, 0, dst_bytes);
  438. convert_byte_array((uint8_t *)src, (uint8_t *)dst, dst_bytes);
  439. }
  440. static const uint8_t der_sha1_t[] = {
  441. 0x30, 0x21,
  442. 0x30, 0x09,
  443. 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
  444. 0x05, 0x00,
  445. 0x04, 0x14
  446. };
  447. static const uint8_t der_md5_t[] = {
  448. 0x30, 0x20, /* type Sequence, length 0x20 (32) */
  449. 0x30, 0x0c, /* type Sequence, length 0x09 */
  450. 0x06, 0x08, /* type OID, length 0x05 */
  451. 0x2a, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, /* id-md5 */
  452. 0x05, 0x00, /* NULL */
  453. 0x04, 0x10 /* Octet string, length 0x10 (16), followed by md5 hash */
  454. };
  455. static uint32_t RSA_padding_add_PKCS1_sha1_emsa_1024(const uint8_t *dgst,
  456. uint8_t *out,
  457. uint32_t *outlen,
  458. uint32_t type)
  459. {
  460. uint8_t *der;
  461. uint32_t der_len;
  462. uint32_t hashlen;
  463. if (type == MD5_PADDING) {
  464. der = (uint8_t *)der_md5_t;
  465. der_len = sizeof(der_md5_t);
  466. hashlen = MD5_HASH_SZ;
  467. } else if (type == SHA1_PADDING) {
  468. der = (uint8_t *)der_sha1_t;
  469. der_len = sizeof(der_sha1_t);
  470. hashlen = SHA1_HASH_SZ;
  471. } else {
  472. der = (uint8_t *)der_md5_t;
  473. der_len = sizeof(der_md5_t);
  474. hashlen = MD5_HASH_SZ;
  475. }
  476. uint32_t modulus_len = 1024 >> 3;
  477. if (*outlen < modulus_len) {
  478. *outlen = modulus_len;
  479. return -1;
  480. }
  481. uint8_t *p = (uint8_t *)out;
  482. *(p++) = 0x00;
  483. *(p++) = 0x01;
  484. /* pad out with 0xff data */
  485. uint32_t pslen = modulus_len - 3 - der_len - hashlen;
  486. uint32_t i;
  487. for (i = 0; i < pslen; i++) {
  488. p[i] = 0xff; /* PS */
  489. }
  490. p += pslen;
  491. *(p++) = 0x0;
  492. for (i = 0; i < der_len; i++) {
  493. p[i] = der[i];
  494. }
  495. p += der_len;
  496. for (i = 0; i < hashlen; i++) {
  497. p[i] = dgst[i];
  498. }
  499. *outlen = modulus_len;
  500. return 0;
  501. }
  502. static uint32_t RSA_padding_check_PKCS1_type_emsa(const uint8_t *dgst,
  503. const uint8_t *in,
  504. const uint32_t inlen,
  505. uint8_t *is_valid,
  506. uint32_t type)
  507. {
  508. uint8_t *der;
  509. uint32_t der_len;
  510. uint32_t hashlen;
  511. if (type == MD5_PADDING) {
  512. der = (uint8_t *)der_md5_t;
  513. der_len = sizeof(der_md5_t);
  514. hashlen = MD5_HASH_SZ;
  515. } else if (type == SHA1_PADDING) {
  516. der = (uint8_t *)der_sha1_t;
  517. der_len = sizeof(der_sha1_t);
  518. hashlen = SHA1_HASH_SZ;
  519. } else {
  520. der = (uint8_t *)der_md5_t;
  521. der_len = sizeof(der_md5_t);
  522. hashlen = MD5_HASH_SZ;
  523. }
  524. uint32_t modulus_len = RSA_KEY_LEN >> 3;
  525. if (inlen != modulus_len) {
  526. return -1;
  527. }
  528. *is_valid = 0;
  529. uint32_t pslen = modulus_len - 3 - der_len - hashlen;
  530. const uint8_t *p = in;
  531. p++;
  532. uint32_t ret;
  533. if (*(p) != 0x01) {
  534. ret = -1;
  535. goto _verify_fail;
  536. }
  537. p++;
  538. /* scan PS */
  539. uint32_t i;
  540. for (i = 0; i < pslen; i++) {
  541. if (*(p + i) != 0xff) {
  542. ret = -1;
  543. goto _verify_fail;
  544. }
  545. }
  546. p += pslen;
  547. if ((*p) != 0x00) {
  548. ret = -1;
  549. goto _verify_fail;
  550. }
  551. p++;
  552. /* scan t */
  553. for (i = 0; i < der_len; i++) {
  554. if (*(p + i) != der[i]) {
  555. ret = -1;
  556. goto _verify_fail;
  557. }
  558. }
  559. p += der_len;
  560. for (i = 0; i < hashlen; i++) {
  561. if (*(p + i) != dgst[i]) {
  562. ret = -1;
  563. goto _verify_fail;
  564. }
  565. }
  566. *is_valid = 1;
  567. ret = 0;
  568. _verify_fail:
  569. return ret;
  570. }
  571. static uint32_t RSA_ES_padding_add_PKCS1_emsa_1024(const uint8_t *dgst,
  572. uint32_t dgstlen,
  573. uint8_t *out,
  574. uint32_t *outlen,
  575. uint32_t padding)
  576. {
  577. uint32_t modulus_len = RSA_KEY_LEN >> 3;
  578. if (*outlen < modulus_len) {
  579. *outlen = modulus_len;
  580. return 1;
  581. }
  582. uint8_t *p = (uint8_t *)out;
  583. *(p++) = 0x00;
  584. *(p++) = 0x02;
  585. /* pad out with 0xff data */
  586. uint32_t pslen = modulus_len - 3 - dgstlen;
  587. uint32_t i;
  588. for (i = 0; i < pslen; i++) {
  589. p[i] = 0xff; /* PS */
  590. }
  591. p += pslen;
  592. *(p++) = 0x0;
  593. for (i = 0; i < dgstlen; i++) {
  594. p[i] = dgst[i];
  595. }
  596. *outlen = modulus_len;
  597. return 0;
  598. }
  599. static uint32_t RSA_ES_padding_check_PKCS1_type_emsa(uint8_t *out, uint32_t *out_size,
  600. uint8_t *src, uint32_t src_size, uint32_t padding)
  601. {
  602. uint32_t modulus_len = RSA_KEY_LEN >> 3;
  603. if (src_size < modulus_len) {
  604. return 1;
  605. }
  606. uint8_t *p = (uint8_t *)src;
  607. uint8_t *p_src = p;
  608. *(p++) = 0x00;
  609. if (padding == PKCS1_PADDING) {
  610. if (*(p++) != 0x02) {
  611. return 1;
  612. }
  613. } else {
  614. if (*(p++) != 0x01) {
  615. return 1;
  616. }
  617. }
  618. uint32_t pslen = src_size - 2;
  619. while (pslen--) {
  620. if (*(p++) == 0x0) {
  621. break;
  622. }
  623. }
  624. if (padding == PKCS1_PADDING) {
  625. *out_size = pslen;
  626. } else {
  627. *out_size = modulus_len;
  628. }
  629. uint32_t i;
  630. for (i = 0; i < *out_size; i++) {
  631. if (padding == PKCS1_PADDING) {
  632. out[i] = p[i];
  633. } else {
  634. out[i] = p_src[i];
  635. }
  636. }
  637. return 0;
  638. }
  639. int rsa_encrypt(uint8_t *n, uint8_t *e,
  640. uint8_t *src, uint32_t src_size,
  641. uint8_t *out, uint32_t *out_size,
  642. uint32_t padding)
  643. {
  644. uint32_t ret;
  645. uint32_t tmp_n[RSA_KEY_WORD];
  646. uint32_t tmp_e[RSA_KEY_WORD];
  647. uint32_t tmp_src_padded[RSA_KEY_WORD];
  648. uint32_t tmp_out[RSA_KEY_WORD];
  649. uint32_t keywords = RSA_KEY_WORD;
  650. uint32_t keybytes = RSA_KEY_BYTE;
  651. convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
  652. convert_buf_to_bndata(e, keybytes, tmp_e, keywords);
  653. uint32_t tmp_src_padded_len = keybytes;
  654. if (padding == PKCS1_PADDING) {
  655. ret = RSA_ES_padding_add_PKCS1_emsa_1024((const uint8_t *)src, src_size,
  656. (uint8_t *)tmp_src_padded,
  657. &tmp_src_padded_len, padding);
  658. if (ret != 0) {
  659. return ret;
  660. }
  661. convert_byte_array((uint8_t *)tmp_src_padded, (uint8_t *)tmp_src_padded, tmp_src_padded_len);
  662. } else {
  663. convert_byte_array((uint8_t *)src, (uint8_t *)tmp_src_padded, tmp_src_padded_len);
  664. }
  665. ret = rsa_exptmod_1024(tmp_n, tmp_e, tmp_src_padded, tmp_out);
  666. if (ret != 0) {
  667. return ret;
  668. }
  669. convert_bndata_to_buf(tmp_out, keywords, out, keybytes);
  670. *out_size = keybytes;
  671. return ret;
  672. }
  673. int rsa_decrypt(uint8_t *n, uint8_t *d,
  674. uint8_t *src, uint32_t src_size,
  675. uint8_t *out, uint32_t *out_size,
  676. uint32_t padding)
  677. {
  678. uint32_t ret;
  679. uint32_t tmp_n[RSA_KEY_WORD];
  680. uint32_t tmp_d[RSA_KEY_WORD];
  681. uint32_t tmp_dst_padded[RSA_KEY_WORD];
  682. uint32_t tmp_sig[RSA_KEY_WORD];
  683. uint32_t keywords = RSA_KEY_WORD;
  684. uint32_t keybytes = RSA_KEY_BYTE;
  685. convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
  686. convert_buf_to_bndata(d, keybytes, tmp_d, keywords);
  687. convert_buf_to_bndata(src, src_size, tmp_sig, keywords);
  688. ret = rsa_exptmod_1024(tmp_n, tmp_d, tmp_sig, tmp_dst_padded);
  689. \
  690. if (ret != 0) {
  691. return ret;
  692. }
  693. convert_byte_array((uint8_t *)tmp_dst_padded,
  694. (uint8_t *)tmp_dst_padded, keybytes);
  695. ret = RSA_ES_padding_check_PKCS1_type_emsa(out, out_size,
  696. (uint8_t *)tmp_dst_padded,
  697. keybytes, padding);
  698. return ret;
  699. }
  700. int rsa_sign(uint8_t *n, uint8_t *d,
  701. uint8_t *src, uint32_t src_size,
  702. uint8_t *signature, uint32_t *sig_size, uint32_t type)
  703. {
  704. uint32_t ret;
  705. uint32_t tmp_n[RSA_KEY_WORD];
  706. uint32_t tmp_d[RSA_KEY_WORD];
  707. uint32_t tmp_src_padded[RSA_KEY_WORD];
  708. uint32_t tmp_sig[RSA_KEY_WORD];
  709. uint32_t keywords = RSA_KEY_WORD;
  710. uint32_t keybytes = RSA_KEY_BYTE;
  711. convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
  712. convert_buf_to_bndata(d, keybytes, tmp_d, keywords);
  713. uint32_t tmp_src_padded_len = keybytes;
  714. ret = RSA_padding_add_PKCS1_sha1_emsa_1024((const uint8_t *)src,
  715. (uint8_t *)tmp_src_padded,
  716. &tmp_src_padded_len, type);
  717. if (ret != 0) {
  718. return ret;
  719. }
  720. convert_byte_array((uint8_t *)tmp_src_padded, (uint8_t *)tmp_src_padded, keybytes);
  721. ret = rsa_exptmod_1024(tmp_n, tmp_d, tmp_src_padded, tmp_sig);
  722. if (ret != 0) {
  723. return ret;
  724. }
  725. convert_bndata_to_buf(tmp_sig, keywords, signature, keybytes);
  726. *sig_size = RSA_KEY_BYTE;
  727. return 0;
  728. }
  729. int rsa_verify(uint8_t *n, uint8_t *e,
  730. uint8_t *src, uint32_t src_size,
  731. uint8_t *signature, uint32_t sig_size,
  732. uint8_t *result, uint32_t type)
  733. {
  734. uint32_t ret;
  735. uint32_t tmp_n[RSA_KEY_WORD];
  736. uint32_t tmp_e[RSA_KEY_WORD];
  737. uint32_t tmp_dst_padded[RSA_KEY_WORD];
  738. uint32_t tmp_sig[RSA_KEY_WORD];
  739. *result = 0;
  740. uint32_t keywords = RSA_KEY_WORD;
  741. uint32_t keybytes = RSA_KEY_BYTE;
  742. convert_buf_to_bndata(n, keybytes, tmp_n, keywords);
  743. convert_buf_to_bndata(e, keybytes, tmp_e, keywords);
  744. convert_buf_to_bndata(signature, sig_size, tmp_sig, keywords);
  745. ret = rsa_exptmod_1024(tmp_n, tmp_e, tmp_sig, tmp_dst_padded);
  746. if (ret != 0) {
  747. return ret;
  748. }
  749. convert_byte_array((uint8_t *)tmp_dst_padded,
  750. (uint8_t *)tmp_dst_padded, keybytes);
  751. ret = RSA_padding_check_PKCS1_type_emsa(src,
  752. (const uint8_t *)tmp_dst_padded,
  753. keybytes,
  754. result,
  755. type);
  756. return ret;
  757. }
  758. int rsa_sw_exptmod_2_2m(uint8_t *modulus)
  759. {
  760. uint32_t tmp_n[RSA_KEY_WORD];
  761. uint32_t keywords = RSA_KEY_WORD;
  762. uint32_t keybytes = RSA_KEY_BYTE;
  763. convert_buf_to_bndata(modulus, keybytes, tmp_n, keywords);
  764. sw_exptmod_2_2m(tmp_n, RSA_KEY_WORD, g_acc);
  765. return 0;
  766. }
  767. int32_t __attribute__((weak)) target_get_rsa_count(void)
  768. {
  769. return 0;
  770. }
  771. int32_t __attribute__((weak)) target_get_rsa(int32_t idx, uint32_t *base, uint32_t *irq)
  772. {
  773. return NULL;
  774. }
  775. /**
  776. \brief get rsa handle count.
  777. \return rsa handle count
  778. */
  779. int32_t csi_rsa_get_instance_count(void)
  780. {
  781. return target_get_rsa_count();
  782. }
  783. /**
  784. \brief Initialize RSA Interface. 1. Initializes the resources needed for the RSA interface 2.registers event callback function
  785. \param[in] idx must not exceed return value of csi_rsa_get_instance_count()
  786. \param[in] cb_event Pointer to \ref rsa_event_cb_t
  787. \return pointer to rsa handle
  788. */
  789. rsa_handle_t csi_rsa_initialize(int32_t idx, rsa_event_cb_t cb_event)
  790. {
  791. if (idx < 0 || idx >= CONFIG_RSA_NUM) {
  792. return NULL;
  793. }
  794. /* obtain the rsa information */
  795. uint32_t base = 0u;
  796. uint32_t irq;
  797. int32_t real_idx = target_get_rsa(idx, &base, &irq);
  798. if (real_idx != idx) {
  799. return NULL;
  800. }
  801. ck_rsa_priv_t *rsa_priv = &rsa_handle[idx];
  802. rsa_priv->base = base;
  803. rsa_priv->irq = irq;
  804. /* initialize the rsa context */
  805. rsa_priv->cb = cb_event;
  806. rsa_priv->data_bit = RSA_DATA_BITS_1024;
  807. rsa_priv->endian = RSA_ENDIAN_MODE_LITTLE;
  808. rsa_priv->padding.padding_type = RSA_PADDING_MODE_PKCS1;
  809. rsa_priv->padding.hash_type = RSA_HASH_TYPE_SHA1;
  810. rsa_priv->status.busy = 0;
  811. return (rsa_handle_t)rsa_priv;
  812. }
  813. /**
  814. \brief De-initialize RSA Interface. stops operation and releases the software resources used by the interface
  815. \param[in] handle rsa handle to operate.
  816. \return error code
  817. */
  818. int32_t csi_rsa_uninitialize(rsa_handle_t handle)
  819. {
  820. RSA_NULL_PARAM_CHK(handle);
  821. ck_rsa_priv_t *rsa_priv = handle;
  822. rsa_priv->cb = NULL;
  823. return 0;
  824. }
  825. /**
  826. \brief Get driver capabilities.
  827. \param[in] handle rsa handle to operate.
  828. \return \ref rsa_capabilities_t
  829. */
  830. rsa_capabilities_t csi_rsa_get_capabilities(rsa_handle_t handle)
  831. {
  832. return driver_capabilities;
  833. }
  834. /**
  835. \brief config rsa mode.
  836. \param[in] handle rsa handle to operate.
  837. \param[in] data_bits \ref rsa_data_bits_e
  838. \param[in] endian \ref rsa_endian_mode_e
  839. \return error code
  840. */
  841. int32_t csi_rsa_config(rsa_handle_t handle,
  842. rsa_data_bits_e data_bits,
  843. rsa_endian_mode_e endian
  844. )
  845. {
  846. RSA_NULL_PARAM_CHK(handle);
  847. ck_rsa_priv_t *rsa_priv = handle;
  848. rsa_reg = (ck_rsa_reg_t *)(rsa_priv->base);
  849. /* config the data bits */
  850. switch (data_bits) {
  851. case RSA_DATA_BITS_192:
  852. case RSA_DATA_BITS_256:
  853. case RSA_DATA_BITS_512:
  854. case RSA_DATA_BITS_2048:
  855. return ERR_RSA(EDRV_UNSUPPORTED);
  856. case RSA_DATA_BITS_1024:
  857. rsa_priv->data_bit = data_bits;
  858. break;
  859. default:
  860. return ERR_RSA(EDRV_PARAMETER);
  861. }
  862. /* config the endian mode */
  863. if (endian == RSA_ENDIAN_MODE_LITTLE) {
  864. rsa_priv->endian = endian;
  865. } else if (endian == RSA_ENDIAN_MODE_BIG) {
  866. return ERR_RSA(EDRV_UNSUPPORTED);
  867. } else {
  868. return ERR_RSA(EDRV_PARAMETER);
  869. }
  870. return 0;
  871. }
  872. /**
  873. \brief encrypt
  874. \param[in] handle rsa handle to operate.
  875. \param[in] n Pointer to the public modulus
  876. \param[in] e Pointer to the public exponent
  877. \param[in] src Pointer to the source data.
  878. \param[in] src_size the source data len
  879. \param[out] out Pointer to the result buffer
  880. \param[out] out_size the result size
  881. \param[in] padding \ref rsa_padding_t
  882. \return error code
  883. */
  884. 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)
  885. {
  886. RSA_NULL_PARAM_CHK(handle);
  887. RSA_NULL_PARAM_CHK(n);
  888. RSA_NULL_PARAM_CHK(e);
  889. RSA_NULL_PARAM_CHK(src);
  890. RSA_NULL_PARAM_CHK(out);
  891. RSA_NULL_PARAM_CHK(out_size);
  892. if (src_size <= 0 || (padding.padding_type != RSA_PADDING_MODE_PKCS1 && padding.padding_type != RSA_PADDING_MODE_NO)) {
  893. return ERR_RSA(EDRV_PARAMETER);
  894. }
  895. ck_rsa_priv_t *rsa_priv = handle;
  896. rsa_priv->status.busy = 1U;
  897. 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));
  898. rsa_priv->status.busy = 0U;
  899. if (rsa_priv->cb) {
  900. rsa_priv->cb(RSA_EVENT_ENCRYPT_COMPLETE);
  901. }
  902. return 0;
  903. }
  904. /**
  905. \brief decrypt
  906. \param[in] handle rsa handle to operate.
  907. \param[in] n Pointer to the public modulus
  908. \param[in] d Pointer to the privte exponent
  909. \param[in] src Pointer to the source data.
  910. \param[in] src_size the source data len
  911. \param[out] out Pointer to the result buffer
  912. \param[out] out_size the result size
  913. \param[in] padding \ref rsa_padding_t
  914. \return error code
  915. */
  916. 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)
  917. {
  918. RSA_NULL_PARAM_CHK(handle);
  919. RSA_NULL_PARAM_CHK(n);
  920. RSA_NULL_PARAM_CHK(d);
  921. RSA_NULL_PARAM_CHK(src);
  922. RSA_NULL_PARAM_CHK(out);
  923. RSA_NULL_PARAM_CHK(out_size);
  924. if (src_size <= 0 || (padding.padding_type != RSA_PADDING_MODE_PKCS1 && padding.padding_type != RSA_PADDING_MODE_NO)) {
  925. return ERR_RSA(EDRV_PARAMETER);
  926. }
  927. ck_rsa_priv_t *rsa_priv = handle;
  928. rsa_priv->status.busy = 1U;
  929. 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));
  930. rsa_priv->status.busy = 0U;
  931. if (rsa_priv->cb) {
  932. rsa_priv->cb(RSA_EVENT_DECRYPT_COMPLETE);
  933. }
  934. return 0;
  935. }
  936. /**
  937. \brief rsa sign
  938. \param[in] handle rsa handle to operate.
  939. \param[in] n Pointer to the public modulus
  940. \param[in] d Pointer to the privte exponent
  941. \param[in] src Pointer to the source data.
  942. \param[in] src_size the source data len
  943. \param[out] signature Pointer to the signature
  944. \param[out] sig_size the signature size
  945. \param[in] padding \ref rsa_padding_t
  946. \return error code
  947. */
  948. 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)
  949. {
  950. RSA_NULL_PARAM_CHK(handle);
  951. RSA_NULL_PARAM_CHK(n);
  952. RSA_NULL_PARAM_CHK(d);
  953. RSA_NULL_PARAM_CHK(src);
  954. RSA_NULL_PARAM_CHK(signature);
  955. RSA_NULL_PARAM_CHK(sig_size);
  956. if (src_size <= 0 || (padding.hash_type != RSA_HASH_TYPE_MD5 && padding.hash_type != RSA_HASH_TYPE_SHA1)) {
  957. return ERR_RSA(EDRV_PARAMETER);
  958. }
  959. ck_rsa_priv_t *rsa_priv = handle;
  960. rsa_priv->status.busy = 1U;
  961. 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));
  962. rsa_priv->status.busy = 0U;
  963. if (rsa_priv->cb) {
  964. rsa_priv->cb(RSA_EVENT_SIGN_COMPLETE);
  965. }
  966. return 0;
  967. }
  968. /**
  969. \brief rsa verify
  970. \param[in] handle rsa handle to operate.
  971. \param[in] n Pointer to the public modulus
  972. \param[in] e Pointer to the public exponent
  973. \param[in] src Pointer to the source data.
  974. \param[in] src_size the source data len
  975. \param[in] signature Pointer to the signature
  976. \param[in] sig_size the signature size
  977. \param[out] result Pointer to the result
  978. \param[in] padding \ref rsa_padding_t
  979. \return error code
  980. */
  981. 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)
  982. {
  983. RSA_NULL_PARAM_CHK(handle);
  984. RSA_NULL_PARAM_CHK(n);
  985. RSA_NULL_PARAM_CHK(e);
  986. RSA_NULL_PARAM_CHK(src);
  987. RSA_NULL_PARAM_CHK(signature);
  988. RSA_NULL_PARAM_CHK(result);
  989. if (src_size <= 0 || sig_size <= 0 || (padding.hash_type != RSA_HASH_TYPE_MD5 && padding.hash_type != RSA_HASH_TYPE_SHA1)) {
  990. return ERR_RSA(EDRV_PARAMETER);
  991. }
  992. ck_rsa_priv_t *rsa_priv = handle;
  993. rsa_priv->status.busy = 1U;
  994. rsa_verify((uint8_t *)n, (uint8_t *)e, (uint8_t *)src, (uint32_t)src_size, (uint8_t *)signature, sig_size, (uint8_t *)result, (uint32_t)(padding.hash_type));
  995. rsa_priv->status.busy = 0U;
  996. if (rsa_priv->cb) {
  997. rsa_priv->cb(RSA_EVENT_VERIFY_COMPLETE);
  998. }
  999. return 0;
  1000. }
  1001. /**
  1002. \brief Get RSA status.
  1003. \param[in] handle rsa handle to operate.
  1004. \return RSA status \ref rsa_status_t
  1005. */
  1006. rsa_status_t csi_rsa_get_status(rsa_handle_t handle)
  1007. {
  1008. ck_rsa_priv_t *rsa_priv = handle;
  1009. return rsa_priv->status;
  1010. }