summaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2011-06-22 16:23:52 -0400
committerSimo Sorce <ssorce@redhat.com>2011-08-26 08:24:49 -0400
commit7d41e7b4d43d882eb4cc99f0600078e0f34f1774 (patch)
treee5022d21694a8668743abef683ae9da73faaf6c7 /util
parenteed401306c400ae938e2d328de22da6f729c8f3f (diff)
downloadfreeipa-7d41e7b4d43d882eb4cc99f0600078e0f34f1774.tar.gz
freeipa-7d41e7b4d43d882eb4cc99f0600078e0f34f1774.tar.xz
freeipa-7d41e7b4d43d882eb4cc99f0600078e0f34f1774.zip
ipa-pwd-extop: make encsalt parsing function common
It is going to be used by the ipa-kdb module too.
Diffstat (limited to 'util')
-rw-r--r--util/ipa_krb5.c73
-rw-r--r--util/ipa_krb5.h6
2 files changed, 79 insertions, 0 deletions
diff --git a/util/ipa_krb5.c b/util/ipa_krb5.c
index 3cedbedb6..96056c769 100644
--- a/util/ipa_krb5.c
+++ b/util/ipa_krb5.c
@@ -379,3 +379,76 @@ done:
return ret;
}
+krb5_error_code parse_bval_key_salt_tuples(krb5_context kcontext,
+ const char * const *vals,
+ int n_vals,
+ krb5_key_salt_tuple **kst,
+ int *n_kst)
+{
+ krb5_error_code kerr;
+ krb5_key_salt_tuple *ks;
+ int n_ks;
+ int i;
+
+ ks = calloc(n_vals + 1, sizeof(krb5_key_salt_tuple));
+ if (!ks) {
+ return ENOMEM;
+ }
+
+ for (i = 0, n_ks = 0; i < n_vals; i++) {
+ char *enc, *salt;
+ krb5_int32 tmpsalt;
+ krb5_enctype tmpenc;
+ krb5_boolean similar;
+ krb5_error_code krberr;
+ int j;
+
+ enc = strdup(vals[i]);
+ if (!enc) {
+ kerr = ENOMEM;
+ goto fail;
+ }
+
+ salt = strchr(enc, ':');
+ if (!salt) {
+ free(enc);
+ continue;
+ }
+ *salt = '\0'; /* null terminate the enc type */
+ salt++; /* skip : */
+
+ krberr = krb5_string_to_enctype(enc, &tmpenc);
+ if (krberr) {
+ free(enc);
+ continue;
+ }
+
+ krberr = krb5_string_to_salttype(salt, &tmpsalt);
+ for (j = 0; j < n_ks; j++) {
+ krb5_c_enctype_compare(kcontext,
+ ks[j].ks_enctype, tmpenc, &similar);
+ if (similar && (ks[j].ks_salttype == tmpsalt)) {
+ break;
+ }
+ }
+
+ if (j == n_ks) {
+ /* not found */
+ ks[j].ks_enctype = tmpenc;
+ ks[j].ks_salttype = tmpsalt;
+ n_ks++;
+ }
+
+ free(enc);
+ }
+
+ *kst = ks;
+ *n_kst = n_ks;
+
+ return 0;
+
+fail:
+ free(ks);
+ return kerr;
+}
+
diff --git a/util/ipa_krb5.h b/util/ipa_krb5.h
index ee6078db3..7019e5e63 100644
--- a/util/ipa_krb5.h
+++ b/util/ipa_krb5.h
@@ -26,4 +26,10 @@ int ber_encode_krb5_key_data(krb5_key_data *data,
int numk, int mkvno,
struct berval **encoded);
+krb5_error_code parse_bval_key_salt_tuples(krb5_context kcontext,
+ const char * const *vals,
+ int n_vals,
+ krb5_key_salt_tuple **kst,
+ int *n_kst);
+
#endif /* __IPA_KRB5_H_ */