@@ -75,61 +75,77 @@ const struct str pem_ssh_comment = { SET_CSTR(, "Comment: ") };
75
75
const struct str pem_dek_info_start = { SET_CSTR (, "DEK-Info: " ) };
76
76
const struct blockcipher_info pem_dek_infos [] =
77
77
{
78
- { .name = "AES-128-CBC," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cbc , },
79
- { .name = "AES-192-CBC," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cbc , },
80
- { .name = "AES-256-CBC," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cbc , },
81
- { .name = "AES-128-CFB," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cfb , },
82
- { .name = "AES-192-CFB," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cfb , },
83
- { .name = "AES-256-CFB," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cfb , },
84
- { .name = "AES-128-CTR," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_ctr , },
85
- { .name = "AES-192-CTR," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_ctr , },
86
- { .name = "AES-256-CTR," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_ctr , },
87
- { .name = "AES-128-OFB," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_ofb , },
88
- { .name = "AES-192-OFB," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_ofb , },
89
- { .name = "AES-256-OFB," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_ofb , },
90
- { .name = "BF-CBC," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_cbc , },
91
- { .name = "BF-CFB," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_cfb , },
92
- { .name = "BF-OFB," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_ofb , },
93
- { .name = "CAMELLIA-128-CBC," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cbc , },
94
- { .name = "CAMELLIA-192-CBC," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cbc , },
95
- { .name = "CAMELLIA-256-CBC," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cbc , },
96
- { .name = "CAMELLIA-128-CFB," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cfb , },
97
- { .name = "CAMELLIA-192-CFB," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cfb , },
98
- { .name = "CAMELLIA-256-CFB," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cfb , },
99
- { .name = "CAMELLIA-128-CTR," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_ctr , },
100
- { .name = "CAMELLIA-192-CTR," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_ctr , },
101
- { .name = "CAMELLIA-256-CTR," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_ctr , },
102
- { .name = "CAMELLIA-128-OFB," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_ofb , },
103
- { .name = "CAMELLIA-192-OFB," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_ofb , },
104
- { .name = "CAMELLIA-256-OFB," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_ofb , },
105
- { .name = "CAST5-CBC," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_cbc , },
106
- { .name = "CAST5-CFB," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_cfb , },
107
- { .name = "CAST5-OFB," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_ofb , },
108
- { .name = "ChaCha20," , .algo = "chacha20" , .keylen = 256 / 8 , .mode = cm_stream , },
109
- { .name = "DES-EDE-CBC," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_cbc , },
110
- { .name = "DES-EDE-CFB," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_cfb , },
111
- { .name = "DES-EDE-OFB," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_ofb , },
112
- { .name = "DES-EDE3-CBC," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cbc , },
113
- { .name = "DES-EDE3-CFB," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cfb , },
114
- { .name = "DES-EDE3-OFB," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_ofb , },
115
- { .name = "DES-CBC," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cbc , },
116
- { .name = "DES-CFB," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cfb , },
117
- { .name = "DES-OFB," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_ofb , },
118
- { .name = "DESX-CBC," , .algo = "desx" , .keylen = 192 / 8 , .mode = cm_cbc , },
119
- { .name = "IDEA-CBC," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_cbc , },
120
- { .name = "IDEA-CFB," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_cfb , },
121
- { .name = "IDEA-OFB," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_ofb , },
122
- { .name = "RC5-CBC," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_cbc , },
123
- { .name = "RC5-CFB," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_cfb , },
124
- { .name = "RC5-OFB," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_ofb , },
125
- { .name = "RC2-40-CBC," , .algo = "rc2" , .keylen = 40 / 8 , .mode = cm_cbc , },
126
- { .name = "RC2-64-CBC," , .algo = "rc2" , .keylen = 64 / 8 , .mode = cm_cbc , },
127
- { .name = "RC2-CBC," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_cbc , },
128
- { .name = "RC2-CFB," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_cfb , },
129
- { .name = "RC2-OFB," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_ofb , },
130
- { .name = "SEED-CBC," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_cbc , },
131
- { .name = "SEED-CFB," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_cfb , },
132
- { .name = "SEED-OFB," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_ofb , },
78
+ { .name = "AES-128-CBC," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cbc , },
79
+ { .name = "AES-192-CBC," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cbc , },
80
+ { .name = "AES-256-CBC," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cbc , },
81
+ { .name = "AES-128-CFB," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cfb , },
82
+ { .name = "AES-192-CFB," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cfb , },
83
+ { .name = "AES-256-CFB," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cfb , },
84
+ { .name = "AES-128-CFB1," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cfb1 , },
85
+ { .name = "AES-192-CFB1," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cfb1 , },
86
+ { .name = "AES-256-CFB1," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cfb1 , },
87
+ { .name = "AES-128-CFB8," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_cfb8 , },
88
+ { .name = "AES-192-CFB8," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_cfb8 , },
89
+ { .name = "AES-256-CFB8," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_cfb8 , },
90
+ { .name = "AES-128-CTR," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_ctr , },
91
+ { .name = "AES-192-CTR," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_ctr , },
92
+ { .name = "AES-256-CTR," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_ctr , },
93
+ { .name = "AES-128-OFB," , .algo = "aes" , .keylen = 128 / 8 , .mode = cm_ofb , },
94
+ { .name = "AES-192-OFB," , .algo = "aes" , .keylen = 192 / 8 , .mode = cm_ofb , },
95
+ { .name = "AES-256-OFB," , .algo = "aes" , .keylen = 256 / 8 , .mode = cm_ofb , },
96
+ { .name = "BF-CBC," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_cbc , },
97
+ { .name = "BF-CFB," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_cfb , },
98
+ { .name = "BF-OFB," , .algo = "blowfish" , .keylen = 128 / 8 , .mode = cm_ofb , },
99
+ { .name = "CAMELLIA-128-CBC," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cbc , },
100
+ { .name = "CAMELLIA-192-CBC," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cbc , },
101
+ { .name = "CAMELLIA-256-CBC," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cbc , },
102
+ { .name = "CAMELLIA-128-CFB," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cfb , },
103
+ { .name = "CAMELLIA-192-CFB," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cfb , },
104
+ { .name = "CAMELLIA-256-CFB," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cfb , },
105
+ { .name = "CAMELLIA-128-CFB1," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cfb1 , },
106
+ { .name = "CAMELLIA-192-CFB1," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cfb1 , },
107
+ { .name = "CAMELLIA-256-CFB1," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cfb1 , },
108
+ { .name = "CAMELLIA-128-CFB8," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_cfb8 , },
109
+ { .name = "CAMELLIA-192-CFB8," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_cfb8 , },
110
+ { .name = "CAMELLIA-256-CFB8," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_cfb8 , },
111
+ { .name = "CAMELLIA-128-CTR," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_ctr , },
112
+ { .name = "CAMELLIA-192-CTR," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_ctr , },
113
+ { .name = "CAMELLIA-256-CTR," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_ctr , },
114
+ { .name = "CAMELLIA-128-OFB," , .algo = "camellia" , .keylen = 128 / 8 , .mode = cm_ofb , },
115
+ { .name = "CAMELLIA-192-OFB," , .algo = "camellia" , .keylen = 192 / 8 , .mode = cm_ofb , },
116
+ { .name = "CAMELLIA-256-OFB," , .algo = "camellia" , .keylen = 256 / 8 , .mode = cm_ofb , },
117
+ { .name = "CAST5-CBC," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_cbc , },
118
+ { .name = "CAST5-CFB," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_cfb , },
119
+ { .name = "CAST5-OFB," , .algo = "cast5" , .keylen = 128 / 8 , .mode = cm_ofb , },
120
+ { .name = "ChaCha20," , .algo = "chacha20" , .keylen = 256 / 8 , .mode = cm_stream , },
121
+ { .name = "DES-EDE-CBC," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_cbc , },
122
+ { .name = "DES-EDE-CFB," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_cfb , },
123
+ { .name = "DES-EDE-OFB," , .algo = "3des" , .keylen = 128 / 8 , .mode = cm_ofb , },
124
+ { .name = "DES-EDE3-CBC," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cbc , },
125
+ { .name = "DES-EDE3-CFB," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cfb , },
126
+ { .name = "DES-EDE3-CFB1," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cfb1 , },
127
+ { .name = "DES-EDE3-CFB8," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_cfb8 , },
128
+ { .name = "DES-EDE3-OFB," , .algo = "3des" , .keylen = 192 / 8 , .mode = cm_ofb , },
129
+ { .name = "DES-CBC," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cbc , },
130
+ { .name = "DES-CFB," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cfb , },
131
+ { .name = "DES-CFB1," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cfb1 , },
132
+ { .name = "DES-CFB8," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_cfb8 , },
133
+ { .name = "DES-OFB," , .algo = "des" , .keylen = 64 / 8 , .mode = cm_ofb , },
134
+ { .name = "DESX-CBC," , .algo = "desx" , .keylen = 192 / 8 , .mode = cm_cbc , },
135
+ { .name = "IDEA-CBC," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_cbc , },
136
+ { .name = "IDEA-CFB," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_cfb , },
137
+ { .name = "IDEA-OFB," , .algo = "idea" , .keylen = 128 / 8 , .mode = cm_ofb , },
138
+ { .name = "RC5-CBC," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_cbc , },
139
+ { .name = "RC5-CFB," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_cfb , },
140
+ { .name = "RC5-OFB," , .algo = "rc5" , .keylen = 128 / 8 , .mode = cm_ofb , },
141
+ { .name = "RC2-40-CBC," , .algo = "rc2" , .keylen = 40 / 8 , .mode = cm_cbc , },
142
+ { .name = "RC2-64-CBC," , .algo = "rc2" , .keylen = 64 / 8 , .mode = cm_cbc , },
143
+ { .name = "RC2-CBC," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_cbc , },
144
+ { .name = "RC2-CFB," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_cfb , },
145
+ { .name = "RC2-OFB," , .algo = "rc2" , .keylen = 128 / 8 , .mode = cm_ofb , },
146
+ { .name = "SEED-CBC," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_cbc , },
147
+ { .name = "SEED-CFB," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_cfb , },
148
+ { .name = "SEED-OFB," , .algo = "seed" , .keylen = 128 / 8 , .mode = cm_ofb , },
133
149
};
134
150
const unsigned long pem_dek_infos_num = sizeof (pem_dek_infos )/sizeof (pem_dek_infos [0 ]);
135
151
@@ -189,9 +205,17 @@ int pem_decrypt(unsigned char *data, unsigned long *datalen,
189
205
#endif
190
206
break ;
191
207
case cm_cfb :
208
+ case cm_cfb1 :
209
+ case cm_cfb8 :
192
210
#ifdef LTC_CFB_MODE
193
- if ((err = cfb_start (cipher , iv , key , keylen , 0 , & s .ctx .cfb )) != CRYPT_OK ) {
194
- goto error_out ;
211
+ if (info -> mode == cm_cfb ) {
212
+ if ((err = cfb_start (cipher , iv , key , keylen , 0 , & s .ctx .cfb )) != CRYPT_OK ) {
213
+ goto error_out ;
214
+ }
215
+ } else {
216
+ if ((err = cfb_start_ex (cipher , iv , key , keylen , 0 , info -> mode == cm_cfb1 ? 1 : 8 , & s .ctx .cfb )) != CRYPT_OK ) {
217
+ goto error_out ;
218
+ }
195
219
}
196
220
if ((err = cfb_decrypt (data , data , * datalen , & s .ctx .cfb )) != CRYPT_OK ) {
197
221
goto error_out ;
0 commit comments