2 Unix SMB/CIFS implementation.
4 Database Glue between Samba and the KDC
6 Copyright (C) Guenther Deschner <gd@samba.org> 2014
7 Copyright (C) Andreas Schneider <asn@samba.org> 2014
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "system/kerberos.h"
27 #include "samba_kdc.h"
28 #include "lib/krb5_wrap/krb5_samba.h"
31 #define DBGC_CLASS DBGC_KERBEROS
33 void sdb_key_free(struct sdb_key
*k
)
40 * Passing NULL as the Kerberos context is intentional here, as
41 * both Heimdal and MIT libraries don't use the context when
42 * clearing the keyblocks.
44 krb5_free_keyblock_contents(NULL
, &k
->key
);
47 smb_krb5_free_data_contents(NULL
, &k
->salt
->salt
);
54 void sdb_keys_free(struct sdb_keys
*keys
)
62 for (i
=0; i
< keys
->len
; i
++) {
63 sdb_key_free(&keys
->val
[i
]);
70 void sdb_entry_free(struct sdb_entry
*s
)
72 if (s
->skdc_entry
!= NULL
) {
73 s
->skdc_entry
->db_entry
= NULL
;
74 TALLOC_FREE(s
->skdc_entry
);
78 * Passing NULL as the Kerberos context is intentional here, as both
79 * Heimdal and MIT libraries don't use the context when clearing the
82 krb5_free_principal(NULL
, s
->principal
);
84 sdb_keys_free(&s
->keys
);
86 sdb_keys_free(&s
->old_keys
);
87 sdb_keys_free(&s
->older_keys
);
88 if (s
->session_etypes
!= NULL
) {
89 SAFE_FREE(s
->session_etypes
->val
);
91 SAFE_FREE(s
->session_etypes
);
92 krb5_free_principal(NULL
, s
->created_by
.principal
);
94 krb5_free_principal(NULL
, s
->modified_by
->principal
);
96 SAFE_FREE(s
->valid_start
);
97 SAFE_FREE(s
->valid_end
);
99 SAFE_FREE(s
->max_life
);
100 SAFE_FREE(s
->max_renew
);
105 /* Set the etypes of an sdb_entry based on its available current keys. */
106 krb5_error_code
sdb_entry_set_etypes(struct sdb_entry
*s
)
108 if (s
->keys
.val
!= NULL
) {
111 s
->etypes
= malloc(sizeof(*s
->etypes
));
112 if (s
->etypes
== NULL
) {
116 s
->etypes
->len
= s
->keys
.len
;
118 s
->etypes
->val
= calloc(s
->etypes
->len
, sizeof(*s
->etypes
->val
));
119 if (s
->etypes
->val
== NULL
) {
120 SAFE_FREE(s
->etypes
);
124 for (i
= 0; i
< s
->etypes
->len
; i
++) {
125 const struct sdb_key
*k
= &s
->keys
.val
[i
];
127 s
->etypes
->val
[i
] = KRB5_KEY_TYPE(&(k
->key
));
135 * Set the session etypes of a server sdb_entry based on its etypes, forcing in
136 * strong etypes as desired.
138 krb5_error_code
sdb_entry_set_session_etypes(struct sdb_entry
*s
,
146 /* Reserve space for AES256 */
151 /* Reserve space for AES128 */
156 /* Reserve space for RC4. */
163 s
->session_etypes
= malloc(sizeof(*s
->session_etypes
));
164 if (s
->session_etypes
== NULL
) {
168 /* session_etypes must be sorted in order of strength, with preferred etype first. */
170 s
->session_etypes
->val
= calloc(len
, sizeof(*s
->session_etypes
->val
));
171 if (s
->session_etypes
->val
== NULL
) {
172 SAFE_FREE(s
->session_etypes
);
178 s
->session_etypes
->val
[j
++] = ENCTYPE_AES256_CTS_HMAC_SHA1_96
;
183 s
->session_etypes
->val
[j
++] = ENCTYPE_AES128_CTS_HMAC_SHA1_96
;
188 s
->session_etypes
->val
[j
++] = ENCTYPE_ARCFOUR_HMAC
;
191 s
->session_etypes
->len
= j
;