/src/krb5/src/lib/crypto/krb/prf_cmac.c
Line | Count | Source |
1 | | /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
2 | | /* lib/crypto/krb/prf_cmac.c - CMAC-based PRF */ |
3 | | /* |
4 | | * Copyright (C) 2010 by the Massachusetts Institute of Technology. |
5 | | * All rights reserved. |
6 | | * |
7 | | * Export of this software from the United States of America may |
8 | | * require a specific license from the United States Government. |
9 | | * It is the responsibility of any person or organization contemplating |
10 | | * export to obtain such a license before exporting. |
11 | | * |
12 | | * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and |
13 | | * distribute this software and its documentation for any purpose and |
14 | | * without fee is hereby granted, provided that the above copyright |
15 | | * notice appear in all copies and that both that copyright notice and |
16 | | * this permission notice appear in supporting documentation, and that |
17 | | * the name of M.I.T. not be used in advertising or publicity pertaining |
18 | | * to distribution of the software without specific, written prior |
19 | | * permission. Furthermore if you modify this software you must label |
20 | | * your software as modified software and not distribute it in such a |
21 | | * fashion that it might be confused with the original M.I.T. software. |
22 | | * M.I.T. makes no representations about the suitability of |
23 | | * this software for any purpose. It is provided "as is" without express |
24 | | * or implied warranty. |
25 | | */ |
26 | | |
27 | | #include "crypto_int.h" |
28 | | |
29 | | krb5_error_code |
30 | | krb5int_dk_cmac_prf(const struct krb5_keytypes *ktp, krb5_key key, |
31 | | const krb5_data *in, krb5_data *out) |
32 | 372 | { |
33 | 372 | krb5_crypto_iov iov; |
34 | 372 | krb5_data prfconst = make_data("prf", 3); |
35 | 372 | krb5_key kp = NULL; |
36 | 372 | krb5_error_code ret; |
37 | | |
38 | 372 | if (ktp->prf_length != ktp->enc->block_size) |
39 | 0 | return KRB5_BAD_MSIZE; |
40 | | |
41 | 372 | iov.flags = KRB5_CRYPTO_TYPE_DATA; |
42 | 372 | iov.data = *in; |
43 | | |
44 | | /* Derive a key using the PRF constant. */ |
45 | 372 | ret = krb5int_derive_key(ktp->enc, NULL, key, &kp, &prfconst, |
46 | 372 | DERIVE_SP800_108_CMAC); |
47 | 372 | if (ret != 0) |
48 | 0 | goto cleanup; |
49 | | |
50 | | /* PRF is CMAC of input */ |
51 | 372 | ret = krb5int_cmac_checksum(ktp->enc, kp, &iov, 1, out); |
52 | 372 | if (ret != 0) |
53 | 0 | goto cleanup; |
54 | | |
55 | 372 | cleanup: |
56 | | krb5_k_free_key(NULL, kp); |
57 | 372 | return ret; |
58 | 372 | } |