xref: /openbmc/u-boot/lib/rsa/rsa-sign.c (revision 87a62bce)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2013, Google Inc.
4  */
5 
6 #include "mkimage.h"
7 #include <stdio.h>
8 #include <string.h>
9 #include <image.h>
10 #include <time.h>
11 #include <openssl/bn.h>
12 #include <openssl/rsa.h>
13 #include <openssl/pem.h>
14 #include <openssl/err.h>
15 #include <openssl/ssl.h>
16 #include <openssl/evp.h>
17 #include <openssl/engine.h>
18 
19 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
20 #define HAVE_ERR_REMOVE_THREAD_STATE
21 #endif
22 
23 #if OPENSSL_VERSION_NUMBER < 0x10100000L
24 static void RSA_get0_key(const RSA *r,
25                  const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
26 {
27    if (n != NULL)
28        *n = r->n;
29    if (e != NULL)
30        *e = r->e;
31    if (d != NULL)
32        *d = r->d;
33 }
34 #endif
35 
36 static int rsa_err(const char *msg)
37 {
38 	unsigned long sslErr = ERR_get_error();
39 
40 	fprintf(stderr, "%s", msg);
41 	fprintf(stderr, ": %s\n",
42 		ERR_error_string(sslErr, 0));
43 
44 	return -1;
45 }
46 
47 /**
48  * rsa_pem_get_pub_key() - read a public key from a .crt file
49  *
50  * @keydir:	Directory containins the key
51  * @name	Name of key file (will have a .crt extension)
52  * @rsap	Returns RSA object, or NULL on failure
53  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
54  */
55 static int rsa_pem_get_pub_key(const char *keydir, const char *name, RSA **rsap)
56 {
57 	char path[1024];
58 	EVP_PKEY *key;
59 	X509 *cert;
60 	RSA *rsa;
61 	FILE *f;
62 	int ret;
63 
64 	*rsap = NULL;
65 	snprintf(path, sizeof(path), "%s/%s.crt", keydir, name);
66 	f = fopen(path, "r");
67 	if (!f) {
68 		fprintf(stderr, "Couldn't open RSA certificate: '%s': %s\n",
69 			path, strerror(errno));
70 		return -EACCES;
71 	}
72 
73 	/* Read the certificate */
74 	cert = NULL;
75 	if (!PEM_read_X509(f, &cert, NULL, NULL)) {
76 		rsa_err("Couldn't read certificate");
77 		ret = -EINVAL;
78 		goto err_cert;
79 	}
80 
81 	/* Get the public key from the certificate. */
82 	key = X509_get_pubkey(cert);
83 	if (!key) {
84 		rsa_err("Couldn't read public key\n");
85 		ret = -EINVAL;
86 		goto err_pubkey;
87 	}
88 
89 	/* Convert to a RSA_style key. */
90 	rsa = EVP_PKEY_get1_RSA(key);
91 	if (!rsa) {
92 		rsa_err("Couldn't convert to a RSA style key");
93 		ret = -EINVAL;
94 		goto err_rsa;
95 	}
96 	fclose(f);
97 	EVP_PKEY_free(key);
98 	X509_free(cert);
99 	*rsap = rsa;
100 
101 	return 0;
102 
103 err_rsa:
104 	EVP_PKEY_free(key);
105 err_pubkey:
106 	X509_free(cert);
107 err_cert:
108 	fclose(f);
109 	return ret;
110 }
111 
112 /**
113  * rsa_engine_get_pub_key() - read a public key from given engine
114  *
115  * @keydir:	Key prefix
116  * @name	Name of key
117  * @engine	Engine to use
118  * @rsap	Returns RSA object, or NULL on failure
119  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
120  */
121 static int rsa_engine_get_pub_key(const char *keydir, const char *name,
122 				  ENGINE *engine, RSA **rsap)
123 {
124 	const char *engine_id;
125 	char key_id[1024];
126 	EVP_PKEY *key;
127 	RSA *rsa;
128 	int ret;
129 
130 	*rsap = NULL;
131 
132 	engine_id = ENGINE_get_id(engine);
133 
134 	if (engine_id && !strcmp(engine_id, "pkcs11")) {
135 		if (keydir)
136 			snprintf(key_id, sizeof(key_id),
137 				 "pkcs11:%s;object=%s;type=public",
138 				 keydir, name);
139 		else
140 			snprintf(key_id, sizeof(key_id),
141 				 "pkcs11:object=%s;type=public",
142 				 name);
143 	} else {
144 		fprintf(stderr, "Engine not supported\n");
145 		return -ENOTSUP;
146 	}
147 
148 	key = ENGINE_load_public_key(engine, key_id, NULL, NULL);
149 	if (!key)
150 		return rsa_err("Failure loading public key from engine");
151 
152 	/* Convert to a RSA_style key. */
153 	rsa = EVP_PKEY_get1_RSA(key);
154 	if (!rsa) {
155 		rsa_err("Couldn't convert to a RSA style key");
156 		ret = -EINVAL;
157 		goto err_rsa;
158 	}
159 
160 	EVP_PKEY_free(key);
161 	*rsap = rsa;
162 
163 	return 0;
164 
165 err_rsa:
166 	EVP_PKEY_free(key);
167 	return ret;
168 }
169 
170 /**
171  * rsa_get_pub_key() - read a public key
172  *
173  * @keydir:	Directory containing the key (PEM file) or key prefix (engine)
174  * @name	Name of key file (will have a .crt extension)
175  * @engine	Engine to use
176  * @rsap	Returns RSA object, or NULL on failure
177  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
178  */
179 static int rsa_get_pub_key(const char *keydir, const char *name,
180 			   ENGINE *engine, RSA **rsap)
181 {
182 	if (engine)
183 		return rsa_engine_get_pub_key(keydir, name, engine, rsap);
184 	return rsa_pem_get_pub_key(keydir, name, rsap);
185 }
186 
187 /**
188  * rsa_pem_get_priv_key() - read a private key from a .key file
189  *
190  * @keydir:	Directory containing the key
191  * @name	Name of key file (will have a .key extension)
192  * @rsap	Returns RSA object, or NULL on failure
193  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
194  */
195 static int rsa_pem_get_priv_key(const char *keydir, const char *name,
196 				RSA **rsap)
197 {
198 	char path[1024];
199 	RSA *rsa;
200 	FILE *f;
201 
202 	*rsap = NULL;
203 	snprintf(path, sizeof(path), "%s/%s.key", keydir, name);
204 	f = fopen(path, "r");
205 	if (!f) {
206 		fprintf(stderr, "Couldn't open RSA private key: '%s': %s\n",
207 			path, strerror(errno));
208 		return -ENOENT;
209 	}
210 
211 	rsa = PEM_read_RSAPrivateKey(f, 0, NULL, path);
212 	if (!rsa) {
213 		rsa_err("Failure reading private key");
214 		fclose(f);
215 		return -EPROTO;
216 	}
217 	fclose(f);
218 	*rsap = rsa;
219 
220 	return 0;
221 }
222 
223 /**
224  * rsa_engine_get_priv_key() - read a private key from given engine
225  *
226  * @keydir:	Key prefix
227  * @name	Name of key
228  * @engine	Engine to use
229  * @rsap	Returns RSA object, or NULL on failure
230  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
231  */
232 static int rsa_engine_get_priv_key(const char *keydir, const char *name,
233 				   ENGINE *engine, RSA **rsap)
234 {
235 	const char *engine_id;
236 	char key_id[1024];
237 	EVP_PKEY *key;
238 	RSA *rsa;
239 	int ret;
240 
241 	*rsap = NULL;
242 
243 	engine_id = ENGINE_get_id(engine);
244 
245 	if (engine_id && !strcmp(engine_id, "pkcs11")) {
246 		if (keydir)
247 			snprintf(key_id, sizeof(key_id),
248 				 "pkcs11:%s;object=%s;type=private",
249 				 keydir, name);
250 		else
251 			snprintf(key_id, sizeof(key_id),
252 				 "pkcs11:object=%s;type=private",
253 				 name);
254 	} else {
255 		fprintf(stderr, "Engine not supported\n");
256 		return -ENOTSUP;
257 	}
258 
259 	key = ENGINE_load_private_key(engine, key_id, NULL, NULL);
260 	if (!key)
261 		return rsa_err("Failure loading private key from engine");
262 
263 	/* Convert to a RSA_style key. */
264 	rsa = EVP_PKEY_get1_RSA(key);
265 	if (!rsa) {
266 		rsa_err("Couldn't convert to a RSA style key");
267 		ret = -EINVAL;
268 		goto err_rsa;
269 	}
270 
271 	EVP_PKEY_free(key);
272 	*rsap = rsa;
273 
274 	return 0;
275 
276 err_rsa:
277 	EVP_PKEY_free(key);
278 	return ret;
279 }
280 
281 /**
282  * rsa_get_priv_key() - read a private key
283  *
284  * @keydir:	Directory containing the key (PEM file) or key prefix (engine)
285  * @name	Name of key
286  * @engine	Engine to use for signing
287  * @rsap	Returns RSA object, or NULL on failure
288  * @return 0 if ok, -ve on error (in which case *rsap will be set to NULL)
289  */
290 static int rsa_get_priv_key(const char *keydir, const char *name,
291 			    ENGINE *engine, RSA **rsap)
292 {
293 	if (engine)
294 		return rsa_engine_get_priv_key(keydir, name, engine, rsap);
295 	return rsa_pem_get_priv_key(keydir, name, rsap);
296 }
297 
298 static int rsa_init(void)
299 {
300 	int ret;
301 
302 #if OPENSSL_VERSION_NUMBER < 0x10100000L
303 	ret = SSL_library_init();
304 #else
305 	ret = OPENSSL_init_ssl(0, NULL);
306 #endif
307 	if (!ret) {
308 		fprintf(stderr, "Failure to init SSL library\n");
309 		return -1;
310 	}
311 #if OPENSSL_VERSION_NUMBER < 0x10100000L
312 	SSL_load_error_strings();
313 
314 	OpenSSL_add_all_algorithms();
315 	OpenSSL_add_all_digests();
316 	OpenSSL_add_all_ciphers();
317 #endif
318 
319 	return 0;
320 }
321 
322 static int rsa_engine_init(const char *engine_id, ENGINE **pe)
323 {
324 	ENGINE *e;
325 	int ret;
326 
327 	ENGINE_load_builtin_engines();
328 
329 	e = ENGINE_by_id(engine_id);
330 	if (!e) {
331 		fprintf(stderr, "Engine isn't available\n");
332 		ret = -1;
333 		goto err_engine_by_id;
334 	}
335 
336 	if (!ENGINE_init(e)) {
337 		fprintf(stderr, "Couldn't initialize engine\n");
338 		ret = -1;
339 		goto err_engine_init;
340 	}
341 
342 	if (!ENGINE_set_default_RSA(e)) {
343 		fprintf(stderr, "Couldn't set engine as default for RSA\n");
344 		ret = -1;
345 		goto err_set_rsa;
346 	}
347 
348 	*pe = e;
349 
350 	return 0;
351 
352 err_set_rsa:
353 	ENGINE_finish(e);
354 err_engine_init:
355 	ENGINE_free(e);
356 err_engine_by_id:
357 #if OPENSSL_VERSION_NUMBER < 0x10100000L
358 	ENGINE_cleanup();
359 #endif
360 	return ret;
361 }
362 
363 static void rsa_remove(void)
364 {
365 #if OPENSSL_VERSION_NUMBER < 0x10100000L
366 	CRYPTO_cleanup_all_ex_data();
367 	ERR_free_strings();
368 #ifdef HAVE_ERR_REMOVE_THREAD_STATE
369 	ERR_remove_thread_state(NULL);
370 #else
371 	ERR_remove_state(0);
372 #endif
373 	EVP_cleanup();
374 #endif
375 }
376 
377 static void rsa_engine_remove(ENGINE *e)
378 {
379 	if (e) {
380 		ENGINE_finish(e);
381 		ENGINE_free(e);
382 	}
383 }
384 
385 static int rsa_sign_with_key(RSA *rsa, struct checksum_algo *checksum_algo,
386 		const struct image_region region[], int region_count,
387 		uint8_t **sigp, uint *sig_size)
388 {
389 	EVP_PKEY *key;
390 	EVP_MD_CTX *context;
391 	int size, ret = 0;
392 	uint8_t *sig;
393 	int i;
394 
395 	key = EVP_PKEY_new();
396 	if (!key)
397 		return rsa_err("EVP_PKEY object creation failed");
398 
399 	if (!EVP_PKEY_set1_RSA(key, rsa)) {
400 		ret = rsa_err("EVP key setup failed");
401 		goto err_set;
402 	}
403 
404 	size = EVP_PKEY_size(key);
405 	sig = malloc(size);
406 	if (!sig) {
407 		fprintf(stderr, "Out of memory for signature (%d bytes)\n",
408 			size);
409 		ret = -ENOMEM;
410 		goto err_alloc;
411 	}
412 
413 	context = EVP_MD_CTX_create();
414 	if (!context) {
415 		ret = rsa_err("EVP context creation failed");
416 		goto err_create;
417 	}
418 	EVP_MD_CTX_init(context);
419 	if (!EVP_SignInit(context, checksum_algo->calculate_sign())) {
420 		ret = rsa_err("Signer setup failed");
421 		goto err_sign;
422 	}
423 
424 	for (i = 0; i < region_count; i++) {
425 		if (!EVP_SignUpdate(context, region[i].data, region[i].size)) {
426 			ret = rsa_err("Signing data failed");
427 			goto err_sign;
428 		}
429 	}
430 
431 	if (!EVP_SignFinal(context, sig, sig_size, key)) {
432 		ret = rsa_err("Could not obtain signature");
433 		goto err_sign;
434 	}
435 	#if OPENSSL_VERSION_NUMBER < 0x10100000L
436 		EVP_MD_CTX_cleanup(context);
437 	#else
438 		EVP_MD_CTX_reset(context);
439 	#endif
440 	EVP_MD_CTX_destroy(context);
441 	EVP_PKEY_free(key);
442 
443 	debug("Got signature: %d bytes, expected %d\n", *sig_size, size);
444 	*sigp = sig;
445 	*sig_size = size;
446 
447 	return 0;
448 
449 err_sign:
450 	EVP_MD_CTX_destroy(context);
451 err_create:
452 	free(sig);
453 err_alloc:
454 err_set:
455 	EVP_PKEY_free(key);
456 	return ret;
457 }
458 
459 int rsa_sign(struct image_sign_info *info,
460 	     const struct image_region region[], int region_count,
461 	     uint8_t **sigp, uint *sig_len)
462 {
463 	RSA *rsa;
464 	ENGINE *e = NULL;
465 	int ret;
466 
467 	ret = rsa_init();
468 	if (ret)
469 		return ret;
470 
471 	if (info->engine_id) {
472 		ret = rsa_engine_init(info->engine_id, &e);
473 		if (ret)
474 			goto err_engine;
475 	}
476 
477 	ret = rsa_get_priv_key(info->keydir, info->keyname, e, &rsa);
478 	if (ret)
479 		goto err_priv;
480 	ret = rsa_sign_with_key(rsa, info->checksum, region,
481 				region_count, sigp, sig_len);
482 	if (ret)
483 		goto err_sign;
484 
485 	RSA_free(rsa);
486 	if (info->engine_id)
487 		rsa_engine_remove(e);
488 	rsa_remove();
489 
490 	return ret;
491 
492 err_sign:
493 	RSA_free(rsa);
494 err_priv:
495 	if (info->engine_id)
496 		rsa_engine_remove(e);
497 err_engine:
498 	rsa_remove();
499 	return ret;
500 }
501 
502 /*
503  * rsa_get_exponent(): - Get the public exponent from an RSA key
504  */
505 static int rsa_get_exponent(RSA *key, uint64_t *e)
506 {
507 	int ret;
508 	BIGNUM *bn_te;
509 	const BIGNUM *key_e;
510 	uint64_t te;
511 
512 	ret = -EINVAL;
513 	bn_te = NULL;
514 
515 	if (!e)
516 		goto cleanup;
517 
518 	RSA_get0_key(key, NULL, &key_e, NULL);
519 	if (BN_num_bits(key_e) > 64)
520 		goto cleanup;
521 
522 	*e = BN_get_word(key_e);
523 
524 	if (BN_num_bits(key_e) < 33) {
525 		ret = 0;
526 		goto cleanup;
527 	}
528 
529 	bn_te = BN_dup(key_e);
530 	if (!bn_te)
531 		goto cleanup;
532 
533 	if (!BN_rshift(bn_te, bn_te, 32))
534 		goto cleanup;
535 
536 	if (!BN_mask_bits(bn_te, 32))
537 		goto cleanup;
538 
539 	te = BN_get_word(bn_te);
540 	te <<= 32;
541 	*e |= te;
542 	ret = 0;
543 
544 cleanup:
545 	if (bn_te)
546 		BN_free(bn_te);
547 
548 	return ret;
549 }
550 
551 /*
552  * rsa_get_params(): - Get the important parameters of an RSA public key
553  */
554 int rsa_get_params(RSA *key, uint64_t *exponent, uint32_t *n0_invp,
555 		   BIGNUM **modulusp, BIGNUM **r_squaredp)
556 {
557 	BIGNUM *big1, *big2, *big32, *big2_32;
558 	BIGNUM *n, *r, *r_squared, *tmp;
559 	const BIGNUM *key_n;
560 	BN_CTX *bn_ctx = BN_CTX_new();
561 	int ret = 0;
562 
563 	/* Initialize BIGNUMs */
564 	big1 = BN_new();
565 	big2 = BN_new();
566 	big32 = BN_new();
567 	r = BN_new();
568 	r_squared = BN_new();
569 	tmp = BN_new();
570 	big2_32 = BN_new();
571 	n = BN_new();
572 	if (!big1 || !big2 || !big32 || !r || !r_squared || !tmp || !big2_32 ||
573 	    !n) {
574 		fprintf(stderr, "Out of memory (bignum)\n");
575 		return -ENOMEM;
576 	}
577 
578 	if (0 != rsa_get_exponent(key, exponent))
579 		ret = -1;
580 
581 	RSA_get0_key(key, &key_n, NULL, NULL);
582 	if (!BN_copy(n, key_n) || !BN_set_word(big1, 1L) ||
583 	    !BN_set_word(big2, 2L) || !BN_set_word(big32, 32L))
584 		ret = -1;
585 
586 	/* big2_32 = 2^32 */
587 	if (!BN_exp(big2_32, big2, big32, bn_ctx))
588 		ret = -1;
589 
590 	/* Calculate n0_inv = -1 / n[0] mod 2^32 */
591 	if (!BN_mod_inverse(tmp, n, big2_32, bn_ctx) ||
592 	    !BN_sub(tmp, big2_32, tmp))
593 		ret = -1;
594 	*n0_invp = BN_get_word(tmp);
595 
596 	/* Calculate R = 2^(# of key bits) */
597 	if (!BN_set_word(tmp, BN_num_bits(n)) ||
598 	    !BN_exp(r, big2, tmp, bn_ctx))
599 		ret = -1;
600 
601 	/* Calculate r_squared = R^2 mod n */
602 	if (!BN_copy(r_squared, r) ||
603 	    !BN_mul(tmp, r_squared, r, bn_ctx) ||
604 	    !BN_mod(r_squared, tmp, n, bn_ctx))
605 		ret = -1;
606 
607 	*modulusp = n;
608 	*r_squaredp = r_squared;
609 
610 	BN_free(big1);
611 	BN_free(big2);
612 	BN_free(big32);
613 	BN_free(r);
614 	BN_free(tmp);
615 	BN_free(big2_32);
616 	if (ret) {
617 		fprintf(stderr, "Bignum operations failed\n");
618 		return -ENOMEM;
619 	}
620 
621 	return ret;
622 }
623 
624 static int fdt_add_bignum(void *blob, int noffset, const char *prop_name,
625 			  BIGNUM *num, int num_bits)
626 {
627 	int nwords = num_bits / 32;
628 	int size;
629 	uint32_t *buf, *ptr;
630 	BIGNUM *tmp, *big2, *big32, *big2_32;
631 	BN_CTX *ctx;
632 	int ret;
633 
634 	tmp = BN_new();
635 	big2 = BN_new();
636 	big32 = BN_new();
637 	big2_32 = BN_new();
638 	if (!tmp || !big2 || !big32 || !big2_32) {
639 		fprintf(stderr, "Out of memory (bignum)\n");
640 		return -ENOMEM;
641 	}
642 	ctx = BN_CTX_new();
643 	if (!tmp) {
644 		fprintf(stderr, "Out of memory (bignum context)\n");
645 		return -ENOMEM;
646 	}
647 	BN_set_word(big2, 2L);
648 	BN_set_word(big32, 32L);
649 	BN_exp(big2_32, big2, big32, ctx); /* B = 2^32 */
650 
651 	size = nwords * sizeof(uint32_t);
652 	buf = malloc(size);
653 	if (!buf) {
654 		fprintf(stderr, "Out of memory (%d bytes)\n", size);
655 		return -ENOMEM;
656 	}
657 
658 	/* Write out modulus as big endian array of integers */
659 	for (ptr = buf + nwords - 1; ptr >= buf; ptr--) {
660 		BN_mod(tmp, num, big2_32, ctx); /* n = N mod B */
661 		*ptr = cpu_to_fdt32(BN_get_word(tmp));
662 		BN_rshift(num, num, 32); /*  N = N/B */
663 	}
664 
665 	/*
666 	 * We try signing with successively increasing size values, so this
667 	 * might fail several times
668 	 */
669 	ret = fdt_setprop(blob, noffset, prop_name, buf, size);
670 	if (ret)
671 		return -FDT_ERR_NOSPACE;
672 	free(buf);
673 	BN_free(tmp);
674 	BN_free(big2);
675 	BN_free(big32);
676 	BN_free(big2_32);
677 
678 	return ret;
679 }
680 
681 int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
682 {
683 	BIGNUM *modulus, *r_squared;
684 	uint64_t exponent;
685 	uint32_t n0_inv;
686 	int parent, node;
687 	char name[100];
688 	int ret;
689 	int bits;
690 	RSA *rsa;
691 	ENGINE *e = NULL;
692 
693 	debug("%s: Getting verification data\n", __func__);
694 	if (info->engine_id) {
695 		ret = rsa_engine_init(info->engine_id, &e);
696 		if (ret)
697 			return ret;
698 	}
699 	ret = rsa_get_pub_key(info->keydir, info->keyname, e, &rsa);
700 	if (ret)
701 		goto err_get_pub_key;
702 	ret = rsa_get_params(rsa, &exponent, &n0_inv, &modulus, &r_squared);
703 	if (ret)
704 		goto err_get_params;
705 	bits = BN_num_bits(modulus);
706 	parent = fdt_subnode_offset(keydest, 0, FIT_SIG_NODENAME);
707 	if (parent == -FDT_ERR_NOTFOUND) {
708 		parent = fdt_add_subnode(keydest, 0, FIT_SIG_NODENAME);
709 		if (parent < 0) {
710 			ret = parent;
711 			if (ret != -FDT_ERR_NOSPACE) {
712 				fprintf(stderr, "Couldn't create signature node: %s\n",
713 					fdt_strerror(parent));
714 			}
715 		}
716 	}
717 	if (ret)
718 		goto done;
719 
720 	/* Either create or overwrite the named key node */
721 	snprintf(name, sizeof(name), "key-%s", info->keyname);
722 	node = fdt_subnode_offset(keydest, parent, name);
723 	if (node == -FDT_ERR_NOTFOUND) {
724 		node = fdt_add_subnode(keydest, parent, name);
725 		if (node < 0) {
726 			ret = node;
727 			if (ret != -FDT_ERR_NOSPACE) {
728 				fprintf(stderr, "Could not create key subnode: %s\n",
729 					fdt_strerror(node));
730 			}
731 		}
732 	} else if (node < 0) {
733 		fprintf(stderr, "Cannot select keys parent: %s\n",
734 			fdt_strerror(node));
735 		ret = node;
736 	}
737 
738 	if (!ret) {
739 		ret = fdt_setprop_string(keydest, node, "key-name-hint",
740 				 info->keyname);
741 	}
742 	if (!ret)
743 		ret = fdt_setprop_u32(keydest, node, "rsa,num-bits", bits);
744 	if (!ret)
745 		ret = fdt_setprop_u32(keydest, node, "rsa,n0-inverse", n0_inv);
746 	if (!ret) {
747 		ret = fdt_setprop_u64(keydest, node, "rsa,exponent", exponent);
748 	}
749 	if (!ret) {
750 		ret = fdt_add_bignum(keydest, node, "rsa,modulus", modulus,
751 				     bits);
752 	}
753 	if (!ret) {
754 		ret = fdt_add_bignum(keydest, node, "rsa,r-squared", r_squared,
755 				     bits);
756 	}
757 	if (!ret) {
758 		ret = fdt_setprop_string(keydest, node, FIT_ALGO_PROP,
759 					 info->name);
760 	}
761 	if (!ret && info->require_keys) {
762 		ret = fdt_setprop_string(keydest, node, "required",
763 					 info->require_keys);
764 	}
765 done:
766 	BN_free(modulus);
767 	BN_free(r_squared);
768 	if (ret)
769 		ret = ret == -FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
770 err_get_params:
771 	RSA_free(rsa);
772 err_get_pub_key:
773 	if (info->engine_id)
774 		rsa_engine_remove(e);
775 
776 	return ret;
777 }
778