f1c232435d4bb002244ec8e6eaeed95612bfdde6
[openssl.git] / crypto / engine / eng_devcrypto.c
1 /*
2  * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include "e_os.h"
11 #include <string.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
15 #include <sys/ioctl.h>
16 #include <unistd.h>
17 #include <assert.h>
18
19 #include <openssl/evp.h>
20 #include <openssl/err.h>
21 #include <openssl/engine.h>
22 #include <openssl/objects.h>
23 #include <crypto/cryptodev.h>
24
25 #include "internal/engine.h"
26
27 /* #define ENGINE_DEVCRYPTO_DEBUG */
28
29 #ifdef CRYPTO_ALGORITHM_MIN
30 # define CHECK_BSD_STYLE_MACROS
31 #endif
32
33 /*
34  * ONE global file descriptor for all sessions.  This allows operations
35  * such as digest session data copying (see digest_copy()), but is also
36  * saner...  why re-open /dev/crypto for every session?
37  */
38 static int cfd;
39
40 static int clean_devcrypto_session(struct session_op *sess) {
41     if (ioctl(cfd, CIOCFSESSION, &sess->ses) < 0) {
42         SYSerr(SYS_F_IOCTL, errno);
43         return 0;
44     }
45     memset(sess, 0, sizeof(struct session_op));
46     return 1;
47 }
48
49 /******************************************************************************
50  *
51  * Ciphers
52  *
53  * Because they all do the same basic operation, we have only one set of
54  * method functions for them all to share, and a mapping table between
55  * NIDs and cryptodev IDs, with all the necessary size data.
56  *
57  *****/
58
59 struct cipher_ctx {
60     struct session_op sess;
61     int op;                      /* COP_ENCRYPT or COP_DECRYPT */
62     unsigned long mode;          /* EVP_CIPH_*_MODE */
63
64     /* to handle ctr mode being a stream cipher */
65     unsigned char partial[EVP_MAX_BLOCK_LENGTH];
66     unsigned int blocksize, num;
67 };
68
69 static const struct cipher_data_st {
70     int nid;
71     int blocksize;
72     int keylen;
73     int ivlen;
74     int flags;
75     int devcryptoid;
76 } cipher_data[] = {
77 #ifndef OPENSSL_NO_DES
78     { NID_des_cbc, 8, 8, 8, EVP_CIPH_CBC_MODE, CRYPTO_DES_CBC },
79     { NID_des_ede3_cbc, 8, 24, 8, EVP_CIPH_CBC_MODE, CRYPTO_3DES_CBC },
80 #endif
81 #ifndef OPENSSL_NO_BF
82     { NID_bf_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_BLF_CBC },
83 #endif
84 #ifndef OPENSSL_NO_CAST
85     { NID_cast5_cbc, 8, 16, 8, EVP_CIPH_CBC_MODE, CRYPTO_CAST_CBC },
86 #endif
87     { NID_aes_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC },
88     { NID_aes_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC },
89     { NID_aes_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE, CRYPTO_AES_CBC },
90 #ifndef OPENSSL_NO_RC4
91     { NID_rc4, 1, 16, 0, EVP_CIPH_STREAM_CIPHER, CRYPTO_ARC4 },
92 #endif
93 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_CTR)
94     { NID_aes_128_ctr, 16, 128 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR },
95     { NID_aes_192_ctr, 16, 192 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR },
96     { NID_aes_256_ctr, 16, 256 / 8, 16, EVP_CIPH_CTR_MODE, CRYPTO_AES_CTR },
97 #endif
98 #if 0                            /* Not yet supported */
99     { NID_aes_128_xts, 16, 128 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS },
100     { NID_aes_256_xts, 16, 256 / 8 * 2, 16, EVP_CIPH_XTS_MODE, CRYPTO_AES_XTS },
101 #endif
102 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_AES_ECB)
103     { NID_aes_128_ecb, 16, 128 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB },
104     { NID_aes_192_ecb, 16, 192 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB },
105     { NID_aes_256_ecb, 16, 256 / 8, 0, EVP_CIPH_ECB_MODE, CRYPTO_AES_ECB },
106 #endif
107 #if 0                            /* Not yet supported */
108     { NID_aes_128_gcm, 16, 128 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM },
109     { NID_aes_192_gcm, 16, 192 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM },
110     { NID_aes_256_gcm, 16, 256 / 8, 16, EVP_CIPH_GCM_MODE, CRYPTO_AES_GCM },
111 #endif
112 #ifndef OPENSSL_NO_CAMELLIA
113     { NID_camellia_128_cbc, 16, 128 / 8, 16, EVP_CIPH_CBC_MODE,
114       CRYPTO_CAMELLIA_CBC },
115     { NID_camellia_192_cbc, 16, 192 / 8, 16, EVP_CIPH_CBC_MODE,
116       CRYPTO_CAMELLIA_CBC },
117     { NID_camellia_256_cbc, 16, 256 / 8, 16, EVP_CIPH_CBC_MODE,
118       CRYPTO_CAMELLIA_CBC },
119 #endif
120 };
121
122 static size_t get_cipher_data_index(int nid)
123 {
124     size_t i;
125
126     for (i = 0; i < OSSL_NELEM(cipher_data); i++)
127         if (nid == cipher_data[i].nid)
128             return i;
129
130     /*
131      * Code further down must make sure that only NIDs in the table above
132      * are used.  If any other NID reaches this function, there's a grave
133      * coding error further down.
134      */
135     assert("Code that never should be reached" == NULL);
136     return -1;
137 }
138
139 static const struct cipher_data_st *get_cipher_data(int nid)
140 {
141     return &cipher_data[get_cipher_data_index(nid)];
142 }
143
144 /*
145  * Following are the three necessary functions to map OpenSSL functionality
146  * with cryptodev.
147  */
148
149 static int cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
150                        const unsigned char *iv, int enc)
151 {
152     struct cipher_ctx *cipher_ctx =
153         (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
154     const struct cipher_data_st *cipher_d =
155         get_cipher_data(EVP_CIPHER_CTX_nid(ctx));
156
157     /* cleanup a previous session */
158     if (cipher_ctx->sess.ses != 0 &&
159         clean_devcrypto_session(&cipher_ctx->sess) == 0)
160         return 0;
161
162     cipher_ctx->sess.cipher = cipher_d->devcryptoid;
163     cipher_ctx->sess.keylen = cipher_d->keylen;
164     cipher_ctx->sess.key = (void *)key;
165     cipher_ctx->op = enc ? COP_ENCRYPT : COP_DECRYPT;
166     cipher_ctx->mode = cipher_d->flags & EVP_CIPH_MODE;
167     cipher_ctx->blocksize = cipher_d->blocksize;
168     if (ioctl(cfd, CIOCGSESSION, &cipher_ctx->sess) < 0) {
169         SYSerr(SYS_F_IOCTL, errno);
170         return 0;
171     }
172
173     return 1;
174 }
175
176 static int cipher_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
177                             const unsigned char *in, size_t inl)
178 {
179     struct cipher_ctx *cipher_ctx =
180         (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
181     struct crypt_op cryp;
182     unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
183 #if !defined(COP_FLAG_WRITE_IV)
184     unsigned char saved_iv[EVP_MAX_IV_LENGTH];
185     const unsigned char *ivptr;
186     size_t nblocks, ivlen;
187 #endif
188
189     memset(&cryp, 0, sizeof(cryp));
190     cryp.ses = cipher_ctx->sess.ses;
191     cryp.len = inl;
192     cryp.src = (void *)in;
193     cryp.dst = (void *)out;
194     cryp.iv = (void *)iv;
195     cryp.op = cipher_ctx->op;
196 #if !defined(COP_FLAG_WRITE_IV)
197     cryp.flags = 0;
198
199     ivlen = EVP_CIPHER_CTX_iv_length(ctx);
200     if (ivlen > 0)
201         switch (cipher_ctx->mode) {
202         case EVP_CIPH_CBC_MODE:
203             assert(inl >= ivlen);
204             if (!EVP_CIPHER_CTX_encrypting(ctx)) {
205                 ivptr = in + inl - ivlen;
206                 memcpy(saved_iv, ivptr, ivlen);
207             }
208             break;
209
210         case EVP_CIPH_CTR_MODE:
211             break;
212
213         default: /* should not happen */
214             return 0;
215         }
216 #else
217     cryp.flags = COP_FLAG_WRITE_IV;
218 #endif
219
220     if (ioctl(cfd, CIOCCRYPT, &cryp) < 0) {
221         SYSerr(SYS_F_IOCTL, errno);
222         return 0;
223     }
224
225 #if !defined(COP_FLAG_WRITE_IV)
226     if (ivlen > 0)
227         switch (cipher_ctx->mode) {
228         case EVP_CIPH_CBC_MODE:
229             assert(inl >= ivlen);
230             if (EVP_CIPHER_CTX_encrypting(ctx))
231                 ivptr = out + inl - ivlen;
232             else
233                 ivptr = saved_iv;
234
235             memcpy(iv, ivptr, ivlen);
236             break;
237
238         case EVP_CIPH_CTR_MODE:
239             nblocks = (inl + cipher_ctx->blocksize - 1)
240                       / cipher_ctx->blocksize;
241             do {
242                 ivlen--;
243                 nblocks += iv[ivlen];
244                 iv[ivlen] = (uint8_t) nblocks;
245                 nblocks >>= 8;
246             } while (ivlen);
247             break;
248
249         default: /* should not happen */
250             return 0;
251         }
252 #endif
253
254     return 1;
255 }
256
257 static int ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
258                          const unsigned char *in, size_t inl)
259 {
260     struct cipher_ctx *cipher_ctx =
261         (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
262     size_t nblocks, len;
263
264     /* initial partial block */
265     while (cipher_ctx->num && inl) {
266         (*out++) = *(in++) ^ cipher_ctx->partial[cipher_ctx->num];
267         --inl;
268         cipher_ctx->num = (cipher_ctx->num + 1) % cipher_ctx->blocksize;
269     }
270
271     /* full blocks */
272     if (inl > (unsigned int) cipher_ctx->blocksize) {
273         nblocks = inl/cipher_ctx->blocksize;
274         len = nblocks * cipher_ctx->blocksize;
275         if (cipher_do_cipher(ctx, out, in, len) < 1)
276             return 0;
277         inl -= len;
278         out += len;
279         in += len;
280     }
281
282     /* final partial block */
283     if (inl) {
284         memset(cipher_ctx->partial, 0, cipher_ctx->blocksize);
285         if (cipher_do_cipher(ctx, cipher_ctx->partial, cipher_ctx->partial,
286             cipher_ctx->blocksize) < 1)
287             return 0;
288         while (inl--) {
289             out[cipher_ctx->num] = in[cipher_ctx->num]
290                                    ^ cipher_ctx->partial[cipher_ctx->num];
291             cipher_ctx->num++;
292         }
293     }
294
295     return 1;
296 }
297
298 static int cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void* p2)
299 {
300     struct cipher_ctx *cipher_ctx =
301         (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
302     EVP_CIPHER_CTX *to_ctx = (EVP_CIPHER_CTX *)p2;
303     struct cipher_ctx *to_cipher_ctx;
304
305     switch (type) {
306     case EVP_CTRL_COPY:
307         if (cipher_ctx == NULL)
308             return 1;
309         /* when copying the context, a new session needs to be initialized */
310         to_cipher_ctx =
311             (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(to_ctx);
312         memset(&to_cipher_ctx->sess, 0, sizeof(to_cipher_ctx->sess));
313         return cipher_init(to_ctx, cipher_ctx->sess.key, EVP_CIPHER_CTX_iv(ctx),
314                            (cipher_ctx->op == COP_ENCRYPT));
315
316     case EVP_CTRL_INIT:
317         memset(&cipher_ctx->sess, 0, sizeof(cipher_ctx->sess));
318         return 1;
319
320     default:
321         break;
322     }
323
324     return -1;
325 }
326
327 static int cipher_cleanup(EVP_CIPHER_CTX *ctx)
328 {
329     struct cipher_ctx *cipher_ctx =
330         (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
331
332     return clean_devcrypto_session(&cipher_ctx->sess);
333 }
334
335 /*
336  * Keep a table of known nids and associated methods.
337  * Note that known_cipher_nids[] isn't necessarily indexed the same way as
338  * cipher_data[] above, which known_cipher_methods[] is.
339  */
340 static int known_cipher_nids[OSSL_NELEM(cipher_data)];
341 static int known_cipher_nids_amount = -1; /* -1 indicates not yet initialised */
342 static EVP_CIPHER *known_cipher_methods[OSSL_NELEM(cipher_data)] = { NULL, };
343
344 static void prepare_cipher_methods(void)
345 {
346     size_t i;
347     struct session_op sess;
348     unsigned long cipher_mode;
349
350     memset(&sess, 0, sizeof(sess));
351     sess.key = (void *)"01234567890123456789012345678901234567890123456789";
352
353     for (i = 0, known_cipher_nids_amount = 0;
354          i < OSSL_NELEM(cipher_data); i++) {
355
356         /*
357          * Check that the algo is really availably by trying to open and close
358          * a session.
359          */
360         sess.cipher = cipher_data[i].devcryptoid;
361         sess.keylen = cipher_data[i].keylen;
362         if (ioctl(cfd, CIOCGSESSION, &sess) < 0
363             || ioctl(cfd, CIOCFSESSION, &sess.ses) < 0)
364             continue;
365
366         cipher_mode = cipher_data[i].flags & EVP_CIPH_MODE;
367
368         if ((known_cipher_methods[i] =
369                  EVP_CIPHER_meth_new(cipher_data[i].nid,
370                                      cipher_mode == EVP_CIPH_CTR_MODE ? 1 :
371                                                     cipher_data[i].blocksize,
372                                      cipher_data[i].keylen)) == NULL
373             || !EVP_CIPHER_meth_set_iv_length(known_cipher_methods[i],
374                                               cipher_data[i].ivlen)
375             || !EVP_CIPHER_meth_set_flags(known_cipher_methods[i],
376                                           cipher_data[i].flags
377                                           | EVP_CIPH_CUSTOM_COPY
378                                           | EVP_CIPH_CTRL_INIT
379                                           | EVP_CIPH_FLAG_DEFAULT_ASN1)
380             || !EVP_CIPHER_meth_set_init(known_cipher_methods[i], cipher_init)
381             || !EVP_CIPHER_meth_set_do_cipher(known_cipher_methods[i],
382                                      cipher_mode == EVP_CIPH_CTR_MODE ?
383                                               ctr_do_cipher :
384                                               cipher_do_cipher)
385             || !EVP_CIPHER_meth_set_ctrl(known_cipher_methods[i], cipher_ctrl)
386             || !EVP_CIPHER_meth_set_cleanup(known_cipher_methods[i],
387                                             cipher_cleanup)
388             || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i],
389                                                   sizeof(struct cipher_ctx))) {
390             EVP_CIPHER_meth_free(known_cipher_methods[i]);
391             known_cipher_methods[i] = NULL;
392         } else {
393             known_cipher_nids[known_cipher_nids_amount++] =
394                 cipher_data[i].nid;
395         }
396     }
397 }
398
399 static const EVP_CIPHER *get_cipher_method(int nid)
400 {
401     size_t i = get_cipher_data_index(nid);
402
403     if (i == (size_t)-1)
404         return NULL;
405     return known_cipher_methods[i];
406 }
407
408 static int get_cipher_nids(const int **nids)
409 {
410     *nids = known_cipher_nids;
411     return known_cipher_nids_amount;
412 }
413
414 static void destroy_cipher_method(int nid)
415 {
416     size_t i = get_cipher_data_index(nid);
417
418     EVP_CIPHER_meth_free(known_cipher_methods[i]);
419     known_cipher_methods[i] = NULL;
420 }
421
422 static void destroy_all_cipher_methods(void)
423 {
424     size_t i;
425
426     for (i = 0; i < OSSL_NELEM(cipher_data); i++)
427         destroy_cipher_method(cipher_data[i].nid);
428 }
429
430 static int devcrypto_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
431                              const int **nids, int nid)
432 {
433     if (cipher == NULL)
434         return get_cipher_nids(nids);
435
436     *cipher = get_cipher_method(nid);
437
438     return *cipher != NULL;
439 }
440
441 /*
442  * We only support digests if the cryptodev implementation supports multiple
443  * data updates and session copying.  Otherwise, we would be forced to maintain
444  * a cache, which is perilous if there's a lot of data coming in (if someone
445  * wants to checksum an OpenSSL tarball, for example).
446  */
447 #if defined(CIOCCPHASH) && defined(COP_FLAG_UPDATE) && defined(COP_FLAG_FINAL)
448 #define IMPLEMENT_DIGEST
449
450 /******************************************************************************
451  *
452  * Digests
453  *
454  * Because they all do the same basic operation, we have only one set of
455  * method functions for them all to share, and a mapping table between
456  * NIDs and cryptodev IDs, with all the necessary size data.
457  *
458  *****/
459
460 struct digest_ctx {
461     struct session_op sess;
462     /* This signals that the init function was called, not that it succeeded. */
463     int init_called;
464 };
465
466 static const struct digest_data_st {
467     int nid;
468     int digestlen;
469     int devcryptoid;
470 } digest_data[] = {
471 #ifndef OPENSSL_NO_MD5
472     { NID_md5, 16, CRYPTO_MD5 },
473 #endif
474     { NID_sha1, 20, CRYPTO_SHA1 },
475 #ifndef OPENSSL_NO_RMD160
476 # if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_RIPEMD160)
477     { NID_ripemd160, 20, CRYPTO_RIPEMD160 },
478 # endif
479 #endif
480 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_224)
481     { NID_sha224, 224 / 8, CRYPTO_SHA2_224 },
482 #endif
483 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_256)
484     { NID_sha256, 256 / 8, CRYPTO_SHA2_256 },
485 #endif
486 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_384)
487     { NID_sha384, 384 / 8, CRYPTO_SHA2_384 },
488 #endif
489 #if !defined(CHECK_BSD_STYLE_MACROS) || defined(CRYPTO_SHA2_512)
490     { NID_sha512, 512 / 8, CRYPTO_SHA2_512 },
491 #endif
492 };
493
494 static size_t get_digest_data_index(int nid)
495 {
496     size_t i;
497
498     for (i = 0; i < OSSL_NELEM(digest_data); i++)
499         if (nid == digest_data[i].nid)
500             return i;
501
502     /*
503      * Code further down must make sure that only NIDs in the table above
504      * are used.  If any other NID reaches this function, there's a grave
505      * coding error further down.
506      */
507     assert("Code that never should be reached" == NULL);
508     return -1;
509 }
510
511 static const struct digest_data_st *get_digest_data(int nid)
512 {
513     return &digest_data[get_digest_data_index(nid)];
514 }
515
516 /*
517  * Following are the four necessary functions to map OpenSSL functionality
518  * with cryptodev.
519  */
520
521 static int digest_init(EVP_MD_CTX *ctx)
522 {
523     struct digest_ctx *digest_ctx =
524         (struct digest_ctx *)EVP_MD_CTX_md_data(ctx);
525     const struct digest_data_st *digest_d =
526         get_digest_data(EVP_MD_CTX_type(ctx));
527
528     digest_ctx->init_called = 1;
529
530     memset(&digest_ctx->sess, 0, sizeof(digest_ctx->sess));
531     digest_ctx->sess.mac = digest_d->devcryptoid;
532     if (ioctl(cfd, CIOCGSESSION, &digest_ctx->sess) < 0) {
533         SYSerr(SYS_F_IOCTL, errno);
534         return 0;
535     }
536
537     return 1;
538 }
539
540 static int digest_op(struct digest_ctx *ctx, const void *src, size_t srclen,
541                      void *res, unsigned int flags)
542 {
543     struct crypt_op cryp;
544
545     memset(&cryp, 0, sizeof(cryp));
546     cryp.ses = ctx->sess.ses;
547     cryp.len = srclen;
548     cryp.src = (void *)src;
549     cryp.dst = NULL;
550     cryp.mac = res;
551     cryp.flags = flags;
552     return ioctl(cfd, CIOCCRYPT, &cryp);
553 }
554
555 static int digest_update(EVP_MD_CTX *ctx, const void *data, size_t count)
556 {
557     struct digest_ctx *digest_ctx =
558         (struct digest_ctx *)EVP_MD_CTX_md_data(ctx);
559
560     if (count == 0)
561         return 1;
562
563     if (digest_ctx == NULL)
564         return 0;
565
566     if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) < 0) {
567         SYSerr(SYS_F_IOCTL, errno);
568         return 0;
569     }
570
571     return 1;
572 }
573
574 static int digest_final(EVP_MD_CTX *ctx, unsigned char *md)
575 {
576     struct digest_ctx *digest_ctx =
577         (struct digest_ctx *)EVP_MD_CTX_md_data(ctx);
578
579     if (md == NULL || digest_ctx == NULL)
580         return 0;
581     if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) {
582         SYSerr(SYS_F_IOCTL, errno);
583         return 0;
584     }
585
586     return 1;
587 }
588
589 static int digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from)
590 {
591     struct digest_ctx *digest_from =
592         (struct digest_ctx *)EVP_MD_CTX_md_data(from);
593     struct digest_ctx *digest_to =
594         (struct digest_ctx *)EVP_MD_CTX_md_data(to);
595     struct cphash_op cphash;
596
597     if (digest_from == NULL || digest_from->init_called != 1)
598         return 1;
599
600     if (!digest_init(to)) {
601         SYSerr(SYS_F_IOCTL, errno);
602         return 0;
603     }
604
605     cphash.src_ses = digest_from->sess.ses;
606     cphash.dst_ses = digest_to->sess.ses;
607     if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) {
608         SYSerr(SYS_F_IOCTL, errno);
609         return 0;
610     }
611     return 1;
612 }
613
614 static int digest_cleanup(EVP_MD_CTX *ctx)
615 {
616     struct digest_ctx *digest_ctx =
617         (struct digest_ctx *)EVP_MD_CTX_md_data(ctx);
618
619     if (digest_ctx == NULL)
620         return 1;
621
622     return clean_devcrypto_session(&digest_ctx->sess);
623 }
624
625 static int devcrypto_test_digest(size_t digest_data_index)
626 {
627     struct session_op sess1, sess2;
628     struct cphash_op cphash;
629     int ret=0;
630
631     memset(&sess1, 0, sizeof(sess1));
632     memset(&sess2, 0, sizeof(sess2));
633     sess1.mac = digest_data[digest_data_index].devcryptoid;
634     if (ioctl(cfd, CIOCGSESSION, &sess1) < 0)
635         return 0;
636     /* Make sure the driver is capable of hash state copy */
637     sess2.mac = sess1.mac;
638     if (ioctl(cfd, CIOCGSESSION, &sess2) >= 0) {
639         cphash.src_ses = sess1.ses;
640         cphash.dst_ses = sess2.ses;
641         if (ioctl(cfd, CIOCCPHASH, &cphash) >= 0)
642             ret = 1;
643         ioctl(cfd, CIOCFSESSION, &sess2.ses);
644     }
645     ioctl(cfd, CIOCFSESSION, &sess1.ses);
646     return ret;
647 }
648
649 /*
650  * Keep a table of known nids and associated methods.
651  * Note that known_digest_nids[] isn't necessarily indexed the same way as
652  * digest_data[] above, which known_digest_methods[] is.
653  */
654 static int known_digest_nids[OSSL_NELEM(digest_data)];
655 static int known_digest_nids_amount = -1; /* -1 indicates not yet initialised */
656 static EVP_MD *known_digest_methods[OSSL_NELEM(digest_data)] = { NULL, };
657
658 static void prepare_digest_methods(void)
659 {
660     size_t i;
661
662     for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data);
663          i++) {
664
665         /*
666          * Check that the algo is usable
667          */
668         if (!devcrypto_test_digest(i))
669             continue;
670
671         if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid,
672                                                        NID_undef)) == NULL
673             || !EVP_MD_meth_set_result_size(known_digest_methods[i],
674                                             digest_data[i].digestlen)
675             || !EVP_MD_meth_set_init(known_digest_methods[i], digest_init)
676             || !EVP_MD_meth_set_update(known_digest_methods[i], digest_update)
677             || !EVP_MD_meth_set_final(known_digest_methods[i], digest_final)
678             || !EVP_MD_meth_set_copy(known_digest_methods[i], digest_copy)
679             || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup)
680             || !EVP_MD_meth_set_app_datasize(known_digest_methods[i],
681                                              sizeof(struct digest_ctx))) {
682             EVP_MD_meth_free(known_digest_methods[i]);
683             known_digest_methods[i] = NULL;
684         } else {
685             known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid;
686         }
687     }
688 }
689
690 static const EVP_MD *get_digest_method(int nid)
691 {
692     size_t i = get_digest_data_index(nid);
693
694     if (i == (size_t)-1)
695         return NULL;
696     return known_digest_methods[i];
697 }
698
699 static int get_digest_nids(const int **nids)
700 {
701     *nids = known_digest_nids;
702     return known_digest_nids_amount;
703 }
704
705 static void destroy_digest_method(int nid)
706 {
707     size_t i = get_digest_data_index(nid);
708
709     EVP_MD_meth_free(known_digest_methods[i]);
710     known_digest_methods[i] = NULL;
711 }
712
713 static void destroy_all_digest_methods(void)
714 {
715     size_t i;
716
717     for (i = 0; i < OSSL_NELEM(digest_data); i++)
718         destroy_digest_method(digest_data[i].nid);
719 }
720
721 static int devcrypto_digests(ENGINE *e, const EVP_MD **digest,
722                              const int **nids, int nid)
723 {
724     if (digest == NULL)
725         return get_digest_nids(nids);
726
727     *digest = get_digest_method(nid);
728
729     return *digest != NULL;
730 }
731
732 #endif
733
734 /******************************************************************************
735  *
736  * LOAD / UNLOAD
737  *
738  *****/
739
740 static int devcrypto_unload(ENGINE *e)
741 {
742     destroy_all_cipher_methods();
743 #ifdef IMPLEMENT_DIGEST
744     destroy_all_digest_methods();
745 #endif
746
747     close(cfd);
748
749     return 1;
750 }
751 /*
752  * This engine is always built into libcrypto, so it doesn't offer any
753  * ability to be dynamically loadable.
754  */
755 void engine_load_devcrypto_int()
756 {
757     ENGINE *e = NULL;
758
759     if ((cfd = open("/dev/crypto", O_RDWR, 0)) < 0) {
760 #ifndef ENGINE_DEVCRYPTO_DEBUG
761         if (errno != ENOENT)
762 #endif
763             fprintf(stderr, "Could not open /dev/crypto: %s\n", strerror(errno));
764         return;
765     }
766
767     if ((e = ENGINE_new()) == NULL
768         || !ENGINE_set_destroy_function(e, devcrypto_unload)) {
769         ENGINE_free(e);
770         /*
771          * We know that devcrypto_unload() won't be called when one of the
772          * above two calls have failed, so we close cfd explicitly here to
773          * avoid leaking resources.
774          */
775         close(cfd);
776         return;
777     }
778
779     prepare_cipher_methods();
780 #ifdef IMPLEMENT_DIGEST
781     prepare_digest_methods();
782 #endif
783
784     if (!ENGINE_set_id(e, "devcrypto")
785         || !ENGINE_set_name(e, "/dev/crypto engine")
786
787 /*
788  * Asymmetric ciphers aren't well supported with /dev/crypto.  Among the BSD
789  * implementations, it seems to only exist in FreeBSD, and regarding the
790  * parameters in its crypt_kop, the manual crypto(4) has this to say:
791  *
792  *    The semantics of these arguments are currently undocumented.
793  *
794  * Reading through the FreeBSD source code doesn't give much more than
795  * their CRK_MOD_EXP implementation for ubsec.
796  *
797  * It doesn't look much better with cryptodev-linux.  They have the crypt_kop
798  * structure as well as the command (CRK_*) in cryptodev.h, but no support
799  * seems to be implemented at all for the moment.
800  *
801  * At the time of writing, it seems impossible to write proper support for
802  * FreeBSD's asym features without some very deep knowledge and access to
803  * specific kernel modules.
804  *
805  * /Richard Levitte, 2017-05-11
806  */
807 #if 0
808 # ifndef OPENSSL_NO_RSA
809         || !ENGINE_set_RSA(e, devcrypto_rsa)
810 # endif
811 # ifndef OPENSSL_NO_DSA
812         || !ENGINE_set_DSA(e, devcrypto_dsa)
813 # endif
814 # ifndef OPENSSL_NO_DH
815         || !ENGINE_set_DH(e, devcrypto_dh)
816 # endif
817 # ifndef OPENSSL_NO_EC
818         || !ENGINE_set_EC(e, devcrypto_ec)
819 # endif
820 #endif
821         || !ENGINE_set_ciphers(e, devcrypto_ciphers)
822 #ifdef IMPLEMENT_DIGEST
823         || !ENGINE_set_digests(e, devcrypto_digests)
824 #endif
825         ) {
826         ENGINE_free(e);
827         return;
828     }
829
830     ENGINE_add(e);
831     ENGINE_free(e);          /* Loose our local reference */
832     ERR_clear_error();
833 }