1 /*
2  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #include <des_int.h>
7 #include <sys/crypto/api.h>
8 
9 #include <sys/callb.h>
10 #include <sys/uio.h>
11 #include <sys/cmn_err.h>
12 
13 int
k5_ef_crypto(const char * in,char * out,long length,krb5_keyblock * key,const krb5_data * ivec,int encrypt_flag)14 k5_ef_crypto(const char *in, char *out,
15 	long length, krb5_keyblock *key,
16 	const krb5_data *ivec, int encrypt_flag)
17 {
18 	int rv = CRYPTO_FAILED;
19 
20 	crypto_mechanism_t mech;
21 	crypto_data_t d1, d2;
22 
23 	ASSERT(in != NULL);
24 	ASSERT(out != NULL);
25 	ASSERT(key != NULL);
26 	ASSERT(key->contents != NULL);
27 
28 	bzero(&d1, sizeof (d1));
29 	bzero(&d2, sizeof (d2));
30 
31 	d1.cd_format = CRYPTO_DATA_RAW;
32 	d1.cd_offset = 0;
33 	d1.cd_length = length;
34 	d1.cd_raw.iov_base = (char *)in;
35 	d1.cd_raw.iov_len = length;
36 
37 	d2.cd_format = CRYPTO_DATA_RAW;
38 	d2.cd_offset = 0;
39 	d2.cd_length = length;
40 	d2.cd_raw.iov_base = (char *)out;
41 	d2.cd_raw.iov_len = length;
42 
43 	mech.cm_type = key->kef_mt;
44 	if (mech.cm_type == CRYPTO_MECH_INVALID) {
45 		KRB5_LOG(KRB5_ERR,
46 		    "k5_ef_crypto - invalid crypto mech type: 0x%llx",
47 		    (long long)key->kef_mt);
48 		return (CRYPTO_FAILED);
49 	}
50 
51 	if (ivec != NULL) {
52 		mech.cm_param_len = ivec->length;
53 		mech.cm_param = (char *)ivec->data;
54 	} else {
55 		mech.cm_param_len = 0;
56 		mech.cm_param = NULL;
57 	}
58 
59 	if (encrypt_flag)
60 		rv = crypto_encrypt(&mech, &d1,
61 				    &key->kef_key,
62 				    key->key_tmpl,
63 				    (in != out ? &d2 : NULL),
64 				    NULL);
65 	else
66 		rv = crypto_decrypt(&mech, &d1,
67 				    &key->kef_key,
68 				    key->key_tmpl,
69 				    (in != out ? &d2 : NULL),
70 				    NULL);
71 
72 	if (rv != CRYPTO_SUCCESS) {
73 		KRB5_LOG1(KRB5_ERR,
74 			"k5_ef_crypto: %s error: rv = 0x%08x",
75 			(encrypt_flag ? "encrypt" : "decrypt"),
76 			rv);
77 		return (CRYPTO_FAILED);
78 	}
79 
80 	return (0);
81 }
82