@@ -75,61 +75,77 @@ const struct str pem_ssh_comment = { SET_CSTR(, "Comment: ") };
7575const struct str pem_dek_info_start = { SET_CSTR (, "DEK-Info: " ) };
7676const struct blockcipher_info pem_dek_infos [] =
7777 {
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 , },
133149 };
134150const unsigned long pem_dek_infos_num = sizeof (pem_dek_infos )/sizeof (pem_dek_infos [0 ]);
135151
@@ -189,9 +205,17 @@ int pem_decrypt(unsigned char *data, unsigned long *datalen,
189205#endif
190206 break ;
191207 case cm_cfb :
208+ case cm_cfb1 :
209+ case cm_cfb8 :
192210#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+ }
195219 }
196220 if ((err = cfb_decrypt (data , data , * datalen , & s .ctx .cfb )) != CRYPT_OK ) {
197221 goto error_out ;
0 commit comments