2 #include "ceph_debug.h"
5 #include <linux/scatterlist.h>
6 #include <linux/slab.h>
7 #include <crypto/hash.h>
12 int ceph_crypto_key_encode(struct ceph_crypto_key
*key
, void **p
, void *end
)
14 if (*p
+ sizeof(u16
) + sizeof(key
->created
) +
15 sizeof(u16
) + key
->len
> end
)
17 ceph_encode_16(p
, key
->type
);
18 ceph_encode_copy(p
, &key
->created
, sizeof(key
->created
));
19 ceph_encode_16(p
, key
->len
);
20 ceph_encode_copy(p
, key
->key
, key
->len
);
24 int ceph_crypto_key_decode(struct ceph_crypto_key
*key
, void **p
, void *end
)
26 ceph_decode_need(p
, end
, 2*sizeof(u16
) + sizeof(key
->created
), bad
);
27 key
->type
= ceph_decode_16(p
);
28 ceph_decode_copy(p
, &key
->created
, sizeof(key
->created
));
29 key
->len
= ceph_decode_16(p
);
30 ceph_decode_need(p
, end
, key
->len
, bad
);
31 key
->key
= kmalloc(key
->len
, GFP_NOFS
);
34 ceph_decode_copy(p
, key
->key
, key
->len
);
38 dout("failed to decode crypto key\n");
42 int ceph_crypto_key_unarmor(struct ceph_crypto_key
*key
, const char *inkey
)
44 int inlen
= strlen(inkey
);
45 int blen
= inlen
* 3 / 4;
49 dout("crypto_key_unarmor %s\n", inkey
);
50 buf
= kmalloc(blen
, GFP_NOFS
);
53 blen
= ceph_unarmor(buf
, inkey
, inkey
+inlen
);
60 ret
= ceph_crypto_key_decode(key
, &p
, p
+ blen
);
64 dout("crypto_key_unarmor key %p type %d len %d\n", key
,
71 #define AES_KEY_SIZE 16
73 static struct crypto_blkcipher
*ceph_crypto_alloc_cipher(void)
75 return crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC
);
78 const u8
*aes_iv
= "cephsageyudagreg";
80 int ceph_aes_encrypt(const void *key
, int key_len
, void *dst
, size_t *dst_len
,
81 const void *src
, size_t src_len
)
83 struct scatterlist sg_in
[2], sg_out
[1];
84 struct crypto_blkcipher
*tfm
= ceph_crypto_alloc_cipher();
85 struct blkcipher_desc desc
= { .tfm
= tfm
, .flags
= 0 };
89 size_t zero_padding
= (0x10 - (src_len
& 0x0f));
95 memset(pad
, zero_padding
, zero_padding
);
97 *dst_len
= src_len
+ zero_padding
;
99 crypto_blkcipher_setkey((void *)tfm
, key
, key_len
);
100 sg_init_table(sg_in
, 2);
101 sg_set_buf(&sg_in
[0], src
, src_len
);
102 sg_set_buf(&sg_in
[1], pad
, zero_padding
);
103 sg_init_table(sg_out
, 1);
104 sg_set_buf(sg_out
, dst
, *dst_len
);
105 iv
= crypto_blkcipher_crt(tfm
)->iv
;
106 ivsize
= crypto_blkcipher_ivsize(tfm
);
108 memcpy(iv
, aes_iv
, ivsize
);
110 print_hex_dump(KERN_ERR, "enc key: ", DUMP_PREFIX_NONE, 16, 1,
112 print_hex_dump(KERN_ERR, "enc src: ", DUMP_PREFIX_NONE, 16, 1,
114 print_hex_dump(KERN_ERR, "enc pad: ", DUMP_PREFIX_NONE, 16, 1,
115 pad, zero_padding, 1);
117 ret
= crypto_blkcipher_encrypt(&desc
, sg_out
, sg_in
,
118 src_len
+ zero_padding
);
119 crypto_free_blkcipher(tfm
);
121 pr_err("ceph_aes_crypt failed %d\n", ret
);
123 print_hex_dump(KERN_ERR, "enc out: ", DUMP_PREFIX_NONE, 16, 1,
129 int ceph_aes_encrypt2(const void *key
, int key_len
, void *dst
, size_t *dst_len
,
130 const void *src1
, size_t src1_len
,
131 const void *src2
, size_t src2_len
)
133 struct scatterlist sg_in
[3], sg_out
[1];
134 struct crypto_blkcipher
*tfm
= ceph_crypto_alloc_cipher();
135 struct blkcipher_desc desc
= { .tfm
= tfm
, .flags
= 0 };
139 size_t zero_padding
= (0x10 - ((src1_len
+ src2_len
) & 0x0f));
145 memset(pad
, zero_padding
, zero_padding
);
147 *dst_len
= src1_len
+ src2_len
+ zero_padding
;
149 crypto_blkcipher_setkey((void *)tfm
, key
, key_len
);
150 sg_init_table(sg_in
, 3);
151 sg_set_buf(&sg_in
[0], src1
, src1_len
);
152 sg_set_buf(&sg_in
[1], src2
, src2_len
);
153 sg_set_buf(&sg_in
[2], pad
, zero_padding
);
154 sg_init_table(sg_out
, 1);
155 sg_set_buf(sg_out
, dst
, *dst_len
);
156 iv
= crypto_blkcipher_crt(tfm
)->iv
;
157 ivsize
= crypto_blkcipher_ivsize(tfm
);
159 memcpy(iv
, aes_iv
, ivsize
);
161 print_hex_dump(KERN_ERR, "enc key: ", DUMP_PREFIX_NONE, 16, 1,
163 print_hex_dump(KERN_ERR, "enc src1: ", DUMP_PREFIX_NONE, 16, 1,
165 print_hex_dump(KERN_ERR, "enc src2: ", DUMP_PREFIX_NONE, 16, 1,
167 print_hex_dump(KERN_ERR, "enc pad: ", DUMP_PREFIX_NONE, 16, 1,
168 pad, zero_padding, 1);
170 ret
= crypto_blkcipher_encrypt(&desc
, sg_out
, sg_in
,
171 src1_len
+ src2_len
+ zero_padding
);
172 crypto_free_blkcipher(tfm
);
174 pr_err("ceph_aes_crypt2 failed %d\n", ret
);
176 print_hex_dump(KERN_ERR, "enc out: ", DUMP_PREFIX_NONE, 16, 1,
182 int ceph_aes_decrypt(const void *key
, int key_len
, void *dst
, size_t *dst_len
,
183 const void *src
, size_t src_len
)
185 struct scatterlist sg_in
[1], sg_out
[2];
186 struct crypto_blkcipher
*tfm
= ceph_crypto_alloc_cipher();
187 struct blkcipher_desc desc
= { .tfm
= tfm
};
197 crypto_blkcipher_setkey((void *)tfm
, key
, key_len
);
198 sg_init_table(sg_in
, 1);
199 sg_init_table(sg_out
, 2);
200 sg_set_buf(sg_in
, src
, src_len
);
201 sg_set_buf(&sg_out
[0], dst
, *dst_len
);
202 sg_set_buf(&sg_out
[1], pad
, sizeof(pad
));
204 iv
= crypto_blkcipher_crt(tfm
)->iv
;
205 ivsize
= crypto_blkcipher_ivsize(tfm
);
207 memcpy(iv
, aes_iv
, ivsize
);
210 print_hex_dump(KERN_ERR, "dec key: ", DUMP_PREFIX_NONE, 16, 1,
212 print_hex_dump(KERN_ERR, "dec in: ", DUMP_PREFIX_NONE, 16, 1,
216 ret
= crypto_blkcipher_decrypt(&desc
, sg_out
, sg_in
, src_len
);
217 crypto_free_blkcipher(tfm
);
219 pr_err("ceph_aes_decrypt failed %d\n", ret
);
223 if (src_len
<= *dst_len
)
224 last_byte
= ((char *)dst
)[src_len
- 1];
226 last_byte
= pad
[src_len
- *dst_len
- 1];
227 if (last_byte
<= 16 && src_len
>= last_byte
) {
228 *dst_len
= src_len
- last_byte
;
230 pr_err("ceph_aes_decrypt got bad padding %d on src len %d\n",
231 last_byte
, (int)src_len
);
232 return -EPERM
; /* bad padding */
235 print_hex_dump(KERN_ERR, "dec out: ", DUMP_PREFIX_NONE, 16, 1,
241 int ceph_aes_decrypt2(const void *key
, int key_len
,
242 void *dst1
, size_t *dst1_len
,
243 void *dst2
, size_t *dst2_len
,
244 const void *src
, size_t src_len
)
246 struct scatterlist sg_in
[1], sg_out
[3];
247 struct crypto_blkcipher
*tfm
= ceph_crypto_alloc_cipher();
248 struct blkcipher_desc desc
= { .tfm
= tfm
};
258 sg_init_table(sg_in
, 1);
259 sg_set_buf(sg_in
, src
, src_len
);
260 sg_init_table(sg_out
, 3);
261 sg_set_buf(&sg_out
[0], dst1
, *dst1_len
);
262 sg_set_buf(&sg_out
[1], dst2
, *dst2_len
);
263 sg_set_buf(&sg_out
[2], pad
, sizeof(pad
));
265 crypto_blkcipher_setkey((void *)tfm
, key
, key_len
);
266 iv
= crypto_blkcipher_crt(tfm
)->iv
;
267 ivsize
= crypto_blkcipher_ivsize(tfm
);
269 memcpy(iv
, aes_iv
, ivsize
);
272 print_hex_dump(KERN_ERR, "dec key: ", DUMP_PREFIX_NONE, 16, 1,
274 print_hex_dump(KERN_ERR, "dec in: ", DUMP_PREFIX_NONE, 16, 1,
278 ret
= crypto_blkcipher_decrypt(&desc
, sg_out
, sg_in
, src_len
);
279 crypto_free_blkcipher(tfm
);
281 pr_err("ceph_aes_decrypt failed %d\n", ret
);
285 if (src_len
<= *dst1_len
)
286 last_byte
= ((char *)dst1
)[src_len
- 1];
287 else if (src_len
<= *dst1_len
+ *dst2_len
)
288 last_byte
= ((char *)dst2
)[src_len
- *dst1_len
- 1];
290 last_byte
= pad
[src_len
- *dst1_len
- *dst2_len
- 1];
291 if (last_byte
<= 16 && src_len
>= last_byte
) {
292 src_len
-= last_byte
;
294 pr_err("ceph_aes_decrypt got bad padding %d on src len %d\n",
295 last_byte
, (int)src_len
);
296 return -EPERM
; /* bad padding */
299 if (src_len
< *dst1_len
) {
303 *dst2_len
= src_len
- *dst1_len
;
306 print_hex_dump(KERN_ERR, "dec out1: ", DUMP_PREFIX_NONE, 16, 1,
308 print_hex_dump(KERN_ERR, "dec out2: ", DUMP_PREFIX_NONE, 16, 1,
316 int ceph_decrypt(struct ceph_crypto_key
*secret
, void *dst
, size_t *dst_len
,
317 const void *src
, size_t src_len
)
319 switch (secret
->type
) {
320 case CEPH_CRYPTO_NONE
:
321 if (*dst_len
< src_len
)
323 memcpy(dst
, src
, src_len
);
327 case CEPH_CRYPTO_AES
:
328 return ceph_aes_decrypt(secret
->key
, secret
->len
, dst
,
329 dst_len
, src
, src_len
);
336 int ceph_decrypt2(struct ceph_crypto_key
*secret
,
337 void *dst1
, size_t *dst1_len
,
338 void *dst2
, size_t *dst2_len
,
339 const void *src
, size_t src_len
)
343 switch (secret
->type
) {
344 case CEPH_CRYPTO_NONE
:
345 if (*dst1_len
+ *dst2_len
< src_len
)
347 t
= min(*dst1_len
, src_len
);
348 memcpy(dst1
, src
, t
);
353 t
= min(*dst2_len
, src_len
);
354 memcpy(dst2
, src
, t
);
359 case CEPH_CRYPTO_AES
:
360 return ceph_aes_decrypt2(secret
->key
, secret
->len
,
361 dst1
, dst1_len
, dst2
, dst2_len
,
369 int ceph_encrypt(struct ceph_crypto_key
*secret
, void *dst
, size_t *dst_len
,
370 const void *src
, size_t src_len
)
372 switch (secret
->type
) {
373 case CEPH_CRYPTO_NONE
:
374 if (*dst_len
< src_len
)
376 memcpy(dst
, src
, src_len
);
380 case CEPH_CRYPTO_AES
:
381 return ceph_aes_encrypt(secret
->key
, secret
->len
, dst
,
382 dst_len
, src
, src_len
);
389 int ceph_encrypt2(struct ceph_crypto_key
*secret
, void *dst
, size_t *dst_len
,
390 const void *src1
, size_t src1_len
,
391 const void *src2
, size_t src2_len
)
393 switch (secret
->type
) {
394 case CEPH_CRYPTO_NONE
:
395 if (*dst_len
< src1_len
+ src2_len
)
397 memcpy(dst
, src1
, src1_len
);
398 memcpy(dst
+ src1_len
, src2
, src2_len
);
399 *dst_len
= src1_len
+ src2_len
;
402 case CEPH_CRYPTO_AES
:
403 return ceph_aes_encrypt2(secret
->key
, secret
->len
, dst
, dst_len
,
404 src1
, src1_len
, src2
, src2_len
);