Merge branch 'master' into tlv-mic
authorLuke Howard <lukeh@padl.com>
Sun, 15 May 2011 15:26:36 +0000 (17:26 +0200)
committerLuke Howard <lukeh@padl.com>
Sun, 15 May 2011 15:26:36 +0000 (17:26 +0200)
22 files changed:
.gitmodules
admin/pull_foreign_repos
firefox [new submodule]
moonshot/mech_eap/Makefile.am
moonshot/mech_eap/TODO
moonshot/mech_eap/accept_sec_context.c
moonshot/mech_eap/acquire_cred.c
moonshot/mech_eap/acquire_cred_ext.c [new file with mode: 0644]
moonshot/mech_eap/acquire_cred_with_password.c
moonshot/mech_eap/add_cred.c
moonshot/mech_eap/add_cred_with_password.c
moonshot/mech_eap/gsseap_err.et
moonshot/mech_eap/init_sec_context.c
moonshot/mech_eap/inquire_cred.c
moonshot/mech_eap/inquire_cred_by_mech.c [new file with mode: 0644]
moonshot/mech_eap/mech_eap.exports
moonshot/mech_eap/set_sec_context_option.c
moonshot/mech_eap/util.h
moonshot/mech_eap/util_cred.c
moonshot/mech_eap/util_mech.c
moonshot/mech_eap/util_saml.cpp
openssh

index cda0ebd..8eb03cc 100644 (file)
@@ -28,3 +28,6 @@
 [submodule "jansson"]
        path = jansson
        url = git://github.com/akheron/jansson.git
+[submodule "firefox"]
+       path = firefox
+       url = http://www.project-moonshot.org/git/moonshot-firefox.git
index a3a41b2..aff6363 100755 (executable)
@@ -9,3 +9,5 @@ cd $module_root/shibboleth
 for rep in *.git; do
     (cd $rep&&git svn fetch)
     done
+cd $module_root/radsecproxy.git
+git fetch origin
diff --git a/firefox b/firefox
new file mode 160000 (submodule)
index 0000000..3dd30c1
--- /dev/null
+++ b/firefox
@@ -0,0 +1 @@
+Subproject commit 3dd30c1cb60608e936d6734b29eb9c01a67cbac6
index c8fba95..8da8ebc 100644 (file)
@@ -25,6 +25,7 @@ mech_eap_la_LIBADD   = @KRB5_LIBS@ ../libeap/libeap.la @RADSEC_LIBS@ \
 mech_eap_la_SOURCES =                          \
        accept_sec_context.c                    \
        acquire_cred.c                          \
+       acquire_cred_ext.c                      \
        acquire_cred_with_password.c            \
        add_cred.c                              \
        add_cred_with_password.c                \
@@ -52,6 +53,7 @@ mech_eap_la_SOURCES =                         \
        inquire_attrs_for_mech.c                \
        inquire_context.c                       \
        inquire_cred.c                          \
+       inquire_cred_by_mech.c                  \
        inquire_cred_by_oid.c                   \
        inquire_mech_for_saslname.c             \
        inquire_mechs_for_name.c                \
index d622364..17780ec 100644 (file)
@@ -4,4 +4,4 @@
 
 - fix ABNF: no slash in the case where there is no host
 - specify anonymous behaviour: use empty name
-
+- always intern OIDs so they never need to be freed
index 17d1020..d3ee0b0 100644 (file)
@@ -955,6 +955,7 @@ gss_accept_sec_context(OM_uint32 *minor,
         if (ctx->defaultCred == GSS_C_NO_CREDENTIAL) {
             major = gssEapAcquireCred(minor,
                                       GSS_C_NO_NAME,
+                                      GSS_C_NO_OID,
                                       GSS_C_NO_BUFFER,
                                       GSS_C_INDEFINITE,
                                       GSS_C_NO_OID_SET,
index 2326eaa..8c5f7fc 100644 (file)
@@ -46,7 +46,13 @@ gss_acquire_cred(OM_uint32 *minor,
                  gss_OID_set *actual_mechs,
                  OM_uint32 *time_rec)
 {
-    return gssEapAcquireCred(minor, desired_name, GSS_C_NO_BUFFER,
-                             time_req, desired_mechs, cred_usage,
-                             output_cred_handle, actual_mechs, time_rec);
+    return gssEapAcquireCred(minor,
+                             desired_name,
+                             GSS_C_NO_OID,
+                             GSS_C_NO_BUFFER,
+                             time_req,
+                             desired_mechs, cred_usage,
+                             output_cred_handle,
+                             actual_mechs,
+                             time_rec);
 }
diff --git a/moonshot/mech_eap/acquire_cred_ext.c b/moonshot/mech_eap/acquire_cred_ext.c
new file mode 100644 (file)
index 0000000..d8c2c61
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2011, JANET(UK)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of JANET(UK) nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Wrapper for acquiring a credential handle.
+ */
+
+#include "gssapiP_eap.h"
+
+OM_uint32
+gss_acquire_cred_ext
+           (OM_uint32 *minor,
+            const gss_name_t desired_name,
+            gss_const_OID credential_type,
+            const void *credential_data,
+            OM_uint32 time_req,
+            gss_const_OID desired_mech,
+            gss_cred_usage_t cred_usage,
+            gss_cred_id_t *output_cred_handle
+           )
+{
+    OM_uint32 major;
+    gss_OID_set_desc mechs;
+
+    mechs.count = 1;
+    mechs.elements = (gss_OID)desired_mech;
+
+    major = gssEapAcquireCred(minor,
+                              desired_name,
+                              credential_type,
+                              credential_data,
+                              time_req,
+                              &mechs,
+                              cred_usage,
+                              output_cred_handle,
+                              NULL,
+                              NULL);
+
+    return major;
+}
index c0f4159..5904616 100644 (file)
@@ -47,7 +47,14 @@ gssspi_acquire_cred_with_password(OM_uint32 *minor,
                                   gss_OID_set *actual_mechs,
                                   OM_uint32 *time_rec)
 {
-    return gssEapAcquireCred(minor, desired_name, password,
-                             time_req, desired_mechs, cred_usage,
-                             output_cred_handle, actual_mechs, time_rec);
+    return gssEapAcquireCred(minor,
+                             desired_name,
+                             &gssEapPasswordCredType,
+                             password,
+                             time_req,
+                             desired_mechs,
+                             cred_usage,
+                             output_cred_handle,
+                             actual_mechs,
+                             time_rec);
 }
index 37d0add..e6ca129 100644 (file)
@@ -71,6 +71,7 @@ gss_add_cred(OM_uint32 *minor,
 
     major = gssEapAcquireCred(minor,
                               desired_name,
+                              GSS_C_NO_OID,
                               GSS_C_NO_BUFFER,
                               time_req,
                               &mechs,
index 7907138..6193405 100644 (file)
@@ -67,6 +67,7 @@ gss_add_cred_with_password(OM_uint32 *minor,
 
     major = gssEapAcquireCred(minor,
                               desired_name,
+                              &gssEapPasswordCredType,
                               password,
                               time_req,
                               &mechs,
index 6bcfff0..d85c134 100644 (file)
@@ -79,9 +79,11 @@ error_code GSSEAP_BAD_USAGE,                    "Credential usage type is unknow
 error_code GSSEAP_CRED_USAGE_MISMATCH,          "Credential usage does not match requested usage"
 error_code GSSEAP_CRED_MECH_MISMATCH,           "Credential is not usable with this mechanism"
 error_code GSSEAP_CRED_EXPIRED,                 "Attributes indicate credentials have expired"
+error_code GSSEAP_BAD_CRED_TYPE,                "Bad credential type"
 error_code GSSEAP_BAD_CRED_OPTION,              "Bad credential option"
 error_code GSSEAP_NO_DEFAULT_IDENTITY,          "Default credentials identity unavailable"
 error_code GSSEAP_NO_DEFAULT_CRED,              "Missing default password or other credentials"
+
 #
 # Wrap/unwrap/PRF errors
 #
index becb767..849f22a 100644 (file)
@@ -1054,6 +1054,7 @@ gss_init_sec_context(OM_uint32 *minor,
         if (ctx->defaultCred == GSS_C_NO_CREDENTIAL) {
             major = gssEapAcquireCred(minor,
                                       GSS_C_NO_NAME,
+                                      GSS_C_NO_OID,
                                       GSS_C_NO_BUFFER,
                                       time_req,
                                       GSS_C_NO_OID_SET,
index 2e684b7..6c0114b 100644 (file)
@@ -45,7 +45,6 @@ gss_inquire_cred(OM_uint32 *minor,
                  gss_OID_set *mechanisms)
 {
     OM_uint32 major;
-    time_t now, lifetime;
 
     if (cred == NULL) {
         *minor = EINVAL;
@@ -54,60 +53,8 @@ gss_inquire_cred(OM_uint32 *minor,
 
     GSSEAP_MUTEX_LOCK(&cred->mutex);
 
-    if (name != NULL) {
-        major = gssEapDuplicateName(minor, cred->name, name);
-        if (GSS_ERROR(major))
-            goto cleanup;
-    }
-
-    if (cred_usage != NULL) {
-        OM_uint32 flags = (cred->flags & (CRED_FLAG_INITIATE | CRED_FLAG_ACCEPT));
-
-        switch (flags) {
-        case CRED_FLAG_INITIATE:
-            *cred_usage = GSS_C_INITIATE;
-            break;
-        case CRED_FLAG_ACCEPT:
-            *cred_usage = GSS_C_ACCEPT;
-            break;
-        default:
-            *cred_usage = GSS_C_BOTH;
-            break;
-        }
-    }
-
-    if (mechanisms != NULL) {
-        if (cred->mechanisms != GSS_C_NO_OID_SET)
-            major = duplicateOidSet(minor, cred->mechanisms, mechanisms);
-        else
-            major = gssEapIndicateMechs(minor, mechanisms);
-        if (GSS_ERROR(major))
-            goto cleanup;
-    }
-
-    if (cred->expiryTime == 0) {
-        lifetime = GSS_C_INDEFINITE;
-    } else  {
-        now = time(NULL);
-        lifetime = now - cred->expiryTime;
-        if (lifetime < 0)
-            lifetime = 0;
-    }
-
-    if (pLifetime != NULL) {
-        *pLifetime = lifetime;
-    }
-
-    if (lifetime == 0) {
-        major = GSS_S_CREDENTIALS_EXPIRED;
-        *minor = GSSEAP_CRED_EXPIRED;
-        goto cleanup;
-    }
-
-    major = GSS_S_COMPLETE;
-    *minor = 0;
+    major = gssEapInquireCred(minor, cred, name, pLifetime, cred_usage, mechanisms);
 
-cleanup:
     GSSEAP_MUTEX_UNLOCK(&cred->mutex);
 
     return major;
diff --git a/moonshot/mech_eap/inquire_cred_by_mech.c b/moonshot/mech_eap/inquire_cred_by_mech.c
new file mode 100644 (file)
index 0000000..24da201
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2011, JANET(UK)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of JANET(UK) nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Return credential handle properties.
+ */
+
+#include "gssapiP_eap.h"
+
+OM_uint32
+gss_inquire_cred_by_mech(OM_uint32 *minor,
+                         gss_cred_id_t cred,
+                         gss_OID mech_type,
+                         gss_name_t *name,
+                         OM_uint32 *pInitiatorLifetime,
+                         OM_uint32 *pAcceptorLifetime,
+                         gss_cred_usage_t *cred_usage)
+{
+    OM_uint32 major, lifetime;
+
+    if (cred == NULL) {
+        *minor = EINVAL;
+        return GSS_S_NO_CRED;
+    }
+
+    GSSEAP_MUTEX_LOCK(&cred->mutex);
+
+    if (!gssEapCredAvailable(cred, mech_type)) {
+        major = GSS_S_BAD_MECH;
+        *minor = GSSEAP_CRED_MECH_MISMATCH;
+        goto cleanup;
+    }
+
+    major = gssEapInquireCred(minor, cred, name, &lifetime, cred_usage, NULL);
+    if (GSS_ERROR(major))
+        goto cleanup;
+
+    if (pInitiatorLifetime != NULL)
+        *pInitiatorLifetime = (cred->flags & CRED_FLAG_INITIATE) ? lifetime : 0;
+    if (pAcceptorLifetime != NULL)
+        *pAcceptorLifetime = (cred->flags & CRED_FLAG_ACCEPT) ? lifetime : 0;
+
+cleanup:
+    GSSEAP_MUTEX_UNLOCK(&cred->mutex);
+
+    return major;
+}
index 767caeb..7b4f0ea 100644 (file)
@@ -1,5 +1,6 @@
 gss_accept_sec_context
 gss_acquire_cred
+gss_acquire_cred_ext
 gss_add_cred
 gss_add_cred_with_password
 gss_authorize_localname
@@ -23,6 +24,7 @@ gss_init_sec_context
 gss_inquire_attrs_for_mech
 gss_inquire_context
 gss_inquire_cred
+gss_inquire_cred_by_mech
 gss_inquire_cred_by_oid
 gss_inquire_mechs_for_name
 gss_inquire_mech_for_saslname
index 1f373c2..45ef266 100644 (file)
@@ -50,12 +50,17 @@ gss_set_sec_context_option(OM_uint32 *minor,
                            const gss_buffer_t value)
 {
     OM_uint32 major;
-    gss_ctx_id_t ctx = *pCtx;
+    gss_ctx_id_t ctx;
     int i;
 
     major = GSS_S_UNAVAILABLE;
     *minor = GSSEAP_BAD_CONTEXT_OPTION;
 
+    if (pCtx == NULL)
+        ctx = GSS_C_NO_CONTEXT;
+    else
+        ctx = *pCtx;
+
     if (ctx != GSS_C_NO_CONTEXT)
         GSSEAP_MUTEX_LOCK(&ctx->mutex);
 
@@ -67,9 +72,9 @@ gss_set_sec_context_option(OM_uint32 *minor,
         }
     }
 
-    if (*pCtx == NULL)
+    if (pCtx != NULL && *pCtx == NULL)
         *pCtx = ctx;
-    else
+    else if (ctx != GSS_C_NO_CONTEXT)
         GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
 
     return major;
index e5376a6..c5d5762 100644 (file)
@@ -225,13 +225,16 @@ gssEapMakeTokenChannelBindings(OM_uint32 *minor,
                                gss_channel_bindings_t wireBindings);
 
 /* util_cred.c */
+extern const gss_OID_desc gssEapPasswordCredType;
+
 OM_uint32 gssEapAllocCred(OM_uint32 *minor, gss_cred_id_t *pCred);
 OM_uint32 gssEapReleaseCred(OM_uint32 *minor, gss_cred_id_t *pCred);
 
 OM_uint32
 gssEapAcquireCred(OM_uint32 *minor,
                   const gss_name_t desiredName,
-                  const gss_buffer_t password,
+                  gss_const_OID credType,
+                  const void *credData,
                   OM_uint32 timeReq,
                   const gss_OID_set desiredMechs,
                   int cred_usage,
@@ -241,6 +244,14 @@ gssEapAcquireCred(OM_uint32 *minor,
 
 int gssEapCredAvailable(gss_cred_id_t cred, gss_OID mech);
 
+OM_uint32
+gssEapInquireCred(OM_uint32 *minor,
+                  gss_cred_id_t cred,
+                  gss_name_t *name,
+                  OM_uint32 *pLifetime,
+                  gss_cred_usage_t *cred_usage,
+                  gss_OID_set *mechanisms);
+
 /* util_crypt.c */
 int
 gssEapEncrypt(krb5_context context, int dce_style, size_t ec,
index 1d49e56..b481118 100644 (file)
@@ -38,6 +38,9 @@
 
 #include <pwd.h>
 
+const gss_OID_desc gssEapPasswordCredType =
+    { 7, "\x2a\x85\x70\x2b\x0d\x81\x48" };
+
 OM_uint32
 gssEapAllocCred(OM_uint32 *minor, gss_cred_id_t *pCred)
 {
@@ -197,7 +200,8 @@ cleanup:
 OM_uint32
 gssEapAcquireCred(OM_uint32 *minor,
                   const gss_name_t desiredName,
-                  const gss_buffer_t password,
+                  gss_const_OID credType,
+                  const void *credData,
                   OM_uint32 timeReq GSSEAP_UNUSED,
                   const gss_OID_set desiredMechs,
                   int credUsage,
@@ -211,10 +215,21 @@ gssEapAcquireCred(OM_uint32 *minor,
     gss_name_t defaultIdentityName = GSS_C_NO_NAME;
     gss_buffer_desc defaultCreds = GSS_C_EMPTY_BUFFER;
     gss_OID nameMech = GSS_C_NO_OID;
+    gss_buffer_t password = GSS_C_NO_BUFFER;
 
     /* XXX TODO validate with changed set_cred_option API */
     *pCred = GSS_C_NO_CREDENTIAL;
 
+    if (credType != GSS_C_NO_OID) {
+        if (oidEqual(credType, &gssEapPasswordCredType)) {
+            password = (gss_buffer_t)credData;
+        } else {
+            major = GSS_S_CRED_UNAVAIL;
+            *minor = GSSEAP_BAD_CRED_TYPE;
+            goto cleanup;
+        }
+    }
+
     major = gssEapAllocCred(minor, &cred);
     if (GSS_ERROR(major))
         goto cleanup;
@@ -389,3 +404,69 @@ gssEapCredAvailable(gss_cred_id_t cred, gss_OID mech)
 
     return present;
 }
+
+OM_uint32
+gssEapInquireCred(OM_uint32 *minor,
+                  gss_cred_id_t cred,
+                  gss_name_t *name,
+                  OM_uint32 *pLifetime,
+                  gss_cred_usage_t *cred_usage,
+                  gss_OID_set *mechanisms)
+{
+    OM_uint32 major;
+    time_t now, lifetime;
+
+    if (name != NULL) {
+        major = gssEapDuplicateName(minor, cred->name, name);
+        if (GSS_ERROR(major))
+            return major;
+    }
+
+    if (cred_usage != NULL) {
+        OM_uint32 flags = (cred->flags & (CRED_FLAG_INITIATE | CRED_FLAG_ACCEPT));
+
+        switch (flags) {
+        case CRED_FLAG_INITIATE:
+            *cred_usage = GSS_C_INITIATE;
+            break;
+        case CRED_FLAG_ACCEPT:
+            *cred_usage = GSS_C_ACCEPT;
+            break;
+        default:
+            *cred_usage = GSS_C_BOTH;
+            break;
+        }
+    }
+
+    if (mechanisms != NULL) {
+        if (cred->mechanisms != GSS_C_NO_OID_SET)
+            major = duplicateOidSet(minor, cred->mechanisms, mechanisms);
+        else
+            major = gssEapIndicateMechs(minor, mechanisms);
+        if (GSS_ERROR(major))
+            return major;
+    }
+
+    if (cred->expiryTime == 0) {
+        lifetime = GSS_C_INDEFINITE;
+    } else  {
+        now = time(NULL);
+        lifetime = now - cred->expiryTime;
+        if (lifetime < 0)
+            lifetime = 0;
+    }
+
+    if (pLifetime != NULL) {
+        *pLifetime = lifetime;
+    }
+
+    if (lifetime == 0) {
+        *minor = GSSEAP_CRED_EXPIRED;
+        return GSS_S_CREDENTIALS_EXPIRED;
+    }
+
+    major = GSS_S_COMPLETE;
+    *minor = 0;
+
+    return major;
+}
index 131ac0b..958e43d 100644 (file)
@@ -183,7 +183,7 @@ gssEapIndicateMechs(OM_uint32 *minor,
                     gss_OID_set *mechs)
 {
     krb5_context krbContext;
-    OM_uint32 major, tmpMinor;
+    OM_uint32 major;
     krb5_enctype *etypes;
     int i;
 
@@ -202,6 +202,9 @@ gssEapIndicateMechs(OM_uint32 *minor,
 
     for (i = 0; etypes[i] != ENCTYPE_NULL; i++) {
         gss_OID mechOid;
+#ifndef HAVE_HEIMDAL_VERSION
+        OM_uint32 tmpMinor;
+#endif
 
         /* XXX currently we aren't equipped to encode these enctypes */
         if (etypes[i] < 0 || etypes[i] > 127)
@@ -215,7 +218,9 @@ gssEapIndicateMechs(OM_uint32 *minor,
         if (GSS_ERROR(major))
             break;
 
+#ifndef HAVE_HEIMDAL_VERSION
         gss_release_oid(&tmpMinor, &mechOid);
+#endif
     }
 
     GSSEAP_FREE(etypes);
index 494aeb9..41bedad 100644 (file)
@@ -363,7 +363,7 @@ gss_eap_saml_attr_provider::getAssertion(int *authenticated,
     if (pAssertion != NULL)
         *pAssertion = NULL;
 
-    saml = static_cast<const gss_eap_saml_assertion_provider *>
+    saml = static_cast<gss_eap_saml_assertion_provider *>
         (m_manager->getProvider(ATTR_TYPE_SAML_ASSERTION));
     if (saml == NULL)
         return false;
diff --git a/openssh b/openssh
index 5d21250..ac0ba1f 160000 (submodule)
--- a/openssh
+++ b/openssh
@@ -1 +1 @@
-Subproject commit 5d212506d4ccc7f0e93dbfc756f380583addb20e
+Subproject commit ac0ba1f390586dd0300f0a036ce30952b1dd5def