gsskrb5: implement [un]wrap_ex as stubs, still fallback to [un]wrap
authorStefan Metzmacher <metze@samba.org>
Fri, 8 Aug 2008 14:00:51 +0000 (16:00 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Aug 2008 06:49:03 +0000 (08:49 +0200)
metze

source/heimdal/lib/gssapi/krb5/external.c
source/heimdal/lib/gssapi/krb5/gsskrb5-private.h
source/heimdal/lib/gssapi/krb5/unwrap.c
source/heimdal/lib/gssapi/krb5/wrap.c

index d3e0e2bdb16b869d8d9cd9cf976c3f4d0470515f..b5f571615a6f203afad10f00ebac26e5e4e14471 100644 (file)
@@ -440,8 +440,8 @@ static gssapi_mech_interface_desc krb5_mech = {
     _gsskrb5_verify_mic,
     _gsskrb5_wrap,
     _gsskrb5_unwrap,
-    NULL,
-    NULL,
+    _gsskrb5_wrap_ex,
+    _gsskrb5_unwrap_ex,
     _gsskrb5_display_status,
     _gsskrb5_indicate_mechs,
     _gsskrb5_compare_name,
index f6edb8b247630b8e2ac3bf861355358ac3f8cb02..a73893f11cea59527714a85d1571a2cbcb08dba4 100644 (file)
@@ -591,6 +591,16 @@ _gsskrb5_unwrap (
        int * /*conf_state*/,
        gss_qop_t * qop_state );
 
+OM_uint32
+_gsskrb5_unwrap_ex (
+       OM_uint32 * /*minor_status*/,
+       const gss_ctx_id_t /*context_handle*/,
+       const gss_buffer_t /*token_header_buffer*/,
+       const gss_buffer_t /*associated_data_buffer*/,
+       gss_buffer_t /*message_buffer*/,
+       int * /*conf_state*/,
+       gss_qop_t * qop_state );
+
 OM_uint32
 _gsskrb5_verify (
        OM_uint32 * /*minor_status*/,
@@ -642,6 +652,16 @@ _gsskrb5_wrap (
        int * /*conf_state*/,
        gss_buffer_t output_message_buffer );
 
+OM_uint32 _gsskrb5_wrap_ex (
+       OM_uint32 * /*minor_status*/,
+       const gss_ctx_id_t /*context_handle*/,
+       int /*conf_req_flag*/,
+       gss_qop_t /*qop_req*/,
+       const gss_buffer_t /*associated_data_buffer*/,
+       gss_buffer_t /*message_buffer*/,
+       gss_buffer_t /*output_token_buffer*/,
+       int * conf_state );
+
 OM_uint32
 _gsskrb5_wrap_size_limit (
         OM_uint32 * /*minor_status*/,
index c287469e96b4e0bbd8e77969f2614ec028142d59..d108186a97bc48c17daa72309bfd8feb84cc6eaa 100644 (file)
@@ -435,3 +435,65 @@ OM_uint32 _gsskrb5_unwrap
   krb5_free_keyblock (context, key);
   return ret;
 }
+
+OM_uint32 _gsskrb5_unwrap_ex
+           (OM_uint32 * minor_status,
+            const gss_ctx_id_t context_handle,
+            const gss_buffer_t token_header_buffer,
+            const gss_buffer_t associated_data_buffer,
+            gss_buffer_t message_buffer,
+            int * conf_state,
+            gss_qop_t * qop_state
+           )
+{
+  int no_ex = 1;
+
+  if (no_ex) {
+    OM_uint32 major_status, minor;
+    gss_buffer_desc unwrap_buffer;
+    gss_buffer_desc output_buffer;
+
+    unwrap_buffer.length = token_header_buffer->length +
+                          message_buffer->length;
+    unwrap_buffer.value = malloc(unwrap_buffer.length);
+    if (unwrap_buffer.value == NULL) {
+           *minor_status = ENOMEM;
+           return GSS_S_FAILURE;
+    }
+    memcpy(unwrap_buffer.value, token_header_buffer->value,
+          token_header_buffer->length);
+    memcpy((u_char *)unwrap_buffer.value + token_header_buffer->length,
+          message_buffer->value,
+          message_buffer->length);
+
+    major_status = _gsskrb5_unwrap(minor_status,
+                                  context_handle,
+                                  &unwrap_buffer,
+                                  &output_buffer,
+                                  conf_state,
+                                  qop_state);
+    if (major_status != GSS_S_COMPLETE) {
+           gss_release_buffer(&minor, &unwrap_buffer);
+           return major_status;
+    }
+
+    if (output_buffer.length != message_buffer->length) {
+           gss_release_buffer(&minor, &unwrap_buffer);
+           gss_release_buffer(&minor, &output_buffer);
+           *minor_status = EINVAL;
+           return GSS_S_FAILURE;
+    }
+
+    memcpy(message_buffer->value,
+          output_buffer.value,
+          output_buffer.length);
+
+    gss_release_buffer(&minor, &unwrap_buffer);
+    gss_release_buffer(&minor, &output_buffer);
+
+    return major_status;
+  }
+
+  *minor_status = EINVAL;
+  return GSS_S_FAILURE;
+}
index bedeace4dd88f1c5c0c8fb7c168692bf055ecdea..4042cd906ba4700182be84dffbc1e97a92852fca 100644 (file)
@@ -567,3 +567,53 @@ OM_uint32 _gsskrb5_wrap
   krb5_free_keyblock (context, key);
   return ret;
 }
+
+OM_uint32 _gsskrb5_wrap_ex
+           (OM_uint32 * minor_status,
+            const gss_ctx_id_t context_handle,
+            int conf_req_flag,
+            gss_qop_t qop_req,
+            const gss_buffer_t associated_data_buffer,
+            gss_buffer_t message_buffer,
+            gss_buffer_t output_token_buffer,
+            int * conf_state
+           )
+{
+  int no_ex = 1;
+
+  if (no_ex) {
+    OM_uint32 major_status, minor;
+    gss_buffer_desc wrap_buffer;
+    OM_uint32 token_header_size;
+
+    major_status = _gsskrb5_wrap(minor_status,
+                               context_handle,
+                               conf_req_flag,
+                               qop_req,
+                               message_buffer,
+                               conf_state,
+                               &wrap_buffer);
+    if (major_status != GSS_S_COMPLETE) {
+           return major_status;
+    }
+
+    token_header_size = wrap_buffer.length - message_buffer->length;
+
+    memcpy(message_buffer->value,
+          (u_char *)wrap_buffer.value + token_header_size,
+          message_buffer->length);
+
+    output_token_buffer->length = token_header_size;
+    output_token_buffer->value = realloc(wrap_buffer.value, token_header_size);
+    if (output_token_buffer->value == NULL) {
+         gss_release_buffer(&minor, &wrap_buffer);
+         *minor_status = ENOMEM;
+        return GSS_S_FAILURE;
+    }
+
+    return major_status;
+  }
+
+  *minor_status = EINVAL;
+  return GSS_S_FAILURE;
+}