3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include <avr/pgmspace.h>
27 #define RSA_KEYSIZE 1024
29 #if RSA_KEYSIZE == 2048
30 #define N_LEN_B (32*8)
32 #define D_LEN_B (32*8)
33 #define ALL_LEN_B (N_LEN_B+E_LEN_B+D_LEN_B)
35 const uint8_t rsa_key_blob[] PROGMEM = {
37 0xDA, 0xBC, 0x4A, 0x42, 0x02, 0x6F, 0x7F, 0xC2,
38 0xEB, 0x5A, 0x73, 0x2A, 0x84, 0x25, 0xB5, 0x56,
39 0xC7, 0x99, 0x25, 0x0A, 0x50, 0x6F, 0x00, 0xAE,
40 0x84, 0x5C, 0x19, 0x30, 0xC6, 0xDE, 0xAF, 0xC6,
41 0x30, 0xC8, 0xD0, 0x67, 0x96, 0x14, 0xF1, 0x5F,
42 0xFF, 0x0C, 0x49, 0xC1, 0x4A, 0xA6, 0x91, 0x52,
43 0x83, 0xAE, 0x46, 0xA6, 0x2B, 0xCC, 0x38, 0x90,
44 0xBD, 0xE3, 0xB0, 0x10, 0x30, 0x9F, 0x02, 0x69,
45 0xCF, 0x34, 0x3E, 0x9C, 0x38, 0x82, 0x2A, 0x21,
46 0xB9, 0x98, 0x01, 0x9F, 0x60, 0x97, 0x7B, 0xDD,
47 0xDF, 0xB4, 0x5B, 0x78, 0x9B, 0x51, 0x7C, 0xEF,
48 0x9E, 0x48, 0xBB, 0xEF, 0x27, 0xD5, 0xA1, 0x38,
49 0x10, 0x30, 0x60, 0x7D, 0x1A, 0x50, 0x56, 0x64,
50 0xD7, 0x45, 0x47, 0x1B, 0x71, 0x75, 0xBB, 0xA1,
51 0xEC, 0x3A, 0xC3, 0xAB, 0x6B, 0x15, 0x84, 0x09,
52 0xFD, 0x87, 0x38, 0xE7, 0x28, 0x41, 0x47, 0x84,
53 0xB1, 0x87, 0xDE, 0xA8, 0x19, 0xFF, 0xD6, 0xBF,
54 0xA4, 0xF5, 0x8B, 0xFF, 0xF7, 0xB5, 0x5F, 0x88,
55 0xAE, 0x15, 0xD8, 0x26, 0x31, 0xDE, 0x94, 0xDB,
56 0xDC, 0x72, 0xEB, 0x9A, 0xFD, 0xD2, 0xE3, 0xBB,
57 0x05, 0x98, 0x76, 0xAD, 0x0D, 0x0A, 0x21, 0xDF,
58 0xB4, 0xAA, 0x9B, 0x49, 0xE8, 0x6B, 0xEC, 0x7C,
59 0x8B, 0x87, 0x21, 0xEF, 0x6E, 0xD9, 0x64, 0xAB,
60 0x17, 0x52, 0xDD, 0xC9, 0x13, 0x4B, 0x0C, 0xDF,
61 0x3F, 0x87, 0x35, 0x1F, 0x2A, 0x9B, 0x88, 0xDD,
62 0x92, 0x06, 0x83, 0x51, 0x4B, 0x5E, 0x8E, 0xDB,
63 0xD2, 0x7F, 0xC1, 0x1B, 0x39, 0x9E, 0xFB, 0x47,
64 0x71, 0x75, 0xF2, 0x5B, 0xCC, 0xF9, 0xAA, 0x4D,
65 0x5C, 0x9F, 0x34, 0xFF, 0x52, 0x6F, 0x6A, 0xAB,
66 0x84, 0x82, 0xAA, 0x62, 0x58, 0x59, 0x7D, 0x78,
67 0xA0, 0x37, 0x26, 0x4C, 0x8A, 0x8F, 0xF0, 0x92,
68 0xE9, 0xF7, 0x05, 0xAD, 0x77, 0x61, 0x32, 0x4D,
72 0x12, 0x98, 0xD7, 0xA7, 0x6D, 0x15, 0x95, 0xC3,
73 0x38, 0xC7, 0x63, 0xEB, 0x45, 0x78, 0xFF, 0x45,
74 0xF5, 0x8A, 0x6B, 0xBF, 0xC8, 0xBE, 0xE7, 0x4B,
75 0xEF, 0x2C, 0xF5, 0x67, 0x54, 0x41, 0x32, 0xA8,
76 0xA3, 0x15, 0x2F, 0xC2, 0xDE, 0xDB, 0xC0, 0xF9,
77 0xEC, 0x71, 0x5B, 0x03, 0xF8, 0x18, 0xD9, 0x5A,
78 0x2E, 0x9F, 0xEE, 0x99, 0xCA, 0x37, 0x7E, 0xC7,
79 0xAF, 0x9D, 0x60, 0x26, 0xC0, 0x3B, 0x84, 0xB5,
80 0x02, 0x4C, 0xEA, 0xD5, 0xD5, 0x68, 0x1B, 0xB4,
81 0xEA, 0x56, 0xA6, 0x2C, 0xAA, 0xC5, 0xB6, 0x5E,
82 0x52, 0xDA, 0xBE, 0xBC, 0x2E, 0x58, 0x6B, 0x4A,
83 0xE4, 0x26, 0x42, 0xF4, 0x3E, 0x6A, 0xC7, 0x5E,
84 0x40, 0xE2, 0x1C, 0x12, 0x06, 0xDE, 0xB5, 0xB9,
85 0xB5, 0x23, 0xCA, 0xBB, 0xE6, 0x95, 0x9F, 0xF2,
86 0x50, 0x67, 0x5E, 0xA3, 0x80, 0x63, 0x3F, 0xEA,
87 0xA9, 0x87, 0x89, 0xAA, 0xFD, 0x9D, 0x2F, 0x3B,
88 0x4C, 0xA4, 0xC4, 0xB0, 0xC5, 0x25, 0xEC, 0xD1,
89 0x5C, 0xC3, 0x2C, 0x40, 0x1E, 0x28, 0x42, 0x1E,
90 0xC7, 0x26, 0xAB, 0x9E, 0x5A, 0xB9, 0x22, 0xB9,
91 0x44, 0x14, 0xC8, 0x1D, 0x51, 0x64, 0x4F, 0xE3,
92 0xA0, 0x04, 0x48, 0x04, 0x55, 0x4B, 0xCE, 0x8B,
93 0x11, 0x00, 0xCB, 0x85, 0x93, 0x8B, 0x06, 0xCE,
94 0x33, 0x0D, 0xA6, 0xB8, 0xBA, 0x5F, 0xC0, 0x3C,
95 0x5A, 0xB0, 0x0B, 0x0C, 0x68, 0xE2, 0x4F, 0x4D,
96 0xCC, 0x94, 0x54, 0x85, 0xCD, 0x8D, 0x46, 0x79,
97 0xD7, 0x2C, 0xD9, 0x67, 0x27, 0xED, 0x1C, 0x22,
98 0x6C, 0x90, 0xC2, 0xB1, 0x23, 0xD2, 0x38, 0x59,
99 0x79, 0x12, 0x54, 0xAD, 0xEE, 0xFA, 0xE3, 0x31,
100 0x87, 0x51, 0x88, 0x15, 0xB9, 0x24, 0x73, 0x5A,
101 0x32, 0xA4, 0xD3, 0xCE, 0xEB, 0xC5, 0xAE, 0x9C,
102 0x8E, 0xD6, 0x64, 0x00, 0x9E, 0x04, 0x5D, 0x28,
103 0xED, 0x99, 0x90, 0xF9, 0xA0, 0xBA, 0x55, 0x81
105 #endif /* RSA_KEYSIZE == 2048 */
107 #if RSA_KEYSIZE == 1024
109 #define N_LEN_B (16*8)
111 #define D_LEN_B (16*8)
112 #define ALL_LEN_B (N_LEN_B+E_LEN_B+D_LEN_B)
114 const uint8_t rsa_key_blob[] PROGMEM = {
116 0xC8, 0xE2, 0x5C, 0xE3, 0x38, 0xE2, 0x05, 0x03,
117 0xBA, 0xFD, 0x33, 0x9A, 0xC4, 0x71, 0x5A, 0xD9,
118 0x04, 0x8D, 0xF0, 0xDD, 0x03, 0x14, 0xCF, 0x73,
119 0xCD, 0xE0, 0xBA, 0xFB, 0x21, 0xFF, 0x62, 0xF6,
120 0x45, 0x17, 0x39, 0xBC, 0xDC, 0x9D, 0x06, 0x9F,
121 0xC8, 0xED, 0xA0, 0xFE, 0xC4, 0xD2, 0x96, 0xE8,
122 0x51, 0x40, 0x31, 0x1A, 0x05, 0x0B, 0xF6, 0x7B,
123 0x8E, 0x9A, 0x96, 0x67, 0x3B, 0xDE, 0xA3, 0x7D,
124 0x3C, 0x0E, 0x46, 0x00, 0x1F, 0x94, 0x25, 0xA5,
125 0xC4, 0x71, 0x26, 0x5C, 0xE9, 0xC4, 0x43, 0xF3,
126 0xF5, 0x83, 0x55, 0x97, 0x1C, 0x10, 0x20, 0x0E,
127 0x4D, 0x2D, 0xF1, 0xF0, 0x72, 0x5D, 0x84, 0x01,
128 0x28, 0x4D, 0x16, 0xAA, 0x95, 0xDF, 0x52, 0xBB,
129 0x2E, 0x34, 0xC1, 0x77, 0x9F, 0x18, 0x30, 0x97,
130 0x0A, 0x86, 0x70, 0xC6, 0xEE, 0xE2, 0x84, 0xD6,
131 0x85, 0x11, 0x14, 0xAC, 0x70, 0x7A, 0x29, 0xB9,
135 0x2E, 0xD2, 0xF4, 0xAB, 0xD2, 0x1A, 0x7C, 0xE8,
136 0xBD, 0xB1, 0x3F, 0x52, 0x17, 0xF0, 0x04, 0x29,
137 0x09, 0xB2, 0xBC, 0x2E, 0x08, 0x05, 0xD5, 0xC5,
138 0x3C, 0x7B, 0xE1, 0x99, 0x9F, 0xF7, 0x13, 0x6E,
139 0x2B, 0xF4, 0x99, 0xF4, 0xB7, 0xC7, 0xB2, 0x3F,
140 0x94, 0x6A, 0x2F, 0x58, 0xB3, 0x30, 0x13, 0x14,
141 0xDB, 0xBB, 0x86, 0xB6, 0x75, 0xEE, 0xAF, 0xE9,
142 0x64, 0xF8, 0x0B, 0x8E, 0xCC, 0x99, 0xBC, 0xA9,
143 0x8E, 0x57, 0xBA, 0x07, 0xBD, 0x0A, 0xDD, 0xD9,
144 0x12, 0xA5, 0xFF, 0x08, 0x4F, 0x67, 0x64, 0xF7,
145 0x04, 0xD5, 0xC0, 0xBC, 0x98, 0x2F, 0xF0, 0x8A,
146 0x3A, 0x3D, 0xFF, 0xB2, 0xF7, 0x12, 0xA8, 0x71,
147 0x4C, 0xF8, 0x21, 0x3B, 0xD4, 0x9C, 0x78, 0x93,
148 0x5A, 0xC1, 0x25, 0xB4, 0x5F, 0x95, 0x59, 0xD4,
149 0x8D, 0x7D, 0xF4, 0x07, 0x3C, 0xB5, 0x8A, 0x4C,
150 0xFF, 0x94, 0x68, 0xCD, 0x1A, 0x12, 0xC5, 0xC1
153 #endif /* RSA_KEYSIZE */
155 void load_rsa_key_blob(rsa_ctx_t* ctx){
156 if(ctx->modulus.wordv){
157 free(ctx->modulus.wordv);
159 ctx->modulus.wordv = malloc(ALL_LEN_B);
160 if(ctx->modulus.wordv==NULL){
161 cli_putstr_P(PSTR("\r\nERROR: OUT OF MEMORY!!!"));
164 ctx->modulus.info = ctx->privexp.info = ctx->pubexp.info = 0;
165 memcpy_P(ctx->modulus.wordv, rsa_key_blob, ALL_LEN_B);
166 ctx->modulus.length_B=N_LEN_B;
167 ctx->pubexp.wordv = ctx->modulus.wordv+N_LEN_B;
168 ctx->pubexp.length_B = E_LEN_B;
169 ctx->privexp.wordv = ctx->pubexp.wordv+E_LEN_B;
170 ctx->privexp.length_B = D_LEN_B;
172 bigint_changeendianess(&(ctx->modulus));
173 bigint_changeendianess(&(ctx->pubexp));
174 bigint_changeendianess(&(ctx->privexp));
176 bigint_adjust(&(ctx->modulus));
177 bigint_adjust(&(ctx->pubexp));
178 bigint_adjust(&(ctx->privexp));