summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>2008-10-15 21:58:43 +0000
committerTom Yu <tlyu@mit.edu>2008-10-15 21:58:43 +0000
commita898a72410a38b03ff7c7691ceeea973e3eec6ca (patch)
treefdd601d15bb96904df7b684048381bb3b9d0e1d3 /src/lib
parent07292e360eb8cad0151ed76edee11a9ce8ca925e (diff)
downloadkrb5-a898a72410a38b03ff7c7691ceeea973e3eec6ca.tar.gz
krb5-a898a72410a38b03ff7c7691ceeea973e3eec6ca.tar.xz
krb5-a898a72410a38b03ff7c7691ceeea973e3eec6ca.zip
Untabify. Normalize whitespace. Reindent. Fix some of the most
egregious formatting quirks. Add emacs mode settings to flag untabified source files. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20876 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/gssapi/generic/disp_com_err_status.c43
-rw-r--r--src/lib/gssapi/generic/disp_major_status.c405
-rw-r--r--src/lib/gssapi/generic/gssapi.hin701
-rw-r--r--src/lib/gssapi/generic/gssapiP_generic.h249
-rw-r--r--src/lib/gssapi/generic/gssapi_generic.c73
-rw-r--r--src/lib/gssapi/generic/gssapi_generic.h11
-rw-r--r--src/lib/gssapi/generic/maptest.c13
-rw-r--r--src/lib/gssapi/generic/rel_buffer.c22
-rw-r--r--src/lib/gssapi/generic/rel_oid_set.c22
-rw-r--r--src/lib/gssapi/generic/util_buffer.c17
-rw-r--r--src/lib/gssapi/generic/util_canonhost.c42
-rw-r--r--src/lib/gssapi/generic/util_errmap.c129
-rw-r--r--src/lib/gssapi/generic/util_localhost.c22
-rw-r--r--src/lib/gssapi/generic/util_ordering.c281
-rw-r--r--src/lib/gssapi/generic/util_set.c83
-rw-r--r--src/lib/gssapi/generic/util_token.c311
-rw-r--r--src/lib/gssapi/generic/util_validate.c364
-rw-r--r--src/lib/gssapi/generic/utl_nohash_validate.c78
-rw-r--r--src/lib/gssapi/gss_libinit.c21
-rw-r--r--src/lib/gssapi/gss_libinit.h1
-rw-r--r--src/lib/gssapi/krb5/accept_sec_context.c1658
-rw-r--r--src/lib/gssapi/krb5/acquire_cred.c1065
-rw-r--r--src/lib/gssapi/krb5/add_cred.c479
-rw-r--r--src/lib/gssapi/krb5/canon_name.c15
-rw-r--r--src/lib/gssapi/krb5/compare_name.c55
-rw-r--r--src/lib/gssapi/krb5/context_time.c67
-rw-r--r--src/lib/gssapi/krb5/copy_ccache.c99
-rw-r--r--src/lib/gssapi/krb5/delete_sec_context.c141
-rw-r--r--src/lib/gssapi/krb5/disp_name.c85
-rw-r--r--src/lib/gssapi/krb5/disp_status.c141
-rw-r--r--src/lib/gssapi/krb5/duplicate_name.c79
-rw-r--r--src/lib/gssapi/krb5/export_name.c111
-rw-r--r--src/lib/gssapi/krb5/export_sec_context.c53
-rw-r--r--src/lib/gssapi/krb5/get_tkt_flags.c43
-rw-r--r--src/lib/gssapi/krb5/gssapiP_krb5.h789
-rw-r--r--src/lib/gssapi/krb5/gssapi_krb5.c187
-rw-r--r--src/lib/gssapi/krb5/gssapi_krb5.hin167
-rw-r--r--src/lib/gssapi/krb5/import_name.c369
-rw-r--r--src/lib/gssapi/krb5/import_sec_context.c79
-rw-r--r--src/lib/gssapi/krb5/indicate_mechs.c23
-rw-r--r--src/lib/gssapi/krb5/init_sec_context.c1366
-rw-r--r--src/lib/gssapi/krb5/inq_context.c221
-rw-r--r--src/lib/gssapi/krb5/inq_cred.c322
-rw-r--r--src/lib/gssapi/krb5/inq_names.c101
-rw-r--r--src/lib/gssapi/krb5/k5seal.c347
-rw-r--r--src/lib/gssapi/krb5/k5sealv3.c689
-rw-r--r--src/lib/gssapi/krb5/k5unseal.c611
-rw-r--r--src/lib/gssapi/krb5/krb5_gss_glue.c1378
-rw-r--r--src/lib/gssapi/krb5/lucid_context.c155
-rw-r--r--src/lib/gssapi/krb5/process_context_token.c57
-rw-r--r--src/lib/gssapi/krb5/rel_cred.c113
-rw-r--r--src/lib/gssapi/krb5/rel_name.c45
-rw-r--r--src/lib/gssapi/krb5/rel_oid.c42
-rw-r--r--src/lib/gssapi/krb5/seal.c52
-rw-r--r--src/lib/gssapi/krb5/ser_sctx.c1083
-rw-r--r--src/lib/gssapi/krb5/set_allowable_enctypes.c61
-rw-r--r--src/lib/gssapi/krb5/set_ccache.c33
-rw-r--r--src/lib/gssapi/krb5/sign.c41
-rw-r--r--src/lib/gssapi/krb5/unseal.c53
-rw-r--r--src/lib/gssapi/krb5/util_cksum.c157
-rw-r--r--src/lib/gssapi/krb5/util_crypt.c324
-rw-r--r--src/lib/gssapi/krb5/util_seed.c35
-rw-r--r--src/lib/gssapi/krb5/util_seqnum.c129
-rw-r--r--src/lib/gssapi/krb5/val_cred.c55
-rw-r--r--src/lib/gssapi/krb5/verify.c49
-rw-r--r--src/lib/gssapi/krb5/wrap_size_limit.c127
66 files changed, 8163 insertions, 8076 deletions
diff --git a/src/lib/gssapi/generic/disp_com_err_status.c b/src/lib/gssapi/generic/disp_com_err_status.c
index c04b67265e..baf7e70379 100644
--- a/src/lib/gssapi/generic/disp_com_err_status.c
+++ b/src/lib/gssapi/generic/disp_com_err_status.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -37,30 +38,30 @@ static const char * const no_error = "No error";
/**/
/* if status_type == GSS_C_GSS_CODE, return up to three error messages,
- for routine errors, call error, and status, in that order.
- message_context == 0 : print the routine error
- message_context == 1 : print the calling error
- message_context > 2 : print supplementary info bit (message_context-2)
+ for routine errors, call error, and status, in that order.
+ message_context == 0 : print the routine error
+ message_context == 1 : print the calling error
+ message_context > 2 : print supplementary info bit (message_context-2)
if status_type == GSS_C_MECH_CODE, return the output from error_message()
- */
+*/
OM_uint32
g_display_com_err_status(minor_status, status_value, status_string)
- OM_uint32 *minor_status;
- OM_uint32 status_value;
- gss_buffer_t status_string;
+ OM_uint32 *minor_status;
+ OM_uint32 status_value;
+ gss_buffer_t status_string;
{
- status_string->length = 0;
- status_string->value = NULL;
+ status_string->length = 0;
+ status_string->value = NULL;
- (void) gssint_initialize_library();
+ (void) gssint_initialize_library();
- if (! g_make_string_buffer(((status_value == 0)?no_error:
- error_message(status_value)),
- status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ if (! g_make_string_buffer(((status_value == 0)?no_error:
+ error_message(status_value)),
+ status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/generic/disp_major_status.c b/src/lib/gssapi/generic/disp_major_status.c
index 0648192a19..f9ff281477 100644
--- a/src/lib/gssapi/generic/disp_major_status.c
+++ b/src/lib/gssapi/generic/disp_major_status.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -38,57 +39,57 @@
/**/
static const char * const calling_error_string[] = {
- NULL,
- "A required input parameter could not be read",
- "A required input parameter could not be written",
- "A parameter was malformed",
+ NULL,
+ "A required input parameter could not be read",
+ "A required input parameter could not be written",
+ "A parameter was malformed",
};
-
+
static const char * const calling_error = "calling error";
#define GSS_CALLING_ERROR_STR(x) \
GSS_ERROR_STR((x), calling_error_string, GSS_CALLING_ERROR, \
- GSS_S_CALL_INACCESSIBLE_READ, GSS_S_CALL_BAD_STRUCTURE, \
- GSS_CALLING_ERROR_FIELD)
+ GSS_S_CALL_INACCESSIBLE_READ, GSS_S_CALL_BAD_STRUCTURE, \
+ GSS_CALLING_ERROR_FIELD)
/**/
static const char * const routine_error_string[] = {
- NULL,
- "An unsupported mechanism was requested",
- "An invalid name was supplied",
- "A supplied name was of an unsupported type",
- "Incorrect channel bindings were supplied",
- "An invalid status code was supplied",
- "A token had an invalid signature",
- "No credentials were supplied",
- "No context has been established",
- "A token was invalid",
- "A credential was invalid",
- "The referenced credentials have expired",
- "The context has expired",
- "Miscellaneous failure",
- "The quality-of-protection requested could not be provided",
- "The operation is forbidden by the local security policy",
- "The operation or option is not available",
-};
+ NULL,
+ "An unsupported mechanism was requested",
+ "An invalid name was supplied",
+ "A supplied name was of an unsupported type",
+ "Incorrect channel bindings were supplied",
+ "An invalid status code was supplied",
+ "A token had an invalid signature",
+ "No credentials were supplied",
+ "No context has been established",
+ "A token was invalid",
+ "A credential was invalid",
+ "The referenced credentials have expired",
+ "The context has expired",
+ "Miscellaneous failure",
+ "The quality-of-protection requested could not be provided",
+ "The operation is forbidden by the local security policy",
+ "The operation or option is not available",
+};
static const char * const routine_error = "routine error";
#define GSS_ROUTINE_ERROR_STR(x) \
GSS_ERROR_STR((x), routine_error_string, GSS_ROUTINE_ERROR, \
- GSS_S_BAD_MECH, GSS_S_FAILURE, \
- GSS_ROUTINE_ERROR_FIELD)
+ GSS_S_BAD_MECH, GSS_S_FAILURE, \
+ GSS_ROUTINE_ERROR_FIELD)
/**/
/* this becomes overly gross after about 4 strings */
static const char * const sinfo_string[] = {
- "The routine must be called again to complete its function",
- "The token was a duplicate of an earlier token",
- "The token's validity period has expired",
- "A later token has already been processed",
+ "The routine must be called again to complete its function",
+ "The token was a duplicate of an earlier token",
+ "The token's validity period has expired",
+ "A later token has already been processed",
};
static const char * const sinfo_code = "supplementary info code";
@@ -107,203 +108,203 @@ static const char * const unknown_error = "Unknown %s (field = %d)";
/**/
-static int
+static int
display_unknown(kind, value, buffer)
- const char *kind;
- OM_uint32 value;
- gss_buffer_t buffer;
+ const char *kind;
+ OM_uint32 value;
+ gss_buffer_t buffer;
{
- char *str;
+ char *str;
- if (asprintf(&str, unknown_error, kind, value) < 0)
- return(0);
+ if (asprintf(&str, unknown_error, kind, value) < 0)
+ return(0);
- buffer->length = strlen(str);
- buffer->value = str;
+ buffer->length = strlen(str);
+ buffer->value = str;
- return(1);
+ return(1);
}
/* code should be set to the calling error field */
static OM_uint32 display_calling(minor_status, code, status_string)
- OM_uint32 *minor_status;
- OM_uint32 code;
- gss_buffer_t status_string;
+ OM_uint32 *minor_status;
+ OM_uint32 code;
+ gss_buffer_t status_string;
{
- const char *str;
-
- if ((str = GSS_CALLING_ERROR_STR(code))) {
- if (! g_make_string_buffer(str, status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- } else {
- if (! display_unknown(calling_error, GSS_CALLING_ERROR_FIELD(code),
- status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- }
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ const char *str;
+
+ if ((str = GSS_CALLING_ERROR_STR(code))) {
+ if (! g_make_string_buffer(str, status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ if (! display_unknown(calling_error, GSS_CALLING_ERROR_FIELD(code),
+ status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ }
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
/* code should be set to the routine error field */
static OM_uint32 display_routine(minor_status, code, status_string)
- OM_uint32 *minor_status;
- OM_uint32 code;
- gss_buffer_t status_string;
+ OM_uint32 *minor_status;
+ OM_uint32 code;
+ gss_buffer_t status_string;
{
- const char *str;
-
- if ((str = GSS_ROUTINE_ERROR_STR(code))) {
- if (! g_make_string_buffer(str, status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- } else {
- if (! display_unknown(routine_error, GSS_ROUTINE_ERROR_FIELD(code),
- status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- }
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ const char *str;
+
+ if ((str = GSS_ROUTINE_ERROR_STR(code))) {
+ if (! g_make_string_buffer(str, status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ if (! display_unknown(routine_error, GSS_ROUTINE_ERROR_FIELD(code),
+ status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ }
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
/* code should be set to the bit offset (log_2) of a supplementary info bit */
static OM_uint32 display_bit(minor_status, code, status_string)
- OM_uint32 *minor_status;
- OM_uint32 code;
- gss_buffer_t status_string;
+ OM_uint32 *minor_status;
+ OM_uint32 code;
+ gss_buffer_t status_string;
{
- const char *str;
-
- if ((str = GSS_SINFO_STR(code))) {
- if (! g_make_string_buffer(str, status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- } else {
- if (! display_unknown(sinfo_code, 1<<code, status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- }
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ const char *str;
+
+ if ((str = GSS_SINFO_STR(code))) {
+ if (! g_make_string_buffer(str, status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ if (! display_unknown(sinfo_code, 1<<code, status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ }
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
/**/
/* return error messages, for routine errors, call error, and status,
in that order.
- message_context == 0 : print the routine error
- message_context == 1 : print the calling error
- message_context > 2 : print supplementary info bit (message_context-2)
- */
-
-OM_uint32 g_display_major_status(minor_status, status_value,
- message_context, status_string)
- OM_uint32 *minor_status;
- OM_uint32 status_value;
- OM_uint32 *message_context;
- gss_buffer_t status_string;
+ message_context == 0 : print the routine error
+ message_context == 1 : print the calling error
+ message_context > 2 : print supplementary info bit (message_context-2)
+*/
+
+OM_uint32 g_display_major_status(minor_status, status_value,
+ message_context, status_string)
+ OM_uint32 *minor_status;
+ OM_uint32 status_value;
+ OM_uint32 *message_context;
+ gss_buffer_t status_string;
{
- OM_uint32 ret, tmp;
- int bit;
-
- /*** deal with no error at all specially */
-
- if (status_value == 0) {
- if (! g_make_string_buffer(no_error, status_string)) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- *message_context = 0;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
- }
-
- /*** do routine error */
-
- if (*message_context == 0) {
- if ((tmp = GSS_ROUTINE_ERROR(status_value))) {
- status_value -= tmp;
- if ((ret = display_routine(minor_status, tmp, status_string)))
- return(ret);
- *minor_status = 0;
- if (status_value) {
- (*message_context)++;
- return(GSS_S_COMPLETE);
- } else {
- *message_context = 0;
- return(GSS_S_COMPLETE);
- }
- } else {
- (*message_context)++;
- }
- } else {
- status_value -= GSS_ROUTINE_ERROR(status_value);
- }
-
- /*** do calling error */
-
- if (*message_context == 1) {
- if ((tmp = GSS_CALLING_ERROR(status_value))) {
- status_value -= tmp;
- if ((ret = display_calling(minor_status, tmp, status_string)))
- return(ret);
- *minor_status = 0;
- if (status_value) {
- (*message_context)++;
- return(GSS_S_COMPLETE);
- } else {
- *message_context = 0;
- return(GSS_S_COMPLETE);
- }
- } else {
- (*message_context)++;
- }
- } else {
- status_value -= GSS_CALLING_ERROR(status_value);
- }
-
- /*** do sinfo bits (*message_context == 2 + number of bits done) */
-
- tmp = GSS_SUPPLEMENTARY_INFO_FIELD(status_value);
- /* mask off the bits which have been done */
- if (*message_context > 2) {
- tmp &= ~LSBMASK(*message_context-3);
- status_value &= ~LSBMASK(*message_context-3);
- }
-
- if (!tmp) {
- /* bogon input - there should be something left */
- *minor_status = (OM_uint32) G_BAD_MSG_CTX;
- return(GSS_S_FAILURE);
- }
-
- /* compute the bit offset */
- /*SUPPRESS 570*/
- for (bit=0; (((OM_uint32) 1)<<bit) != LSBGET(tmp); bit++) ;
-
- /* print it */
- if ((ret = display_bit(minor_status, bit, status_string)))
- return(ret);
-
- /* compute the new status_value/message_context */
- status_value -= ((OM_uint32) 1)<<bit;
-
- if (status_value) {
- *message_context = bit+3;
- return(GSS_S_COMPLETE);
- } else {
- *message_context = 0;
- return(GSS_S_COMPLETE);
- }
+ OM_uint32 ret, tmp;
+ int bit;
+
+ /*** deal with no error at all specially */
+
+ if (status_value == 0) {
+ if (! g_make_string_buffer(no_error, status_string)) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ *message_context = 0;
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
+ }
+
+ /*** do routine error */
+
+ if (*message_context == 0) {
+ if ((tmp = GSS_ROUTINE_ERROR(status_value))) {
+ status_value -= tmp;
+ if ((ret = display_routine(minor_status, tmp, status_string)))
+ return(ret);
+ *minor_status = 0;
+ if (status_value) {
+ (*message_context)++;
+ return(GSS_S_COMPLETE);
+ } else {
+ *message_context = 0;
+ return(GSS_S_COMPLETE);
+ }
+ } else {
+ (*message_context)++;
+ }
+ } else {
+ status_value -= GSS_ROUTINE_ERROR(status_value);
+ }
+
+ /*** do calling error */
+
+ if (*message_context == 1) {
+ if ((tmp = GSS_CALLING_ERROR(status_value))) {
+ status_value -= tmp;
+ if ((ret = display_calling(minor_status, tmp, status_string)))
+ return(ret);
+ *minor_status = 0;
+ if (status_value) {
+ (*message_context)++;
+ return(GSS_S_COMPLETE);
+ } else {
+ *message_context = 0;
+ return(GSS_S_COMPLETE);
+ }
+ } else {
+ (*message_context)++;
+ }
+ } else {
+ status_value -= GSS_CALLING_ERROR(status_value);
+ }
+
+ /*** do sinfo bits (*message_context == 2 + number of bits done) */
+
+ tmp = GSS_SUPPLEMENTARY_INFO_FIELD(status_value);
+ /* mask off the bits which have been done */
+ if (*message_context > 2) {
+ tmp &= ~LSBMASK(*message_context-3);
+ status_value &= ~LSBMASK(*message_context-3);
+ }
+
+ if (!tmp) {
+ /* bogon input - there should be something left */
+ *minor_status = (OM_uint32) G_BAD_MSG_CTX;
+ return(GSS_S_FAILURE);
+ }
+
+ /* compute the bit offset */
+ /*SUPPRESS 570*/
+ for (bit=0; (((OM_uint32) 1)<<bit) != LSBGET(tmp); bit++) ;
+
+ /* print it */
+ if ((ret = display_bit(minor_status, bit, status_string)))
+ return(ret);
+
+ /* compute the new status_value/message_context */
+ status_value -= ((OM_uint32) 1)<<bit;
+
+ if (status_value) {
+ *message_context = bit+3;
+ return(GSS_S_COMPLETE);
+ } else {
+ *message_context = 0;
+ return(GSS_S_COMPLETE);
+ }
}
diff --git a/src/lib/gssapi/generic/gssapi.hin b/src/lib/gssapi/generic/gssapi.hin
index ef55febcfc..4dc33133b6 100644
--- a/src/lib/gssapi/generic/gssapi.hin
+++ b/src/lib/gssapi/generic/gssapi.hin
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,10 +29,10 @@
*/
#if defined(__MACH__) && defined(__APPLE__)
-# include <TargetConditionals.h>
-# if TARGET_RT_MAC_CFM
-# error "Use KfM 4.0 SDK headers for CFM compilation."
-# endif
+# include <TargetConditionals.h>
+# if TARGET_RT_MAC_CFM
+# error "Use KfM 4.0 SDK headers for CFM compilation."
+# endif
#endif
#ifdef __cplusplus
@@ -85,73 +86,73 @@ typedef struct gss_ctx_id_struct * gss_ctx_id_t;
typedef uint32_t gss_uint32;
typedef int32_t gss_int32;
-#ifdef OM_STRING
+#ifdef OM_STRING
/*
* We have included the xom.h header file. Use the definition for
* OM_object identifier.
*/
-typedef OM_object_identifier gss_OID_desc, *gss_OID;
-#else /* OM_STRING */
+typedef OM_object_identifier gss_OID_desc, *gss_OID;
+#else /* OM_STRING */
/*
* We can't use X/Open definitions, so roll our own.
*/
-typedef gss_uint32 OM_uint32;
+typedef gss_uint32 OM_uint32;
typedef struct gss_OID_desc_struct {
- OM_uint32 length;
- void *elements;
+ OM_uint32 length;
+ void *elements;
} gss_OID_desc, *gss_OID;
-#endif /* OM_STRING */
+#endif /* OM_STRING */
typedef struct gss_OID_set_desc_struct {
- size_t count;
- gss_OID elements;
+ size_t count;
+ gss_OID elements;
} gss_OID_set_desc, *gss_OID_set;
typedef struct gss_buffer_desc_struct {
- size_t length;
- void *value;
+ size_t length;
+ void *value;
} gss_buffer_desc, *gss_buffer_t;
typedef struct gss_channel_bindings_struct {
- OM_uint32 initiator_addrtype;
- gss_buffer_desc initiator_address;
- OM_uint32 acceptor_addrtype;
- gss_buffer_desc acceptor_address;
- gss_buffer_desc application_data;
+ OM_uint32 initiator_addrtype;
+ gss_buffer_desc initiator_address;
+ OM_uint32 acceptor_addrtype;
+ gss_buffer_desc acceptor_address;
+ gss_buffer_desc application_data;
} *gss_channel_bindings_t;
/*
* For now, define a QOP-type as an OM_uint32 (pending resolution of ongoing
* discussions).
*/
-typedef OM_uint32 gss_qop_t;
-typedef int gss_cred_usage_t;
+typedef OM_uint32 gss_qop_t;
+typedef int gss_cred_usage_t;
/*
* Flag bits for context-level services.
*/
-#define GSS_C_DELEG_FLAG 1
-#define GSS_C_MUTUAL_FLAG 2
-#define GSS_C_REPLAY_FLAG 4
-#define GSS_C_SEQUENCE_FLAG 8
-#define GSS_C_CONF_FLAG 16
-#define GSS_C_INTEG_FLAG 32
-#define GSS_C_ANON_FLAG 64
-#define GSS_C_PROT_READY_FLAG 128
-#define GSS_C_TRANS_FLAG 256
+#define GSS_C_DELEG_FLAG 1
+#define GSS_C_MUTUAL_FLAG 2
+#define GSS_C_REPLAY_FLAG 4
+#define GSS_C_SEQUENCE_FLAG 8
+#define GSS_C_CONF_FLAG 16
+#define GSS_C_INTEG_FLAG 32
+#define GSS_C_ANON_FLAG 64
+#define GSS_C_PROT_READY_FLAG 128
+#define GSS_C_TRANS_FLAG 256
/*
* Credential usage options
*/
-#define GSS_C_BOTH 0
-#define GSS_C_INITIATE 1
-#define GSS_C_ACCEPT 2
+#define GSS_C_BOTH 0
+#define GSS_C_INITIATE 1
+#define GSS_C_ACCEPT 2
/*
* Status code types for gss_display_status
*/
-#define GSS_C_GSS_CODE 1
+#define GSS_C_GSS_CODE 1
#define GSS_C_MECH_CODE 2
/*
@@ -197,8 +198,8 @@ typedef int gss_cred_usage_t;
* Some alternate names for a couple of the above values. These are defined
* for V1 compatibility.
*/
-#define GSS_C_NULL_OID GSS_C_NO_OID
-#define GSS_C_NULL_OID_SET GSS_C_NO_OID_SET
+#define GSS_C_NULL_OID GSS_C_NO_OID
+#define GSS_C_NULL_OID_SET GSS_C_NO_OID_SET
/*
* Define the default Quality of Protection for per-message services. Note
@@ -244,7 +245,7 @@ typedef int gss_cred_usage_t;
((x) & (GSS_C_SUPPLEMENTARY_MASK << GSS_C_SUPPLEMENTARY_OFFSET))
#define GSS_ERROR(x) \
((x) & ((GSS_C_CALLING_ERROR_MASK << GSS_C_CALLING_ERROR_OFFSET) | \
- (GSS_C_ROUTINE_ERROR_MASK << GSS_C_ROUTINE_ERROR_OFFSET)))
+ (GSS_C_ROUTINE_ERROR_MASK << GSS_C_ROUTINE_ERROR_OFFSET)))
/*
* Now the actual status code definitions
@@ -407,301 +408,311 @@ GSS_DLLIMP extern gss_OID GSS_C_NT_EXPORT_NAME;
/* Function Prototypes */
-OM_uint32 KRB5_CALLCONV gss_acquire_cred
-(OM_uint32 *, /* minor_status */
- gss_name_t, /* desired_name */
- OM_uint32, /* time_req */
- gss_OID_set, /* desired_mechs */
- gss_cred_usage_t, /* cred_usage */
- gss_cred_id_t *, /* output_cred_handle */
- gss_OID_set *, /* actual_mechs */
- OM_uint32 * /* time_rec */
- );
-
-OM_uint32 KRB5_CALLCONV gss_release_cred
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t * /* cred_handle */
- );
-
-OM_uint32 KRB5_CALLCONV gss_init_sec_context
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* claimant_cred_handle */
- gss_ctx_id_t *, /* context_handle */
- gss_name_t, /* target_name */
- gss_OID, /* mech_type (used to be const) */
- OM_uint32, /* req_flags */
- OM_uint32, /* time_req */
- gss_channel_bindings_t, /* input_chan_bindings */
- gss_buffer_t, /* input_token */
- gss_OID *, /* actual_mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32 *, /* ret_flags */
- OM_uint32 * /* time_rec */
- );
-
-OM_uint32 KRB5_CALLCONV gss_accept_sec_context
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t *, /* context_handle */
- gss_cred_id_t, /* acceptor_cred_handle */
- gss_buffer_t, /* input_token_buffer */
- gss_channel_bindings_t, /* input_chan_bindings */
- gss_name_t *, /* src_name */
- gss_OID *, /* mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32 *, /* ret_flags */
- OM_uint32 *, /* time_rec */
- gss_cred_id_t * /* delegated_cred_handle */
- );
-
-OM_uint32 KRB5_CALLCONV gss_process_context_token
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t /* token_buffer */
- );
-
-OM_uint32 KRB5_CALLCONV gss_delete_sec_context
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t *, /* context_handle */
- gss_buffer_t /* output_token */
- );
-
-OM_uint32 KRB5_CALLCONV gss_context_time
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- OM_uint32 * /* time_rec */
- );
+OM_uint32 KRB5_CALLCONV
+gss_acquire_cred(
+ OM_uint32 *, /* minor_status */
+ gss_name_t, /* desired_name */
+ OM_uint32, /* time_req */
+ gss_OID_set, /* desired_mechs */
+ gss_cred_usage_t, /* cred_usage */
+ gss_cred_id_t *, /* output_cred_handle */
+ gss_OID_set *, /* actual_mechs */
+ OM_uint32 *); /* time_rec */
+
+OM_uint32 KRB5_CALLCONV
+gss_release_cred(
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t *); /* cred_handle */
+
+OM_uint32 KRB5_CALLCONV
+gss_init_sec_context(
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* claimant_cred_handle */
+ gss_ctx_id_t *, /* context_handle */
+ gss_name_t, /* target_name */
+ gss_OID, /* mech_type (used to be const) */
+ OM_uint32, /* req_flags */
+ OM_uint32, /* time_req */
+ gss_channel_bindings_t, /* input_chan_bindings */
+ gss_buffer_t, /* input_token */
+ gss_OID *, /* actual_mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32 *, /* ret_flags */
+ OM_uint32 *); /* time_rec */
+
+OM_uint32 KRB5_CALLCONV
+gss_accept_sec_context(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t *, /* context_handle */
+ gss_cred_id_t, /* acceptor_cred_handle */
+ gss_buffer_t, /* input_token_buffer */
+ gss_channel_bindings_t, /* input_chan_bindings */
+ gss_name_t *, /* src_name */
+ gss_OID *, /* mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32 *, /* ret_flags */
+ OM_uint32 *, /* time_rec */
+ gss_cred_id_t *); /* delegated_cred_handle */
+
+OM_uint32 KRB5_CALLCONV
+gss_process_context_token(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t); /* token_buffer */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_delete_sec_context(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t *, /* context_handle */
+ gss_buffer_t); /* output_token */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_context_time(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ OM_uint32 *); /* time_rec */
+
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_get_mic
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
+OM_uint32 KRB5_CALLCONV
+gss_get_mic(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t); /* message_token */
+
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_verify_mic
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* message_token */
- gss_qop_t * /* qop_state */
- );
+OM_uint32 KRB5_CALLCONV
+gss_verify_mic(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* message_token */
+ gss_qop_t * /* qop_state */
+);
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_wrap
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int *, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
+OM_uint32 KRB5_CALLCONV
+gss_wrap(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int *, /* conf_state */
+ gss_buffer_t); /* output_message_buffer */
+
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_unwrap
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int *, /* conf_state */
- gss_qop_t * /* qop_state */
- );
-
-OM_uint32 KRB5_CALLCONV gss_display_status
-(OM_uint32 *, /* minor_status */
- OM_uint32, /* status_value */
- int, /* status_type */
- gss_OID, /* mech_type (used to be const) */
- OM_uint32 *, /* message_context */
- gss_buffer_t /* status_string */
- );
-
-OM_uint32 KRB5_CALLCONV gss_indicate_mechs
-(OM_uint32 *, /* minor_status */
- gss_OID_set * /* mech_set */
- );
-
-OM_uint32 KRB5_CALLCONV gss_compare_name
-(OM_uint32 *, /* minor_status */
- gss_name_t, /* name1 */
- gss_name_t, /* name2 */
- int * /* name_equal */
- );
-
-OM_uint32 KRB5_CALLCONV gss_display_name
-(OM_uint32 *, /* minor_status */
- gss_name_t, /* input_name */
- gss_buffer_t, /* output_name_buffer */
- gss_OID * /* output_name_type */
- );
-
-OM_uint32 KRB5_CALLCONV gss_import_name
-(OM_uint32 *, /* minor_status */
- gss_buffer_t, /* input_name_buffer */
- gss_OID, /* input_name_type(used to be const) */
- gss_name_t * /* output_name */
- );
-
-OM_uint32 KRB5_CALLCONV gss_release_name
-(OM_uint32 *, /* minor_status */
- gss_name_t * /* input_name */
- );
-
-OM_uint32 KRB5_CALLCONV gss_release_buffer
-(OM_uint32 *, /* minor_status */
- gss_buffer_t /* buffer */
- );
-
-OM_uint32 KRB5_CALLCONV gss_release_oid_set
-(OM_uint32 *, /* minor_status */
- gss_OID_set * /* set */
- );
-
-OM_uint32 KRB5_CALLCONV gss_inquire_cred
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_name_t *, /* name */
- OM_uint32 *, /* lifetime */
- gss_cred_usage_t *, /* cred_usage */
- gss_OID_set * /* mechanisms */
- );
+OM_uint32 KRB5_CALLCONV
+gss_unwrap(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int *, /* conf_state */
+ gss_qop_t *); /* qop_state */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_display_status(
+ OM_uint32 *, /* minor_status */
+ OM_uint32, /* status_value */
+ int, /* status_type */
+ gss_OID, /* mech_type (used to be const) */
+ OM_uint32 *, /* message_context */
+ gss_buffer_t); /* status_string */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_indicate_mechs(
+ OM_uint32 *, /* minor_status */
+ gss_OID_set *); /* mech_set */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_compare_name(
+ OM_uint32 *, /* minor_status */
+ gss_name_t, /* name1 */
+ gss_name_t, /* name2 */
+ int *); /* name_equal */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_display_name(
+ OM_uint32 *, /* minor_status */
+ gss_name_t, /* input_name */
+ gss_buffer_t, /* output_name_buffer */
+ gss_OID *); /* output_name_type */
+
+
+OM_uint32 KRB5_CALLCONV
+gss_import_name(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* input_name_buffer */
+ gss_OID, /* input_name_type(used to be const) */
+ gss_name_t *); /* output_name */
+
+OM_uint32 KRB5_CALLCONV
+gss_release_name(
+ OM_uint32 *, /* minor_status */
+ gss_name_t *); /* input_name */
+
+OM_uint32 KRB5_CALLCONV
+gss_release_buffer(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t); /* buffer */
+
+OM_uint32 KRB5_CALLCONV
+gss_release_oid_set(
+ OM_uint32 *, /* minor_status */
+ gss_OID_set *); /* set */
+
+OM_uint32 KRB5_CALLCONV
+gss_inquire_cred(
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* cred_handle */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* lifetime */
+ gss_cred_usage_t *, /* cred_usage */
+ gss_OID_set *); /* mechanisms */
/* Last argument new for V2 */
-OM_uint32 KRB5_CALLCONV gss_inquire_context
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_name_t *, /* src_name */
- gss_name_t *, /* targ_name */
- OM_uint32 *, /* lifetime_rec */
- gss_OID *, /* mech_type */
- OM_uint32 *, /* ctx_flags */
- int *, /* locally_initiated */
- int * /* open */
- );
+OM_uint32 KRB5_CALLCONV
+gss_inquire_context(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_name_t *, /* src_name */
+ gss_name_t *, /* targ_name */
+ OM_uint32 *, /* lifetime_rec */
+ gss_OID *, /* mech_type */
+ OM_uint32 *, /* ctx_flags */
+ int *, /* locally_initiated */
+ int *); /* open */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_wrap_size_limit
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- OM_uint32, /* req_output_size */
- OM_uint32 * /* max_input_size */
- );
+OM_uint32 KRB5_CALLCONV
+gss_wrap_size_limit(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ OM_uint32, /* req_output_size */
+ OM_uint32 *); /* max_input_size */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_import_name_object
-(OM_uint32 *, /* minor_status */
- void *, /* input_name */
- gss_OID, /* input_name_type */
- gss_name_t * /* output_name */
- );
+OM_uint32 KRB5_CALLCONV
+gss_import_name_object(
+ OM_uint32 *, /* minor_status */
+ void *, /* input_name */
+ gss_OID, /* input_name_type */
+ gss_name_t *); /* output_name */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_export_name_object
-(OM_uint32 *, /* minor_status */
- gss_name_t, /* input_name */
- gss_OID, /* desired_name_type */
- void ** /* output_name */
- );
+OM_uint32 KRB5_CALLCONV
+gss_export_name_object(
+ OM_uint32 *, /* minor_status */
+ gss_name_t, /* input_name */
+ gss_OID, /* desired_name_type */
+ void **); /* output_name */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_add_cred
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* input_cred_handle */
- gss_name_t, /* desired_name */
- gss_OID, /* desired_mech */
- gss_cred_usage_t, /* cred_usage */
- OM_uint32, /* initiator_time_req */
- OM_uint32, /* acceptor_time_req */
- gss_cred_id_t *, /* output_cred_handle */
- gss_OID_set *, /* actual_mechs */
- OM_uint32 *, /* initiator_time_rec */
- OM_uint32 * /* acceptor_time_rec */
- );
+OM_uint32 KRB5_CALLCONV
+gss_add_cred(
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* input_cred_handle */
+ gss_name_t, /* desired_name */
+ gss_OID, /* desired_mech */
+ gss_cred_usage_t, /* cred_usage */
+ OM_uint32, /* initiator_time_req */
+ OM_uint32, /* acceptor_time_req */
+ gss_cred_id_t *, /* output_cred_handle */
+ gss_OID_set *, /* actual_mechs */
+ OM_uint32 *, /* initiator_time_rec */
+ OM_uint32 *); /* acceptor_time_rec */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_inquire_cred_by_mech
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_OID, /* mech_type */
- gss_name_t *, /* name */
- OM_uint32 *, /* initiator_lifetime */
- OM_uint32 *, /* acceptor_lifetime */
- gss_cred_usage_t * /* cred_usage */
- );
+OM_uint32 KRB5_CALLCONV
+gss_inquire_cred_by_mech(
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* cred_handle */
+ gss_OID, /* mech_type */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* initiator_lifetime */
+ OM_uint32 *, /* acceptor_lifetime */
+ gss_cred_usage_t *); /* cred_usage */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_export_sec_context
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t *, /* context_handle */
- gss_buffer_t /* interprocess_token */
- );
+OM_uint32 KRB5_CALLCONV
+gss_export_sec_context(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t *, /* context_handle */
+ gss_buffer_t); /* interprocess_token */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_import_sec_context
-(OM_uint32 *, /* minor_status */
- gss_buffer_t, /* interprocess_token */
- gss_ctx_id_t * /* context_handle */
- );
+OM_uint32 KRB5_CALLCONV
+gss_import_sec_context(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* interprocess_token */
+ gss_ctx_id_t *); /* context_handle */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_release_oid
-(OM_uint32 *, /* minor_status */
- gss_OID * /* oid */
- );
+OM_uint32 KRB5_CALLCONV
+gss_release_oid(
+ OM_uint32 *, /* minor_status */
+ gss_OID *); /* oid */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_create_empty_oid_set
-(OM_uint32 *, /* minor_status */
- gss_OID_set * /* oid_set */
- );
+OM_uint32 KRB5_CALLCONV
+gss_create_empty_oid_set(
+ OM_uint32 *, /* minor_status */
+ gss_OID_set *); /* oid_set */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_add_oid_set_member
-(OM_uint32 *, /* minor_status */
- gss_OID, /* member_oid */
- gss_OID_set * /* oid_set */
- );
+OM_uint32 KRB5_CALLCONV
+gss_add_oid_set_member(
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* member_oid */
+ gss_OID_set *); /* oid_set */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_test_oid_set_member
-(OM_uint32 *, /* minor_status */
- gss_OID, /* member */
- gss_OID_set, /* set */
- int * /* present */
- );
+OM_uint32 KRB5_CALLCONV
+gss_test_oid_set_member(
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* member */
+ gss_OID_set, /* set */
+ int *); /* present */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_str_to_oid
-(OM_uint32 *, /* minor_status */
- gss_buffer_t, /* oid_str */
- gss_OID * /* oid */
- );
+OM_uint32 KRB5_CALLCONV
+gss_str_to_oid(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* oid_str */
+ gss_OID *); /* oid */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_oid_to_str
-(OM_uint32 *, /* minor_status */
- gss_OID, /* oid */
- gss_buffer_t /* oid_str */
- );
+OM_uint32 KRB5_CALLCONV
+gss_oid_to_str(
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* oid */
+ gss_buffer_t); /* oid_str */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_inquire_names_for_mech
-(OM_uint32 *, /* minor_status */
- gss_OID, /* mechanism */
- gss_OID_set * /* name_types */
- );
+OM_uint32 KRB5_CALLCONV
+gss_inquire_names_for_mech(
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* mechanism */
+ gss_OID_set *); /* name_types */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_inquire_mechs_for_name(
- OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_OID_set * /* mech_types */
-);
+OM_uint32 KRB5_CALLCONV
+gss_inquire_mechs_for_name(
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_OID_set *); /* mech_types */
/*
* The following routines are obsolete variants of gss_get_mic, gss_wrap,
@@ -710,62 +721,62 @@ OM_uint32 KRB5_CALLCONV gss_inquire_mechs_for_name(
* entrypoints (as opposed to #defines) should be provided, to allow GSSAPI
* V1 applications to link against GSSAPI V2 implementations.
*/
-OM_uint32 KRB5_CALLCONV gss_sign
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
-
-OM_uint32 KRB5_CALLCONV gss_verify
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* token_buffer */
- int * /* qop_state */
- );
-
-OM_uint32 KRB5_CALLCONV gss_seal
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- int, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int *, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
-
-OM_uint32 KRB5_CALLCONV gss_unseal
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int *, /* conf_state */
- int * /* qop_state */
- );
+OM_uint32 KRB5_CALLCONV
+gss_sign(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t); /* message_token */
+
+OM_uint32 KRB5_CALLCONV
+gss_verify(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* token_buffer */
+ int *); /* qop_state */
+
+OM_uint32 KRB5_CALLCONV
+gss_seal(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ int, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int *, /* conf_state */
+ gss_buffer_t); /* output_message_buffer */
+
+OM_uint32 KRB5_CALLCONV
+gss_unseal(
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int *, /* conf_state */
+ int *); /* qop_state */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_export_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_buffer_t /* exported_name */
- );
+OM_uint32 KRB5_CALLCONV
+gss_export_name(
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_buffer_t); /* exported_name */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_duplicate_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_name_t * /* dest_name */
- );
+OM_uint32 KRB5_CALLCONV
+gss_duplicate_name(
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_name_t *); /* dest_name */
/* New for V2 */
-OM_uint32 KRB5_CALLCONV gss_canonicalize_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- const gss_OID, /* mech_type */
- gss_name_t * /* output_name */
- );
+OM_uint32 KRB5_CALLCONV
+gss_canonicalize_name(
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ const gss_OID, /* mech_type */
+ gss_name_t *); /* output_name */
#if TARGET_OS_MAC
# pragma pack(pop)
diff --git a/src/lib/gssapi/generic/gssapiP_generic.h b/src/lib/gssapi/generic/gssapiP_generic.h
index c4a030d186..747c6fe6c5 100644
--- a/src/lib/gssapi/generic/gssapiP_generic.h
+++ b/src/lib/gssapi/generic/gssapiP_generic.h
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -48,48 +49,48 @@ typedef UINT64_TYPE gssint_uint64;
/** helper macros **/
-#define g_OID_equal(o1, o2) \
- (((o1)->length == (o2)->length) && \
- (memcmp((o1)->elements, (o2)->elements, (o1)->length) == 0))
+#define g_OID_equal(o1, o2) \
+ (((o1)->length == (o2)->length) && \
+ (memcmp((o1)->elements, (o2)->elements, (o1)->length) == 0))
/* this code knows that an int on the wire is 32 bits. The type of
num should be at least this big, or the extra shifts may do weird
things */
-#define TWRITE_INT(ptr, num, bigend) \
- (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
- (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
- (ptr)[2] = (char) ((bigend)?(((num)>>8)&0xff):(((num)>>16)&0xff)); \
- (ptr)[3] = (char) ((bigend)?((num)&0xff):((num)>>24)); \
+#define TWRITE_INT(ptr, num, bigend) \
+ (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
+ (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
+ (ptr)[2] = (char) ((bigend)?(((num)>>8)&0xff):(((num)>>16)&0xff)); \
+ (ptr)[3] = (char) ((bigend)?((num)&0xff):((num)>>24)); \
(ptr) += 4;
-#define TWRITE_INT16(ptr, num, bigend) \
- (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
- (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
+#define TWRITE_INT16(ptr, num, bigend) \
+ (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
+ (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
(ptr) += 2;
-#define TREAD_INT(ptr, num, bigend) \
- (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
- ((ptr)[1]<<((bigend)?16: 8)) | \
- ((ptr)[2]<<((bigend)? 8:16)) | \
- ((ptr)[3]<<((bigend)? 0:24))); \
+#define TREAD_INT(ptr, num, bigend) \
+ (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
+ ((ptr)[1]<<((bigend)?16: 8)) | \
+ ((ptr)[2]<<((bigend)? 8:16)) | \
+ ((ptr)[3]<<((bigend)? 0:24))); \
(ptr) += 4;
-#define TREAD_INT16(ptr, num, bigend) \
- (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
- ((ptr)[1]<<((bigend)?16: 8))); \
+#define TREAD_INT16(ptr, num, bigend) \
+ (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
+ ((ptr)[1]<<((bigend)?16: 8))); \
(ptr) += 2;
-#define TWRITE_STR(ptr, str, len) \
- memcpy((ptr), (char *) (str), (len)); \
+#define TWRITE_STR(ptr, str, len) \
+ memcpy((ptr), (char *) (str), (len)); \
(ptr) += (len);
-#define TREAD_STR(ptr, str, len) \
- (str) = (ptr); \
+#define TREAD_STR(ptr, str, len) \
+ (str) = (ptr); \
(ptr) += (len);
-#define TWRITE_BUF(ptr, buf, bigend) \
- TWRITE_INT((ptr), (buf).length, (bigend)); \
+#define TWRITE_BUF(ptr, buf, bigend) \
+ TWRITE_INT((ptr), (buf).length, (bigend)); \
TWRITE_STR((ptr), (buf).value, (buf).length);
/** malloc wrappers; these may actually do something later */
@@ -104,38 +105,38 @@ typedef UINT64_TYPE gssint_uint64;
/** helper functions **/
/* hide names from applications, especially glib applications */
-#define g_set_init gssint_g_set_init
-#define g_set_destroy gssint_g_set_destroy
-#define g_set_entry_add gssint_g_set_entry_add
-#define g_set_entry_delete gssint_g_set_entry_delete
-#define g_set_entry_get gssint_g_set_entry_get
-#define g_save_name gssint_g_save_name
-#define g_save_cred_id gssint_g_save_cred_id
-#define g_save_ctx_id gssint_g_save_ctx_id
-#define g_save_lucidctx_id gssint_g_save_lucidctx_id
-#define g_validate_name gssint_g_validate_name
-#define g_validate_cred_id gssint_g_validate_cred_id
-#define g_validate_ctx_id gssint_g_validate_ctx_id
-#define g_validate_lucidctx_id gssint_g_validate_lucidctx_id
-#define g_delete_name gssint_g_delete_name
-#define g_delete_cred_id gssint_g_delete_cred_id
-#define g_delete_ctx_id gssint_g_delete_ctx_id
-#define g_delete_lucidctx_id gssint_g_delete_lucidctx_id
-#define g_make_string_buffer gssint_g_make_string_buffer
-#define g_token_size gssint_g_token_size
-#define g_make_token_header gssint_g_make_token_header
-#define g_verify_token_header gssint_g_verify_token_header
-#define g_display_major_status gssint_g_display_major_status
-#define g_display_com_err_status gssint_g_display_com_err_status
-#define g_order_init gssint_g_order_init
-#define g_order_check gssint_g_order_check
-#define g_order_free gssint_g_order_free
-#define g_queue_size gssint_g_queue_size
-#define g_queue_externalize gssint_g_queue_externalize
-#define g_queue_internalize gssint_g_queue_internalize
-#define g_canonicalize_host gssint_g_canonicalize_host
-#define g_local_host_name gssint_g_local_host_name
-#define g_strdup gssint_g_strdup
+#define g_set_init gssint_g_set_init
+#define g_set_destroy gssint_g_set_destroy
+#define g_set_entry_add gssint_g_set_entry_add
+#define g_set_entry_delete gssint_g_set_entry_delete
+#define g_set_entry_get gssint_g_set_entry_get
+#define g_save_name gssint_g_save_name
+#define g_save_cred_id gssint_g_save_cred_id
+#define g_save_ctx_id gssint_g_save_ctx_id
+#define g_save_lucidctx_id gssint_g_save_lucidctx_id
+#define g_validate_name gssint_g_validate_name
+#define g_validate_cred_id gssint_g_validate_cred_id
+#define g_validate_ctx_id gssint_g_validate_ctx_id
+#define g_validate_lucidctx_id gssint_g_validate_lucidctx_id
+#define g_delete_name gssint_g_delete_name
+#define g_delete_cred_id gssint_g_delete_cred_id
+#define g_delete_ctx_id gssint_g_delete_ctx_id
+#define g_delete_lucidctx_id gssint_g_delete_lucidctx_id
+#define g_make_string_buffer gssint_g_make_string_buffer
+#define g_token_size gssint_g_token_size
+#define g_make_token_header gssint_g_make_token_header
+#define g_verify_token_header gssint_g_verify_token_header
+#define g_display_major_status gssint_g_display_major_status
+#define g_display_com_err_status gssint_g_display_com_err_status
+#define g_order_init gssint_g_order_init
+#define g_order_check gssint_g_order_check
+#define g_order_free gssint_g_order_free
+#define g_queue_size gssint_g_queue_size
+#define g_queue_externalize gssint_g_queue_externalize
+#define g_queue_internalize gssint_g_queue_internalize
+#define g_canonicalize_host gssint_g_canonicalize_host
+#define g_local_host_name gssint_g_local_host_name
+#define g_strdup gssint_g_strdup
typedef struct _g_set_elt *g_set_elt;
typedef struct {
@@ -170,25 +171,25 @@ int g_make_string_buffer (const char *str, gss_buffer_t buffer);
unsigned int g_token_size (const gss_OID_desc * mech, unsigned int body_size);
void g_make_token_header (const gss_OID_desc * mech, unsigned int body_size,
- unsigned char **buf, int tok_type);
+ unsigned char **buf, int tok_type);
-gss_int32 g_verify_token_header (const gss_OID_desc * mech,
- unsigned int *body_size,
- unsigned char **buf, int tok_type,
- unsigned int toksize_in,
- int wrapper_required);
+gss_int32 g_verify_token_header (const gss_OID_desc * mech,
+ unsigned int *body_size,
+ unsigned char **buf, int tok_type,
+ unsigned int toksize_in,
+ int wrapper_required);
OM_uint32 g_display_major_status (OM_uint32 *minor_status,
- OM_uint32 status_value,
- OM_uint32 *message_context,
- gss_buffer_t status_string);
+ OM_uint32 status_value,
+ OM_uint32 *message_context,
+ gss_buffer_t status_string);
OM_uint32 g_display_com_err_status (OM_uint32 *minor_status,
- OM_uint32 status_value,
- gss_buffer_t status_string);
+ OM_uint32 status_value,
+ gss_buffer_t status_string);
gss_int32 g_order_init (void **queue, gssint_uint64 seqnum,
- int do_replay, int do_sequence, int wide);
+ int do_replay, int do_sequence, int wide);
gss_int32 g_order_check (void **queue, gssint_uint64 seqnum);
@@ -196,70 +197,70 @@ void g_order_free (void **queue);
gss_uint32 g_queue_size(void *vqueue, size_t *sizep);
gss_uint32 g_queue_externalize(void *vqueue, unsigned char **buf,
- size_t *lenremain);
+ size_t *lenremain);
gss_uint32 g_queue_internalize(void **vqueue, unsigned char **buf,
- size_t *lenremain);
+ size_t *lenremain);
char *g_strdup (char *str);
/** declarations of internal name mechanism functions **/
-OM_uint32 generic_gss_release_buffer
-(OM_uint32*, /* minor_status */
- gss_buffer_t /* buffer */
- );
-
-OM_uint32 generic_gss_release_oid_set
-(OM_uint32*, /* minor_status */
- gss_OID_set* /* set */
- );
-
-OM_uint32 generic_gss_release_oid
-(OM_uint32*, /* minor_status */
- gss_OID* /* set */
- );
-
-OM_uint32 generic_gss_copy_oid
-(OM_uint32 *, /* minor_status */
- const gss_OID_desc * const, /* oid */
- gss_OID * /* new_oid */
- );
-
-OM_uint32 generic_gss_create_empty_oid_set
-(OM_uint32 *, /* minor_status */
- gss_OID_set * /* oid_set */
- );
-
-OM_uint32 generic_gss_add_oid_set_member
-(OM_uint32 *, /* minor_status */
- const gss_OID_desc * const, /* member_oid */
- gss_OID_set * /* oid_set */
- );
-
-OM_uint32 generic_gss_test_oid_set_member
-(OM_uint32 *, /* minor_status */
- const gss_OID_desc * const, /* member */
- gss_OID_set, /* set */
- int * /* present */
- );
-
-OM_uint32 generic_gss_oid_to_str
-(OM_uint32 *, /* minor_status */
- const gss_OID_desc * const, /* oid */
- gss_buffer_t /* oid_str */
- );
-
-OM_uint32 generic_gss_str_to_oid
-(OM_uint32 *, /* minor_status */
- gss_buffer_t, /* oid_str */
- gss_OID * /* oid */
- );
+OM_uint32
+generic_gss_release_buffer(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t); /* buffer */
+
+OM_uint32
+generic_gss_release_oid_set(
+ OM_uint32 *, /* minor_status */
+ gss_OID_set *); /* set */
+
+OM_uint32
+generic_gss_release_oid(
+ OM_uint32 *, /* minor_status */
+ gss_OID *); /* set */
+
+OM_uint32
+generic_gss_copy_oid(
+ OM_uint32 *, /* minor_status */
+ const gss_OID_desc * const, /* oid */
+ gss_OID *); /* new_oid */
+
+OM_uint32
+generic_gss_create_empty_oid_set(
+ OM_uint32 *, /* minor_status */
+ gss_OID_set *); /* oid_set */
+
+OM_uint32
+generic_gss_add_oid_set_member(
+ OM_uint32 *, /* minor_status */
+ const gss_OID_desc * const, /* member_oid */
+ gss_OID_set *); /* oid_set */
+
+OM_uint32
+generic_gss_test_oid_set_member(
+ OM_uint32 *, /* minor_status */
+ const gss_OID_desc * const, /* member */
+ gss_OID_set, /* set */
+ int *); /* present */
+
+OM_uint32
+generic_gss_oid_to_str(
+ OM_uint32 *, /* minor_status */
+ const gss_OID_desc * const, /* oid */
+ gss_buffer_t); /* oid_str */
+
+OM_uint32
+generic_gss_str_to_oid(
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* oid_str */
+ gss_OID *); /* oid */
int gssint_mecherrmap_init(void);
void gssint_mecherrmap_destroy(void);
OM_uint32 gssint_mecherrmap_map(OM_uint32 minor, const gss_OID_desc *oid);
int gssint_mecherrmap_get(OM_uint32 minor, gss_OID mech_oid,
- OM_uint32 *mech_minor);
+ OM_uint32 *mech_minor);
OM_uint32 gssint_mecherrmap_map_errcode(OM_uint32 errcode);
#endif /* _GSSAPIP_GENERIC_H_ */
diff --git a/src/lib/gssapi/generic/gssapi_generic.c b/src/lib/gssapi/generic/gssapi_generic.c
index db92abb96b..b5314ed7b6 100644
--- a/src/lib/gssapi/generic/gssapi_generic.c
+++ b/src/lib/gssapi/generic/gssapi_generic.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -37,37 +38,37 @@
static const gss_OID_desc const_oids[] = {
/*
* The implementation must reserve static storage for a
- * gss_OID_desc object containing the value */
+ * gss_OID_desc object containing the value */
{10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x01"},
/* corresponding to an object-identifier value of
- * {iso(1) member-body(2) United States(840) mit(113554)
- * infosys(1) gssapi(2) generic(1) user_name(1)}. The constant
- * GSS_C_NT_USER_NAME should be initialized to point
- * to that gss_OID_desc.
- */
-
+ * {iso(1) member-body(2) United States(840) mit(113554)
+ * infosys(1) gssapi(2) generic(1) user_name(1)}. The constant
+ * GSS_C_NT_USER_NAME should be initialized to point
+ * to that gss_OID_desc.
+ */
+
/*
- * The implementation must reserve static storage for a
- * gss_OID_desc object containing the value */
+ * The implementation must reserve static storage for a
+ * gss_OID_desc object containing the value */
{10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x02"},
/* corresponding to an object-identifier value of
- * {iso(1) member-body(2) United States(840) mit(113554)
- * infosys(1) gssapi(2) generic(1) machine_uid_name(2)}.
- * The constant GSS_C_NT_MACHINE_UID_NAME should be
- * initialized to point to that gss_OID_desc.
- */
-
+ * {iso(1) member-body(2) United States(840) mit(113554)
+ * infosys(1) gssapi(2) generic(1) machine_uid_name(2)}.
+ * The constant GSS_C_NT_MACHINE_UID_NAME should be
+ * initialized to point to that gss_OID_desc.
+ */
+
/*
- * The implementation must reserve static storage for a
- * gss_OID_desc object containing the value */
+ * The implementation must reserve static storage for a
+ * gss_OID_desc object containing the value */
{10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03"},
/* corresponding to an object-identifier value of
- * {iso(1) member-body(2) United States(840) mit(113554)
- * infosys(1) gssapi(2) generic(1) string_uid_name(3)}.
- * The constant GSS_C_NT_STRING_UID_NAME should be
- * initialized to point to that gss_OID_desc.
- */
-
+ * {iso(1) member-body(2) United States(840) mit(113554)
+ * infosys(1) gssapi(2) generic(1) string_uid_name(3)}.
+ * The constant GSS_C_NT_STRING_UID_NAME should be
+ * initialized to point to that gss_OID_desc.
+ */
+
/*
* The implementation must reserve static storage for a
* gss_OID_desc object containing the value */
@@ -85,15 +86,15 @@ static const gss_OID_desc const_oids[] = {
* parameter, but should not be emitted by GSS-API
* implementations
*/
-
+
/*
* The implementation must reserve static storage for a
* gss_OID_desc object containing the value */
- {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x04"},
- /* corresponding to an object-identifier value of
- * {iso(1) member-body(2) Unites States(840) mit(113554)
- * infosys(1) gssapi(2) generic(1) service_name(4)}.
- * The constant GSS_C_NT_HOSTBASED_SERVICE should be
+ {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x04"},
+ /* corresponding to an object-identifier value of
+ * {iso(1) member-body(2) Unites States(840) mit(113554)
+ * infosys(1) gssapi(2) generic(1) service_name(4)}.
+ * The constant GSS_C_NT_HOSTBASED_SERVICE should be
* initialized to point to that gss_OID_desc.
*/
@@ -107,7 +108,7 @@ static const gss_OID_desc const_oids[] = {
* and GSS_C_NT_ANONYMOUS should be initialized to point
* to that gss_OID_desc.
*/
-
+
/*
* The implementation must reserve static storage for a
* gss_OID_desc object containing the value */
@@ -124,8 +125,8 @@ static const gss_OID_desc const_oids[] = {
*
* Constants of the form GSS_C_NT_* are specified by rfc 2744.
*
- * Constants of the form gss_nt_* are the original MIT krb5 names
- * found in gssapi_generic.h. They are provided for compatibility. */
+ * Constants of the form gss_nt_* are the original MIT krb5 names
+ * found in gssapi_generic.h. They are provided for compatibility. */
GSS_DLLIMP gss_OID GSS_C_NT_USER_NAME = oids+0;
GSS_DLLIMP gss_OID gss_nt_user_name = oids+0;
@@ -137,7 +138,7 @@ GSS_DLLIMP gss_OID GSS_C_NT_STRING_UID_NAME = oids+2;
GSS_DLLIMP gss_OID gss_nt_string_uid_name = oids+2;
GSS_DLLIMP gss_OID GSS_C_NT_HOSTBASED_SERVICE_X = oids+3;
-gss_OID gss_nt_service_name_v2 = oids+3;
+gss_OID gss_nt_service_name_v2 = oids+3;
GSS_DLLIMP gss_OID GSS_C_NT_HOSTBASED_SERVICE = oids+4;
GSS_DLLIMP gss_OID gss_nt_service_name = oids+4;
@@ -145,4 +146,4 @@ GSS_DLLIMP gss_OID gss_nt_service_name = oids+4;
GSS_DLLIMP gss_OID GSS_C_NT_ANONYMOUS = oids+5;
GSS_DLLIMP gss_OID GSS_C_NT_EXPORT_NAME = oids+6;
-gss_OID gss_nt_exported_name = oids+6;
+gss_OID gss_nt_exported_name = oids+6;
diff --git a/src/lib/gssapi/generic/gssapi_generic.h b/src/lib/gssapi/generic/gssapi_generic.h
index bf3c2af59c..eee79655e6 100644
--- a/src/lib/gssapi/generic/gssapi_generic.h
+++ b/src/lib/gssapi/generic/gssapi_generic.h
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -30,8 +31,8 @@
#include <gssapi/gssapi.h>
#if defined(__cplusplus) && !defined(GSSAPIGENERIC_BEGIN_DECLS)
-#define GSSAPIGENERIC_BEGIN_DECLS extern "C" {
-#define GSSAPIGENERIC_END_DECLS }
+#define GSSAPIGENERIC_BEGIN_DECLS extern "C" {
+#define GSSAPIGENERIC_END_DECLS }
#else
#define GSSAPIGENERIC_BEGIN_DECLS
#define GSSAPIGENERIC_END_DECLS
@@ -40,7 +41,7 @@
GSSAPIGENERIC_BEGIN_DECLS
/* Deprecated MIT krb5 oid names provided for compatibility.
- * The correct oids (GSS_C_NT_USER_NAME, etc) from rfc 2744
+ * The correct oids (GSS_C_NT_USER_NAME, etc) from rfc 2744
* are defined in gssapi.h. */
GSS_DLLIMP extern gss_OID gss_nt_user_name;
diff --git a/src/lib/gssapi/generic/maptest.c b/src/lib/gssapi/generic/maptest.c
index 28b4b06337..ce594218d2 100644
--- a/src/lib/gssapi/generic/maptest.c
+++ b/src/lib/gssapi/generic/maptest.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
@@ -11,13 +12,13 @@ static int eltcp(elt *dest, elt src)
static int eltcmp(elt left, elt right)
{
if (left.a < right.a)
- return -1;
+ return -1;
if (left.a > right.a)
- return 1;
+ return 1;
if (left.b < right.b)
- return -1;
+ return -1;
if (left.b > right.b)
- return 1;
+ return 1;
return 0;
}
static void eltprt(elt v, FILE *f)
@@ -27,9 +28,9 @@ static void eltprt(elt v, FILE *f)
static int intcmp(int left, int right)
{
if (left < right)
- return -1;
+ return -1;
if (left > right)
- return 1;
+ return 1;
return 0;
}
static void intprt(int v, FILE *f)
diff --git a/src/lib/gssapi/generic/rel_buffer.c b/src/lib/gssapi/generic/rel_buffer.c
index 5558881845..8b35e80371 100644
--- a/src/lib/gssapi/generic/rel_buffer.c
+++ b/src/lib/gssapi/generic/rel_buffer.c
@@ -1,8 +1,9 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/* #ident "@(#)g_rel_buffer.c 1.2 96/02/06 SMI" */
/*
* Copyright 1996 by Sun Microsystems, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -12,7 +13,7 @@
* without specific, written prior permission. Sun Microsystems makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -34,23 +35,22 @@
#endif
OM_uint32
-generic_gss_release_buffer (minor_status,
- buffer)
- OM_uint32 * minor_status;
- gss_buffer_t buffer;
+generic_gss_release_buffer(
+ OM_uint32 *minor_status,
+ gss_buffer_t buffer)
{
if (minor_status)
- *minor_status = 0;
+ *minor_status = 0;
/* if buffer is NULL, return */
if (buffer == GSS_C_NO_BUFFER)
- return(GSS_S_COMPLETE);
+ return(GSS_S_COMPLETE);
if (buffer->value) {
- free(buffer->value);
- buffer->length = 0;
- buffer->value = NULL;
+ free(buffer->value);
+ buffer->length = 0;
+ buffer->value = NULL;
}
return (GSS_S_COMPLETE);
diff --git a/src/lib/gssapi/generic/rel_oid_set.c b/src/lib/gssapi/generic/rel_oid_set.c
index bd7f3cb2cf..137a513a0f 100644
--- a/src/lib/gssapi/generic/rel_oid_set.c
+++ b/src/lib/gssapi/generic/rel_oid_set.c
@@ -1,8 +1,9 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/* #ident "@(#)gss_release_oid_set.c 1.12 95/08/23 SMI" */
/*
* Copyright 1996 by Sun Microsystems, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -12,7 +13,7 @@
* without specific, written prior permission. Sun Microsystems makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -34,28 +35,27 @@
#endif
OM_uint32
-generic_gss_release_oid_set (minor_status,
- set)
- OM_uint32 * minor_status;
- gss_OID_set * set;
+generic_gss_release_oid_set(
+ OM_uint32 *minor_status,
+ gss_OID_set *set)
{
size_t i;
if (minor_status)
- *minor_status = 0;
+ *minor_status = 0;
if (set == NULL)
- return(GSS_S_COMPLETE);
+ return(GSS_S_COMPLETE);
if (*set == GSS_C_NULL_OID_SET)
- return(GSS_S_COMPLETE);
+ return(GSS_S_COMPLETE);
for (i=0; i<(*set)->count; i++)
- free((*set)->elements[i].elements);
+ free((*set)->elements[i].elements);
free((*set)->elements);
free(*set);
*set = GSS_C_NULL_OID_SET;
-
+
return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/generic/util_buffer.c b/src/lib/gssapi/generic/util_buffer.c
index 1ce9f89471..b707d15fbe 100644
--- a/src/lib/gssapi/generic/util_buffer.c
+++ b/src/lib/gssapi/generic/util_buffer.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -33,12 +34,12 @@
int g_make_string_buffer(const char *str, gss_buffer_t buffer)
{
- buffer->length = strlen(str);
+ buffer->length = strlen(str);
- if ((buffer->value = strdup(str)) == NULL) {
- buffer->length = 0;
- return(0);
- }
+ if ((buffer->value = strdup(str)) == NULL) {
+ buffer->length = 0;
+ return(0);
+ }
- return(1);
+ return(1);
}
diff --git a/src/lib/gssapi/generic/util_canonhost.c b/src/lib/gssapi/generic/util_canonhost.c
index 829311db9d..f1bd93f2b4 100644
--- a/src/lib/gssapi/generic/util_canonhost.c
+++ b/src/lib/gssapi/generic/util_canonhost.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -37,35 +38,34 @@
#include <string.h>
char *
-g_canonicalize_host(hostname)
- char *hostname;
+g_canonicalize_host(char *hostname)
{
- struct hostent *hent;
- char *haddr;
- char *canon, *str;
+ struct hostent *hent;
+ char *haddr;
+ char *canon, *str;
- if ((hent = gethostbyname(hostname)) == NULL)
- return(NULL);
+ if ((hent = gethostbyname(hostname)) == NULL)
+ return(NULL);
- if (! (haddr = (char *) xmalloc(hent->h_length))) {
+ if (! (haddr = (char *) xmalloc(hent->h_length))) {
return(NULL);
- }
+ }
- memcpy(haddr, hent->h_addr_list[0], hent->h_length);
+ memcpy(haddr, hent->h_addr_list[0], hent->h_length);
- if (! (hent = gethostbyaddr(haddr, hent->h_length, hent->h_addrtype))) {
+ if (! (hent = gethostbyaddr(haddr, hent->h_length, hent->h_addrtype))) {
return(NULL);
- }
+ }
- xfree(haddr);
+ xfree(haddr);
- if ((canon = (char *) xmalloc(strlen(hent->h_name)+1)) == NULL)
- return(NULL);
+ if ((canon = (char *) xmalloc(strlen(hent->h_name)+1)) == NULL)
+ return(NULL);
- strcpy(canon, hent->h_name);
+ strcpy(canon, hent->h_name);
- for (str = canon; *str; str++)
- if (isupper(*str)) *str = tolower(*str);
+ for (str = canon; *str; str++)
+ if (isupper(*str)) *str = tolower(*str);
- return(canon);
+ return(canon);
}
diff --git a/src/lib/gssapi/generic/util_errmap.c b/src/lib/gssapi/generic/util_errmap.c
index 9e2f7e9b3d..2634e667b5 100644
--- a/src/lib/gssapi/generic/util_errmap.c
+++ b/src/lib/gssapi/generic/util_errmap.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2007, 2008 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,7 +21,7 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
#include "gssapiP_generic.h"
@@ -45,26 +46,26 @@ static inline int
cmp_OM_uint32(OM_uint32 m1, OM_uint32 m2)
{
if (m1 < m2)
- return -1;
+ return -1;
else if (m1 > m2)
- return 1;
+ return 1;
else
- return 0;
+ return 0;
}
static inline int
mecherror_cmp(struct mecherror m1, struct mecherror m2)
{
if (m1.code < m2.code)
- return -1;
+ return -1;
if (m1.code > m2.code)
- return 1;
+ return 1;
if (m1.mech.length < m2.mech.length)
- return -1;
+ return -1;
if (m1.mech.length > m2.mech.length)
- return 1;
+ return 1;
if (m1.mech.length == 0)
- return 0;
+ return 0;
return memcmp(m1.mech.elements, m2.mech.elements, m1.mech.length);
}
@@ -80,10 +81,10 @@ mecherror_copy(struct mecherror *dest, struct mecherror src)
*dest = src;
dest->mech.elements = malloc(src.mech.length);
if (dest->mech.elements == NULL) {
- if (src.mech.length)
- return ENOMEM;
- else
- return 0;
+ if (src.mech.length)
+ return ENOMEM;
+ else
+ return 0;
}
memcpy(dest->mech.elements, src.mech.elements, src.mech.length);
return 0;
@@ -95,40 +96,40 @@ mecherror_print(struct mecherror value, FILE *f)
OM_uint32 minor;
gss_buffer_desc str;
static const struct {
- const char *oidstr, *name;
+ const char *oidstr, *name;
} mechnames[] = {
- { "{ 1 2 840 113554 1 2 2 }", "krb5-new" },
- { "{ 1 3 5 1 5 2 }", "krb5-old" },
- { "{ 1 2 840 48018 1 2 2 }", "krb5-microsoft" },
- { "{ 1 3 6 1 5 5 2 }", "spnego" },
+ { "{ 1 2 840 113554 1 2 2 }", "krb5-new" },
+ { "{ 1 3 5 1 5 2 }", "krb5-old" },
+ { "{ 1 2 840 48018 1 2 2 }", "krb5-microsoft" },
+ { "{ 1 3 6 1 5 5 2 }", "spnego" },
};
unsigned int i;
fprintf(f, "%lu@", (unsigned long) value.code);
if (value.mech.length == 0) {
- fprintf(f, "(com_err)");
- return;
+ fprintf(f, "(com_err)");
+ return;
}
fprintf(f, "%p=", value.mech.elements);
if (generic_gss_oid_to_str(&minor, &value.mech, &str)) {
- fprintf(f, "(error in conversion)");
- return;
+ fprintf(f, "(error in conversion)");
+ return;
}
/* Note: generic_gss_oid_to_str returns a null-terminated string. */
for (i = 0; i < sizeof(mechnames)/sizeof(mechnames[0]); i++) {
- if (!strcmp(str.value, mechnames[i].oidstr) && mechnames[i].name != 0) {
- fprintf(f, "%s", mechnames[i].name);
- break;
- }
+ if (!strcmp(str.value, mechnames[i].oidstr) && mechnames[i].name != 0) {
+ fprintf(f, "%s", mechnames[i].name);
+ break;
+ }
}
if (i == sizeof(mechnames)/sizeof(mechnames[0]))
- fprintf(f, "%s", (char *) str.value);
+ fprintf(f, "%s", (char *) str.value);
generic_gss_release_buffer(&minor, &str);
}
#include "errmap.h"
-#include "krb5.h" /* for KRB5KRB_AP_WRONG_PRINC */
+#include "krb5.h" /* for KRB5KRB_AP_WRONG_PRINC */
static mecherrmap m;
static k5_mutex_t mutex = K5_MUTEX_PARTIAL_INITIALIZER;
@@ -140,11 +141,11 @@ int gssint_mecherrmap_init(void)
err = mecherrmap_init(&m);
if (err)
- return err;
+ return err;
err = k5_mutex_finish_init(&mutex);
if (err) {
- mecherrmap_destroy(&m);
- return err;
+ mecherrmap_destroy(&m);
+ return err;
}
return 0;
@@ -155,7 +156,7 @@ int gssint_mecherrmap_init(void)
static int free_one(OM_uint32 i, struct mecherror value, void *p)
{
if (value.mech.length && value.mech.elements)
- free(value.mech.elements);
+ free(value.mech.elements);
return 0;
}
@@ -178,7 +179,7 @@ OM_uint32 gssint_mecherrmap_map(OM_uint32 minor, const gss_OID_desc * oid)
FILE *f;
f = fopen("/dev/pts/9", "w+");
if (f == NULL)
- f = stderr;
+ f = stderr;
#endif
me.code = minor;
@@ -186,51 +187,51 @@ OM_uint32 gssint_mecherrmap_map(OM_uint32 minor, const gss_OID_desc * oid)
err = k5_mutex_lock(&mutex);
if (err) {
#ifdef DEBUG
- if (f != stderr) fclose(f);
+ if (f != stderr) fclose(f);
#endif
- return 0;
+ return 0;
}
/* Is this status+oid already mapped? */
p = mecherrmap_findright(&m, me);
if (p != NULL) {
- k5_mutex_unlock(&mutex);
+ k5_mutex_unlock(&mutex);
#ifdef DEBUG
- fprintf(f, "%s: found ", __func__);
- mecherror_print(me, f);
- fprintf(f, " in map as %lu\n", (unsigned long) *p);
- if (f != stderr) fclose(f);
+ fprintf(f, "%s: found ", __func__);
+ mecherror_print(me, f);
+ fprintf(f, " in map as %lu\n", (unsigned long) *p);
+ if (f != stderr) fclose(f);
#endif
- return *p;
+ return *p;
}
/* Is this status code already mapped to something else
mech-specific? */
mep = mecherrmap_findleft(&m, minor);
if (mep == NULL) {
- /* Map it to itself plus this mech-oid. */
- new_status = minor;
+ /* Map it to itself plus this mech-oid. */
+ new_status = minor;
} else {
- /* Already assigned. Pick a fake new value and map it. */
- /* There's a theoretical infinite loop risk here, if we fill
- in 2**32 values. Also, returning 0 has a special
- meaning. */
- do {
- next_fake++;
- new_status = next_fake;
- if (new_status == 0)
- /* ??? */;
- } while (mecherrmap_findleft(&m, new_status) != NULL);
+ /* Already assigned. Pick a fake new value and map it. */
+ /* There's a theoretical infinite loop risk here, if we fill
+ in 2**32 values. Also, returning 0 has a special
+ meaning. */
+ do {
+ next_fake++;
+ new_status = next_fake;
+ if (new_status == 0)
+ /* ??? */;
+ } while (mecherrmap_findleft(&m, new_status) != NULL);
}
err = mecherror_copy(&me_copy, me);
if (err) {
- k5_mutex_unlock(&mutex);
- return err;
+ k5_mutex_unlock(&mutex);
+ return err;
}
err = mecherrmap_add(&m, new_status, me_copy);
k5_mutex_unlock(&mutex);
if (err) {
- if (me_copy.mech.length)
- free(me_copy.mech.elements);
+ if (me_copy.mech.length)
+ free(me_copy.mech.elements);
}
#ifdef DEBUG
fprintf(f, "%s: mapping ", __func__);
@@ -241,9 +242,9 @@ OM_uint32 gssint_mecherrmap_map(OM_uint32 minor, const gss_OID_desc * oid)
if (f != stderr) fclose(f);
#endif
if (err)
- return 0;
+ return 0;
else
- return new_status;
+ return new_status;
}
static gss_OID_desc no_oid = { 0, 0 };
@@ -253,21 +254,21 @@ OM_uint32 gssint_mecherrmap_map_errcode(OM_uint32 errcode)
}
int gssint_mecherrmap_get(OM_uint32 minor, gss_OID mech_oid,
- OM_uint32 *mech_minor)
+ OM_uint32 *mech_minor)
{
const struct mecherror *p;
int err;
if (minor == 0) {
- return EINVAL;
+ return EINVAL;
}
err = k5_mutex_lock(&mutex);
if (err)
- return err;
+ return err;
p = mecherrmap_findleft(&m, minor);
k5_mutex_unlock(&mutex);
if (!p) {
- return EINVAL;
+ return EINVAL;
}
*mech_oid = p->mech;
*mech_minor = p->code;
diff --git a/src/lib/gssapi/generic/util_localhost.c b/src/lib/gssapi/generic/util_localhost.c
index 13856e3206..2d3c27cb24 100644
--- a/src/lib/gssapi/generic/util_localhost.c
+++ b/src/lib/gssapi/generic/util_localhost.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -34,17 +35,18 @@
#define MAXHOSTNAMELEN 64
#endif
-char *g_local_host_name()
+char *
+g_local_host_name(void)
{
- char buf[MAXHOSTNAMELEN+1], *ptr;
+ char buf[MAXHOSTNAMELEN+1], *ptr;
- if (gethostname(buf, sizeof(buf)) < 0)
- return 0;
+ if (gethostname(buf, sizeof(buf)) < 0)
+ return 0;
- buf[sizeof(buf)-1] = '\0';
+ buf[sizeof(buf)-1] = '\0';
- if (! (ptr = xmalloc(strlen(buf) + 1)))
- return 0;
+ if (! (ptr = xmalloc(strlen(buf) + 1)))
+ return 0;
- return strcpy(ptr, buf);
+ return strcpy(ptr, buf);
}
diff --git a/src/lib/gssapi/generic/util_ordering.c b/src/lib/gssapi/generic/util_ordering.c
index 218462bb0c..274790e4e0 100644
--- a/src/lib/gssapi/generic/util_ordering.c
+++ b/src/lib/gssapi/generic/util_ordering.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -34,18 +35,18 @@
#define QUEUE_LENGTH 20
typedef struct _queue {
- int do_replay;
- int do_sequence;
- int start;
- int length;
- gssint_uint64 firstnum;
- /* Stored as deltas from firstnum. This way, the high bit won't
- overflow unless we've actually gone through 2**n messages, or
- gotten something *way* out of sequence. */
- gssint_uint64 elem[QUEUE_LENGTH];
- /* All ones for 64-bit sequence numbers; 32 ones for 32-bit
- sequence numbers. */
- gssint_uint64 mask;
+ int do_replay;
+ int do_sequence;
+ int start;
+ int length;
+ gssint_uint64 firstnum;
+ /* Stored as deltas from firstnum. This way, the high bit won't
+ overflow unless we've actually gone through 2**n messages, or
+ gotten something *way* out of sequence. */
+ gssint_uint64 elem[QUEUE_LENGTH];
+ /* All ones for 64-bit sequence numbers; 32 ones for 32-bit
+ sequence numbers. */
+ gssint_uint64 mask;
} queue;
/* rep invariant:
@@ -59,157 +60,157 @@ typedef struct _queue {
static void
queue_insert(queue *q, int after, gssint_uint64 seqnum)
{
- /* insert. this is not the fastest way, but it's easy, and it's
- optimized for insert at end, which is the common case */
- int i;
+ /* insert. this is not the fastest way, but it's easy, and it's
+ optimized for insert at end, which is the common case */
+ int i;
- /* common case: at end, after == q->start+q->length-1 */
+ /* common case: at end, after == q->start+q->length-1 */
- /* move all the elements (after,last] up one slot */
+ /* move all the elements (after,last] up one slot */
- for (i=q->start+q->length-1; i>after; i--)
- QELEM(q,i+1) = QELEM(q,i);
+ for (i=q->start+q->length-1; i>after; i--)
+ QELEM(q,i+1) = QELEM(q,i);
- /* fill in slot after+1 */
+ /* fill in slot after+1 */
- QELEM(q,after+1) = seqnum;
+ QELEM(q,after+1) = seqnum;
- /* Either increase the length by one, or move the starting point up
- one (deleting the first element, which got bashed above), as
- appropriate. */
+ /* Either increase the length by one, or move the starting point up
+ one (deleting the first element, which got bashed above), as
+ appropriate. */
- if (q->length == QSIZE(q)) {
- q->start++;
- if (q->start == QSIZE(q))
- q->start = 0;
- } else {
- q->length++;
- }
+ if (q->length == QSIZE(q)) {
+ q->start++;
+ if (q->start == QSIZE(q))
+ q->start = 0;
+ } else {
+ q->length++;
+ }
}
gss_int32
g_order_init(void **vqueue, gssint_uint64 seqnum,
- int do_replay, int do_sequence, int wide_nums)
+ int do_replay, int do_sequence, int wide_nums)
{
- queue *q;
+ queue *q;
- if ((q = (queue *) malloc(sizeof(queue))) == NULL)
- return(ENOMEM);
+ if ((q = (queue *) malloc(sizeof(queue))) == NULL)
+ return(ENOMEM);
- /* This stops valgrind from complaining about writing uninitialized
- data if the caller exports the context and writes it to a file.
- We don't actually use those bytes at all, but valgrind still
- complains. */
- memset(q, 0xfe, sizeof(*q));
+ /* This stops valgrind from complaining about writing uninitialized
+ data if the caller exports the context and writes it to a file.
+ We don't actually use those bytes at all, but valgrind still
+ complains. */
+ memset(q, 0xfe, sizeof(*q));
- q->do_replay = do_replay;
- q->do_sequence = do_sequence;
- q->mask = wide_nums ? ~(gssint_uint64)0 : 0xffffffffUL;
+ q->do_replay = do_replay;
+ q->do_sequence = do_sequence;
+ q->mask = wide_nums ? ~(gssint_uint64)0 : 0xffffffffUL;
- q->start = 0;
- q->length = 1;
- q->firstnum = seqnum;
- q->elem[q->start] = ((gssint_uint64)0 - 1) & q->mask;
+ q->start = 0;
+ q->length = 1;
+ q->firstnum = seqnum;
+ q->elem[q->start] = ((gssint_uint64)0 - 1) & q->mask;
- *vqueue = (void *) q;
- return(0);
+ *vqueue = (void *) q;
+ return(0);
}
gss_int32
g_order_check(void **vqueue, gssint_uint64 seqnum)
{
- queue *q;
- int i;
- gssint_uint64 expected;
-
- q = (queue *) (*vqueue);
-
- if (!q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
-
- /* All checks are done relative to the initial sequence number, to
- avoid (or at least put off) the pain of wrapping. */
- seqnum -= q->firstnum;
- /* If we're only doing 32-bit values, adjust for that again.
-
- Note that this will probably be the wrong thing to if we get
- 2**32 messages sent with 32-bit sequence numbers. */
- seqnum &= q->mask;
-
- /* rule 1: expected sequence number */
-
- expected = (QELEM(q,q->start+q->length-1)+1) & q->mask;
- if (seqnum == expected) {
- queue_insert(q, q->start+q->length-1, seqnum);
- return(GSS_S_COMPLETE);
- }
-
- /* rule 2: > expected sequence number */
-
- if ((seqnum > expected)) {
- queue_insert(q, q->start+q->length-1, seqnum);
- if (q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
- else
- return(GSS_S_GAP_TOKEN);
- }
-
- /* rule 3: seqnum < seqnum(first) */
-
- if ((seqnum < QELEM(q,q->start)) &&
- /* Is top bit of whatever width we're using set?
-
- We used to check for greater than or equal to firstnum, but
- (1) we've since switched to compute values relative to
- firstnum, so the lowest we can have is 0, and (2) the effect
- of the original scheme was highly dependent on whether
- firstnum was close to either side of 0. (Consider
- firstnum==0xFFFFFFFE and we miss three packets; the next
- packet is *new* but would look old.)
-
- This check should give us 2**31 or 2**63 messages "new", and
- just as many "old". That's not quite right either. */
- (seqnum & (1 + (q->mask >> 1)))
- ) {
- if (q->do_replay && !q->do_sequence)
- return(GSS_S_OLD_TOKEN);
- else
- return(GSS_S_UNSEQ_TOKEN);
- }
-
- /* rule 4+5: seqnum in [seqnum(first),seqnum(last)] */
-
- else {
- if (seqnum == QELEM(q,q->start+q->length-1))
- return(GSS_S_DUPLICATE_TOKEN);
-
- for (i=q->start; i<q->start+q->length-1; i++) {
- if (seqnum == QELEM(q,i))
- return(GSS_S_DUPLICATE_TOKEN);
- if ((seqnum > QELEM(q,i)) && (seqnum < QELEM(q,i+1))) {
- queue_insert(q, i, seqnum);
- if (q->do_replay && !q->do_sequence)
- return(GSS_S_COMPLETE);
- else
- return(GSS_S_UNSEQ_TOKEN);
- }
- }
- }
-
- /* this should never happen */
- return(GSS_S_FAILURE);
+ queue *q;
+ int i;
+ gssint_uint64 expected;
+
+ q = (queue *) (*vqueue);
+
+ if (!q->do_replay && !q->do_sequence)
+ return(GSS_S_COMPLETE);
+
+ /* All checks are done relative to the initial sequence number, to
+ avoid (or at least put off) the pain of wrapping. */
+ seqnum -= q->firstnum;
+ /* If we're only doing 32-bit values, adjust for that again.
+
+ Note that this will probably be the wrong thing to if we get
+ 2**32 messages sent with 32-bit sequence numbers. */
+ seqnum &= q->mask;
+
+ /* rule 1: expected sequence number */
+
+ expected = (QELEM(q,q->start+q->length-1)+1) & q->mask;
+ if (seqnum == expected) {
+ queue_insert(q, q->start+q->length-1, seqnum);
+ return(GSS_S_COMPLETE);
+ }
+
+ /* rule 2: > expected sequence number */
+
+ if ((seqnum > expected)) {
+ queue_insert(q, q->start+q->length-1, seqnum);
+ if (q->do_replay && !q->do_sequence)
+ return(GSS_S_COMPLETE);
+ else
+ return(GSS_S_GAP_TOKEN);
+ }
+
+ /* rule 3: seqnum < seqnum(first) */
+
+ if ((seqnum < QELEM(q,q->start)) &&
+ /* Is top bit of whatever width we're using set?
+
+ We used to check for greater than or equal to firstnum, but
+ (1) we've since switched to compute values relative to
+ firstnum, so the lowest we can have is 0, and (2) the effect
+ of the original scheme was highly dependent on whether
+ firstnum was close to either side of 0. (Consider
+ firstnum==0xFFFFFFFE and we miss three packets; the next
+ packet is *new* but would look old.)
+
+ This check should give us 2**31 or 2**63 messages "new", and
+ just as many "old". That's not quite right either. */
+ (seqnum & (1 + (q->mask >> 1)))
+ ) {
+ if (q->do_replay && !q->do_sequence)
+ return(GSS_S_OLD_TOKEN);
+ else
+ return(GSS_S_UNSEQ_TOKEN);
+ }
+
+ /* rule 4+5: seqnum in [seqnum(first),seqnum(last)] */
+
+ else {
+ if (seqnum == QELEM(q,q->start+q->length-1))
+ return(GSS_S_DUPLICATE_TOKEN);
+
+ for (i=q->start; i<q->start+q->length-1; i++) {
+ if (seqnum == QELEM(q,i))
+ return(GSS_S_DUPLICATE_TOKEN);
+ if ((seqnum > QELEM(q,i)) && (seqnum < QELEM(q,i+1))) {
+ queue_insert(q, i, seqnum);
+ if (q->do_replay && !q->do_sequence)
+ return(GSS_S_COMPLETE);
+ else
+ return(GSS_S_UNSEQ_TOKEN);
+ }
+ }
+ }
+
+ /* this should never happen */
+ return(GSS_S_FAILURE);
}
void
g_order_free(void **vqueue)
{
- queue *q;
-
- q = (queue *) (*vqueue);
+ queue *q;
- free(q);
+ q = (queue *) (*vqueue);
- *vqueue = NULL;
+ free(q);
+
+ *vqueue = NULL;
}
/*
@@ -226,11 +227,11 @@ gss_uint32
g_queue_externalize(void *vqueue, unsigned char **buf, size_t *lenremain)
{
if (*lenremain < sizeof(queue))
- return ENOMEM;
+ return ENOMEM;
memcpy(*buf, vqueue, sizeof(queue));
*buf += sizeof(queue);
*lenremain -= sizeof(queue);
-
+
return 0;
}
@@ -240,9 +241,9 @@ g_queue_internalize(void **vqueue, unsigned char **buf, size_t *lenremain)
void *q;
if (*lenremain < sizeof(queue))
- return EINVAL;
+ return EINVAL;
if ((q = malloc(sizeof(queue))) == 0)
- return ENOMEM;
+ return ENOMEM;
memcpy(q, *buf, sizeof(queue));
*buf += sizeof(queue);
*lenremain -= sizeof(queue);
diff --git a/src/lib/gssapi/generic/util_set.c b/src/lib/gssapi/generic/util_set.c
index fea810852c..d437f1ea78 100644
--- a/src/lib/gssapi/generic/util_set.c
+++ b/src/lib/gssapi/generic/util_set.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1995 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -27,79 +28,79 @@
#include "gssapiP_generic.h"
struct _g_set_elt {
- void *key;
- void *value;
- struct _g_set_elt *next;
+ void *key;
+ void *value;
+ struct _g_set_elt *next;
};
int g_set_init(g_set_elt *s)
{
- *s = NULL;
+ *s = NULL;
- return(0);
+ return(0);
}
#if 0
int g_set_destroy(g_set_elt *s)
{
- g_set next;
+ g_set next;
- while (*s) {
- next = (*s)->next;
- free(*s);
- *s = next;
- }
+ while (*s) {
+ next = (*s)->next;
+ free(*s);
+ *s = next;
+ }
- return(0);
+ return(0);
}
#endif
int g_set_entry_add(g_set_elt *s, void *key, void *value)
{
- g_set_elt first;
+ g_set_elt first;
- if ((first = (struct _g_set_elt *) malloc(sizeof(struct _g_set_elt))) == NULL)
- return(ENOMEM);
+ if ((first = (struct _g_set_elt *) malloc(sizeof(struct _g_set_elt))) == NULL)
+ return(ENOMEM);
- first->key = key;
- first->value = value;
- first->next = *s;
+ first->key = key;
+ first->value = value;
+ first->next = *s;
- *s = first;
+ *s = first;
- return(0);
+ return(0);
}
int g_set_entry_delete(g_set_elt *s, void *key)
{
- g_set_elt *p;
+ g_set_elt *p;
- for (p=s; *p; p = &((*p)->next)) {
- if ((*p)->key == key) {
- g_set_elt next = (*p)->next;
- free(*p);
- *p = next;
+ for (p=s; *p; p = &((*p)->next)) {
+ if ((*p)->key == key) {
+ g_set_elt next = (*p)->next;
+ free(*p);
+ *p = next;
- return(0);
- }
- }
+ return(0);
+ }
+ }
- return(-1);
+ return(-1);
}
int g_set_entry_get(g_set_elt *s, void *key, void **value)
{
- g_set_elt p;
+ g_set_elt p;
- for (p = *s; p; p = p->next) {
- if (p->key == key) {
- *value = p->value;
+ for (p = *s; p; p = p->next) {
+ if (p->key == key) {
+ *value = p->value;
- return(0);
- }
- }
+ return(0);
+ }
+ }
- *value = NULL;
+ *value = NULL;
- return(-1);
+ return(-1);
}
diff --git a/src/lib/gssapi/generic/util_token.c b/src/lib/gssapi/generic/util_token.c
index 7b8dfed223..b37d9065dd 100644
--- a/src/lib/gssapi/generic/util_token.c
+++ b/src/lib/gssapi/generic/util_token.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -35,130 +36,126 @@
the interfaces, so the code can be fixed if the OSI namespace
balloons unexpectedly. */
-/* Each token looks like this:
-
-0x60 tag for APPLICATION 0, SEQUENCE
- (constructed, definite-length)
- <length> possible multiple bytes, need to parse/generate
- 0x06 tag for OBJECT IDENTIFIER
- <moid_length> compile-time constant string (assume 1 byte)
- <moid_bytes> compile-time constant string
- <inner_bytes> the ANY containing the application token
- bytes 0,1 are the token type
- bytes 2,n are the token data
-
-Note that the token type field is a feature of RFC 1964 mechanisms and
-is not used by other GSSAPI mechanisms. As such, a token type of -1
-is interpreted to mean that no token type should be expected or
-generated.
-
-For the purposes of this abstraction, the token "header" consists of
-the sequence tag and length octets, the mech OID DER encoding, and the
-first two inner bytes, which indicate the token type. The token
-"body" consists of everything else.
-
-*/
-
-static unsigned int der_length_size(length)
- int length;
+/*
+ * Each token looks like this:
+ * 0x60 tag for APPLICATION 0, SEQUENCE
+ * (constructed, definite-length)
+ * <length> possible multiple bytes, need to parse/generate
+ * 0x06 tag for OBJECT IDENTIFIER
+ * <moid_length> compile-time constant string (assume 1 byte)
+ * <moid_bytes> compile-time constant string
+ * <inner_bytes> the ANY containing the application token
+ * bytes 0,1 are the token type
+ * bytes 2,n are the token data
+ *
+ * Note that the token type field is a feature of RFC 1964 mechanisms and
+ * is not used by other GSSAPI mechanisms. As such, a token type of -1
+ * is interpreted to mean that no token type should be expected or
+ * generated.
+ *
+ * For the purposes of this abstraction, the token "header" consists of
+ * the sequence tag and length octets, the mech OID DER encoding, and the
+ * first two inner bytes, which indicate the token type. The token
+ * "body" consists of everything else.
+ */
+static unsigned int
+der_length_size(int length)
{
- if (length < (1<<7))
- return(1);
- else if (length < (1<<8))
- return(2);
+ if (length < (1<<7))
+ return(1);
+ else if (length < (1<<8))
+ return(2);
#if INT_MAX == 0x7fff
- else
- return(3);
+ else
+ return(3);
#else
- else if (length < (1<<16))
- return(3);
- else if (length < (1<<24))
- return(4);
- else
- return(5);
+ else if (length < (1<<16))
+ return(3);
+ else if (length < (1<<24))
+ return(4);
+ else
+ return(5);
#endif
}
-static void der_write_length(buf, length)
- unsigned char **buf;
- int length;
+static void
+der_write_length(unsigned char **buf, int length)
{
- if (length < (1<<7)) {
- *(*buf)++ = (unsigned char) length;
- } else {
- *(*buf)++ = (unsigned char) (der_length_size(length)+127);
+ if (length < (1<<7)) {
+ *(*buf)++ = (unsigned char) length;
+ } else {
+ *(*buf)++ = (unsigned char) (der_length_size(length)+127);
#if INT_MAX > 0x7fff
- if (length >= (1<<24))
- *(*buf)++ = (unsigned char) (length>>24);
- if (length >= (1<<16))
- *(*buf)++ = (unsigned char) ((length>>16)&0xff);
+ if (length >= (1<<24))
+ *(*buf)++ = (unsigned char) (length>>24);
+ if (length >= (1<<16))
+ *(*buf)++ = (unsigned char) ((length>>16)&0xff);
#endif
- if (length >= (1<<8))
- *(*buf)++ = (unsigned char) ((length>>8)&0xff);
- *(*buf)++ = (unsigned char) (length&0xff);
- }
+ if (length >= (1<<8))
+ *(*buf)++ = (unsigned char) ((length>>8)&0xff);
+ *(*buf)++ = (unsigned char) (length&0xff);
+ }
}
/* returns decoded length, or < 0 on failure. Advances buf and
decrements bufsize */
-static int der_read_length(buf, bufsize)
- unsigned char **buf;
- int *bufsize;
+static int
+der_read_length(unsigned char **buf, int *bufsize)
{
- unsigned char sf;
- int ret;
-
- if (*bufsize < 1)
- return(-1);
- sf = *(*buf)++;
- (*bufsize)--;
- if (sf & 0x80) {
- if ((sf &= 0x7f) > ((*bufsize)-1))
- return(-1);
- if (sf > sizeof(int))
- return (-1);
- ret = 0;
- for (; sf; sf--) {
- ret = (ret<<8) + (*(*buf)++);
- (*bufsize)--;
- }
- } else {
- ret = sf;
- }
-
- return(ret);
+ unsigned char sf;
+ int ret;
+
+ if (*bufsize < 1)
+ return(-1);
+ sf = *(*buf)++;
+ (*bufsize)--;
+ if (sf & 0x80) {
+ if ((sf &= 0x7f) > ((*bufsize)-1))
+ return(-1);
+ if (sf > sizeof(int))
+ return (-1);
+ ret = 0;
+ for (; sf; sf--) {
+ ret = (ret<<8) + (*(*buf)++);
+ (*bufsize)--;
+ }
+ } else {
+ ret = sf;
+ }
+
+ return(ret);
}
/* returns the length of a token, given the mech oid and the body size */
-unsigned int g_token_size(mech, body_size)
- const gss_OID_desc * mech;
- unsigned int body_size;
+unsigned int
+g_token_size(const gss_OID_desc * mech, unsigned int body_size)
{
- /* set body_size to sequence contents size */
- body_size += 4 + (int) mech->length; /* NEED overflow check */
- return(1 + der_length_size(body_size) + body_size);
+ /* set body_size to sequence contents size */
+ body_size += 4 + (int) mech->length; /* NEED overflow check */
+ return(1 + der_length_size(body_size) + body_size);
}
/* fills in a buffer with the token header. The buffer is assumed to
be the right size. buf is advanced past the token header */
-void g_make_token_header(mech, body_size, buf, tok_type)
- const gss_OID_desc * mech;
- unsigned int body_size;
- unsigned char **buf;
- int tok_type;
+void
+g_make_token_header(
+ const gss_OID_desc * mech,
+ unsigned int body_size,
+ unsigned char **buf,
+ int tok_type)
{
- *(*buf)++ = 0x60;
- der_write_length(buf, (tok_type == -1) ?2:4 + mech->length + body_size);
- *(*buf)++ = 0x06;
- *(*buf)++ = (unsigned char) mech->length;
- TWRITE_STR(*buf, mech->elements, mech->length);
- if (tok_type != -1) {
- *(*buf)++ = (unsigned char) ((tok_type>>8)&0xff);
- *(*buf)++ = (unsigned char) (tok_type&0xff);
- }
+ *(*buf)++ = 0x60;
+ der_write_length(buf, (tok_type == -1) ?2:4 + mech->length + body_size);
+ *(*buf)++ = 0x06;
+ *(*buf)++ = (unsigned char) mech->length;
+ TWRITE_STR(*buf, mech->elements, mech->length);
+ if (tok_type != -1) {
+ *(*buf)++ = (unsigned char) ((tok_type>>8)&0xff);
+ *(*buf)++ = (unsigned char) (tok_type&0xff);
+ }
}
/*
@@ -170,63 +167,63 @@ void g_make_token_header(mech, body_size, buf, tok_type)
* *body_size are left unmodified on error.
*/
-gss_int32 g_verify_token_header(mech, body_size, buf_in, tok_type, toksize_in,
- wrapper_required)
- const gss_OID_desc * mech;
- unsigned int *body_size;
- unsigned char **buf_in;
- int tok_type;
- unsigned int toksize_in;
- int wrapper_required;
+gss_int32
+g_verify_token_header(
+ const gss_OID_desc * mech,
+ unsigned int *body_size,
+ unsigned char **buf_in,
+ int tok_type,
+ unsigned int toksize_in,
+ int wrapper_required)
{
- unsigned char *buf = *buf_in;
- int seqsize;
- gss_OID_desc toid;
- int toksize = toksize_in;
-
- if ((toksize-=1) < 0)
- return(G_BAD_TOK_HEADER);
- if (*buf++ != 0x60) {
- if (wrapper_required)
- return(G_BAD_TOK_HEADER);
- buf--;
- toksize++;
- goto skip_wrapper;
- }
-
- if ((seqsize = der_read_length(&buf, &toksize)) < 0)
- return(G_BAD_TOK_HEADER);
-
- if (seqsize != toksize)
- return(G_BAD_TOK_HEADER);
-
- if ((toksize-=1) < 0)
- return(G_BAD_TOK_HEADER);
- if (*buf++ != 0x06)
- return(G_BAD_TOK_HEADER);
-
- if ((toksize-=1) < 0)
- return(G_BAD_TOK_HEADER);
- toid.length = *buf++;
-
- if ((toksize-=toid.length) < 0)
- return(G_BAD_TOK_HEADER);
- toid.elements = buf;
- buf+=toid.length;
-
- if (! g_OID_equal(&toid, mech))
- return G_WRONG_MECH;
+ unsigned char *buf = *buf_in;
+ int seqsize;
+ gss_OID_desc toid;
+ int toksize = toksize_in;
+
+ if ((toksize-=1) < 0)
+ return(G_BAD_TOK_HEADER);
+ if (*buf++ != 0x60) {
+ if (wrapper_required)
+ return(G_BAD_TOK_HEADER);
+ buf--;
+ toksize++;
+ goto skip_wrapper;
+ }
+
+ if ((seqsize = der_read_length(&buf, &toksize)) < 0)
+ return(G_BAD_TOK_HEADER);
+
+ if (seqsize != toksize)
+ return(G_BAD_TOK_HEADER);
+
+ if ((toksize-=1) < 0)
+ return(G_BAD_TOK_HEADER);
+ if (*buf++ != 0x06)
+ return(G_BAD_TOK_HEADER);
+
+ if ((toksize-=1) < 0)
+ return(G_BAD_TOK_HEADER);
+ toid.length = *buf++;
+
+ if ((toksize-=toid.length) < 0)
+ return(G_BAD_TOK_HEADER);
+ toid.elements = buf;
+ buf+=toid.length;
+
+ if (! g_OID_equal(&toid, mech))
+ return G_WRONG_MECH;
skip_wrapper:
- if (tok_type != -1) {
- if ((toksize-=2) < 0)
- return(G_BAD_TOK_HEADER);
-
- if ((*buf++ != ((tok_type>>8)&0xff)) ||
- (*buf++ != (tok_type&0xff)))
- return(G_WRONG_TOKID);
- }
- *buf_in = buf;
- *body_size = toksize;
-
- return 0;
+ if (tok_type != -1) {
+ if ((toksize-=2) < 0)
+ return(G_BAD_TOK_HEADER);
+
+ if ((*buf++ != ((tok_type>>8)&0xff)) ||
+ (*buf++ != (tok_type&0xff)))
+ return(G_WRONG_TOKID);
+ }
+ *buf_in = buf;
+ *body_size = toksize;
+
+ return 0;
}
diff --git a/src/lib/gssapi/generic/util_validate.c b/src/lib/gssapi/generic/util_validate.c
index bb9d0d2ecf..24a1bc5189 100644
--- a/src/lib/gssapi/generic/util_validate.c
+++ b/src/lib/gssapi/generic/util_validate.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -45,193 +46,193 @@ static const int one = 1;
static const DBT dbtone = { (void *) &one, sizeof(one) };
typedef struct _vkey {
- int type;
- void *ptr;
+ int type;
+ void *ptr;
} vkey;
#endif
-#define V_NAME 1
-#define V_CRED_ID 2
-#define V_CTX_ID 3
-#define V_LCTX_ID 4
+#define V_NAME 1
+#define V_CRED_ID 2
+#define V_CTX_ID 3
+#define V_LCTX_ID 4
/* All these functions return 0 on failure, and non-zero on success */
static int g_save(db, type, ptr)
- g_set *db;
+ g_set *db;
#ifdef HAVE_BSD_DB
- int type;
+ int type;
#else
- void *type;
+ void *type;
#endif
- void *ptr;
+ void *ptr;
{
- int ret;
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb;
- vkey vk;
- DBT key;
+ DB **vdb;
+ vkey vk;
+ DBT key;
- ret = gssint_initialize_library();
- if (ret)
- return 0;
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
+ ret = gssint_initialize_library();
+ if (ret)
+ return 0;
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
- vdb = (DB **) &db->data;
+ vdb = (DB **) &db->data;
- if (!*vdb)
- *vdb = dbopen(NULL, O_CREAT|O_RDWR, O_CREAT|O_RDWR, DB_HASH, NULL);
+ if (!*vdb)
+ *vdb = dbopen(NULL, O_CREAT|O_RDWR, O_CREAT|O_RDWR, DB_HASH, NULL);
- vk.type = type;
- vk.ptr = ptr;
+ vk.type = type;
+ vk.ptr = ptr;
- key.data = &vk;
- key.size = sizeof(vk);
+ key.data = &vk;
+ key.size = sizeof(vk);
- ret = ((*((*vdb)->put))(*vdb, &key, &dbtone, 0) == 0);
- k5_mutex_unlock(&db->mutex);
- return ret;
+ ret = ((*((*vdb)->put))(*vdb, &key, &dbtone, 0) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#else
- g_set_elt *gs;
-
- ret = gssint_initialize_library();
- if (ret)
- return 0;
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
-
- gs = (g_set_elt *) &db->data;
-
- if (!*gs)
- if (g_set_init(gs)) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
-
- ret = (g_set_entry_add(gs, ptr, type) == 0);
- k5_mutex_unlock(&db->mutex);
- return ret;
+ g_set_elt *gs;
+
+ ret = gssint_initialize_library();
+ if (ret)
+ return 0;
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ gs = (g_set_elt *) &db->data;
+
+ if (!*gs)
+ if (g_set_init(gs)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+
+ ret = (g_set_entry_add(gs, ptr, type) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#endif
}
static int g_validate(db, type, ptr)
- g_set *db;
+ g_set *db;
#ifdef HAVE_BSD_DB
- int type;
+ int type;
#else
- void *type;
+ void *type;
#endif
- void *ptr;
+ void *ptr;
{
- int ret;
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb;
- vkey vk;
- DBT key, value;
-
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
-
- vdb = (DB **) &db->data;
- if (!*vdb) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
-
- vk.type = type;
- vk.ptr = ptr;
-
- key.data = &vk;
- key.size = sizeof(vk);
-
- if ((*((*vdb)->get))(*vdb, &key, &value, 0)) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
-
- k5_mutex_unlock(&db->mutex);
- return((value.size == sizeof(one)) &&
- (*((int *) value.data) == one));
+ DB **vdb;
+ vkey vk;
+ DBT key, value;
+
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ vdb = (DB **) &db->data;
+ if (!*vdb) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+
+ vk.type = type;
+ vk.ptr = ptr;
+
+ key.data = &vk;
+ key.size = sizeof(vk);
+
+ if ((*((*vdb)->get))(*vdb, &key, &value, 0)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+
+ k5_mutex_unlock(&db->mutex);
+ return((value.size == sizeof(one)) &&
+ (*((int *) value.data) == one));
#else
- g_set_elt *gs;
- void *value;
-
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
-
- gs = (g_set_elt *) &db->data;
- if (!*gs) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
-
- if (g_set_entry_get(gs, ptr, (void **) &value)) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
- k5_mutex_unlock(&db->mutex);
- return(value == type);
+ g_set_elt *gs;
+ void *value;
+
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ gs = (g_set_elt *) &db->data;
+ if (!*gs) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+
+ if (g_set_entry_get(gs, ptr, (void **) &value)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+ k5_mutex_unlock(&db->mutex);
+ return(value == type);
#endif
}
static int g_delete(db, type, ptr)
- g_set *db;
+ g_set *db;
#ifdef HAVE_BSD_DB
- int type;
+ int type;
#else
- void *type;
+ void *type;
#endif
- void *ptr;
+ void *ptr;
{
- int ret;
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb;
- vkey vk;
- DBT key;
+ DB **vdb;
+ vkey vk;
+ DBT key;
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
- vdb = (DB **) &db->data;
- if (!*vdb) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
+ vdb = (DB **) &db->data;
+ if (!*vdb) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
- vk.type = type;
- vk.ptr = ptr;
+ vk.type = type;
+ vk.ptr = ptr;
- key.data = &vk;
- key.size = sizeof(vk);
+ key.data = &vk;
+ key.size = sizeof(vk);
- ret = ((*((*vdb)->del))(*vdb, &key, 0) == 0);
- k5_mutex_unlock(&db->mutex);
- return ret;
+ ret = ((*((*vdb)->del))(*vdb, &key, 0) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#else
- g_set_elt *gs;
-
- ret = k5_mutex_lock(&db->mutex);
- if (ret)
- return 0;
-
- gs = (g_set_elt *) &db->data;
- if (!*gs) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
-
- if (g_set_entry_delete(gs, ptr)) {
- k5_mutex_unlock(&db->mutex);
- return(0);
- }
- k5_mutex_unlock(&db->mutex);
- return(1);
+ g_set_elt *gs;
+
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ gs = (g_set_elt *) &db->data;
+ if (!*gs) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+
+ if (g_set_entry_delete(gs, ptr)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+ k5_mutex_unlock(&db->mutex);
+ return(1);
#endif
}
@@ -240,82 +241,81 @@ static int g_delete(db, type, ptr)
/* save */
int g_save_name(vdb, name)
- g_set *vdb;
- gss_name_t name;
+ g_set *vdb;
+ gss_name_t name;
{
- return(g_save(vdb, V_NAME, (void *) name));
+ return(g_save(vdb, V_NAME, (void *) name));
}
int g_save_cred_id(vdb, cred)
- g_set *vdb;
- gss_cred_id_t cred;
+ g_set *vdb;
+ gss_cred_id_t cred;
{
- return(g_save(vdb, V_CRED_ID, (void *) cred));
+ return(g_save(vdb, V_CRED_ID, (void *) cred));
}
int g_save_ctx_id(vdb, ctx)
- g_set *vdb;
- gss_ctx_id_t ctx;
+ g_set *vdb;
+ gss_ctx_id_t ctx;
{
- return(g_save(vdb, V_CTX_ID, (void *) ctx));
+ return(g_save(vdb, V_CTX_ID, (void *) ctx));
}
int g_save_lucidctx_id(vdb, lctx)
- g_set *vdb;
- void *lctx;
+ g_set *vdb;
+ void *lctx;
{
- return(g_save(vdb, V_LCTX_ID, (void *) lctx));
+ return(g_save(vdb, V_LCTX_ID, (void *) lctx));
}
/* validate */
int g_validate_name(vdb, name)
- g_set *vdb;
- gss_name_t name;
+ g_set *vdb;
+ gss_name_t name;
{
- return(g_validate(vdb, V_NAME, (void *) name));
+ return(g_validate(vdb, V_NAME, (void *) name));
}
int g_validate_cred_id(vdb, cred)
- g_set *vdb;
- gss_cred_id_t cred;
+ g_set *vdb;
+ gss_cred_id_t cred;
{
- return(g_validate(vdb, V_CRED_ID, (void *) cred));
+ return(g_validate(vdb, V_CRED_ID, (void *) cred));
}
int g_validate_ctx_id(vdb, ctx)
- g_set *vdb;
- gss_ctx_id_t ctx;
+ g_set *vdb;
+ gss_ctx_id_t ctx;
{
- return(g_validate(vdb, V_CTX_ID, (void *) ctx));
+ return(g_validate(vdb, V_CTX_ID, (void *) ctx));
}
int g_validate_lucidctx_id(vdb, lctx)
- g_set *vdb;
- void *lctx;
+ g_set *vdb;
+ void *lctx;
{
- return(g_validate(vdb, V_LCTX_ID, (void *) lctx));
+ return(g_validate(vdb, V_LCTX_ID, (void *) lctx));
}
/* delete */
int g_delete_name(vdb, name)
- g_set *vdb;
- gss_name_t name;
+ g_set *vdb;
+ gss_name_t name;
{
- return(g_delete(vdb, V_NAME, (void *) name));
+ return(g_delete(vdb, V_NAME, (void *) name));
}
int g_delete_cred_id(vdb, cred)
- g_set *vdb;
- gss_cred_id_t cred;
+ g_set *vdb;
+ gss_cred_id_t cred;
{
- return(g_delete(vdb, V_CRED_ID, (void *) cred));
+ return(g_delete(vdb, V_CRED_ID, (void *) cred));
}
int g_delete_ctx_id(vdb, ctx)
- g_set *vdb;
- gss_ctx_id_t ctx;
+ g_set *vdb;
+ gss_ctx_id_t ctx;
{
- return(g_delete(vdb, V_CTX_ID, (void *) ctx));
+ return(g_delete(vdb, V_CTX_ID, (void *) ctx));
}
int g_delete_lucidctx_id(vdb, lctx)
- g_set *vdb;
- void *lctx;
+ g_set *vdb;
+ void *lctx;
{
- return(g_delete(vdb, V_LCTX_ID, (void *) lctx));
+ return(g_delete(vdb, V_LCTX_ID, (void *) lctx));
}
-
diff --git a/src/lib/gssapi/generic/utl_nohash_validate.c b/src/lib/gssapi/generic/utl_nohash_validate.c
index da20b71d6f..d221b3722e 100644
--- a/src/lib/gssapi/generic/utl_nohash_validate.c
+++ b/src/lib/gssapi/generic/utl_nohash_validate.c
@@ -1,7 +1,8 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1990,1994 by the Massachusetts Institute of Technology.
* All Rights Reserved.
- *
+ *
* Export of this software from the United States of America may
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
@@ -20,7 +21,7 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
@@ -41,81 +42,80 @@
/* save */
int g_save_name(vdb, name)
- void **vdb;
- gss_name_t *name;
+ void **vdb;
+ gss_name_t *name;
{
- return 1;
+ return 1;
}
int g_save_cred_id(vdb, cred)
- void **vdb;
- gss_cred_id_t *cred;
+ void **vdb;
+ gss_cred_id_t *cred;
{
- return 1;
+ return 1;
}
int g_save_ctx_id(vdb, ctx)
- void **vdb;
- gss_ctx_id_t *ctx;
+ void **vdb;
+ gss_ctx_id_t *ctx;
{
- return 1;
+ return 1;
}
int g_save_lucidctx_id(vdb, lctx)
- void **vdb;
- void *lctx;
+ void **vdb;
+ void *lctx;
{
- return 1;
+ return 1;
}
/* validate */
int g_validate_name(vdb, name)
- void **vdb;
- gss_name_t *name;
+ void **vdb;
+ gss_name_t *name;
{
- return 1;
+ return 1;
}
int g_validate_cred_id(vdb, cred)
- void **vdb;
- gss_cred_id_t *cred;
+ void **vdb;
+ gss_cred_id_t *cred;
{
- return 1;
+ return 1;
}
int g_validate_ctx_id(vdb, ctx)
- void **vdb;
- gss_ctx_id_t *ctx;
+ void **vdb;
+ gss_ctx_id_t *ctx;
{
- return 1;
+ return 1;
}
int g_validate_lucidctx_id(vdb, lctx)
- void **vdb;
- void *lctx;
+ void **vdb;
+ void *lctx;
{
- return 1;
+ return 1;
}
/* delete */
int g_delete_name(vdb, name)
- void **vdb;
- gss_name_t *name;
+ void **vdb;
+ gss_name_t *name;
{
- return 1;
+ return 1;
}
int g_delete_cred_id(vdb, cred)
- void **vdb;
- gss_cred_id_t *cred;
+ void **vdb;
+ gss_cred_id_t *cred;
{
- return 1;
+ return 1;
}
int g_delete_ctx_id(vdb, ctx)
- void **vdb;
- gss_ctx_id_t *ctx;
+ void **vdb;
+ gss_ctx_id_t *ctx;
{
- return 1;
+ return 1;
}
int g_delete_lucidctx_id(vdb, lctx)
- void **vdb;
- void *lctx;
+ void **vdb;
+ void *lctx;
{
- return 1;
+ return 1;
}
-
diff --git a/src/lib/gssapi/gss_libinit.c b/src/lib/gssapi/gss_libinit.c
index cdffb77290..82e620d2db 100644
--- a/src/lib/gssapi/gss_libinit.c
+++ b/src/lib/gssapi/gss_libinit.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
#include <assert.h>
#include "gssapi_err_generic.h"
@@ -30,29 +31,29 @@ int gssint_lib_init(void)
err = gssint_mechglue_init();
if (err)
- return err;
+ return err;
#ifndef LEAN_CLIENT
err = k5_mutex_finish_init(&gssint_krb5_keytab_lock);
if (err)
- return err;
+ return err;
#endif /* LEAN_CLIENT */
err = k5_key_register(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME, free);
if (err)
- return err;
+ return err;
err = k5_key_register(K5_KEY_GSS_KRB5_CCACHE_NAME, free);
if (err)
- return err;
+ return err;
err = k5_key_register(K5_KEY_GSS_KRB5_ERROR_MESSAGE,
- krb5_gss_delete_error_info);
+ krb5_gss_delete_error_info);
if (err)
- return err;
+ return err;
err = gssint_mecherrmap_init();
if (err)
- return err;
+ return err;
#ifndef _WIN32
err = k5_mutex_finish_init(&kg_kdc_flag_mutex);
if (err)
- return err;
+ return err;
#endif
return k5_mutex_finish_init(&kg_vdb.mutex);
}
@@ -61,9 +62,9 @@ void gssint_lib_fini(void)
{
if (!INITIALIZER_RAN(gssint_lib_init) || PROGRAM_EXITING()) {
#ifdef SHOW_INITFINI_FUNCS
- printf("gssint_lib_fini: skipping\n");
+ printf("gssint_lib_fini: skipping\n");
#endif
- return;
+ return;
}
#ifdef SHOW_INITFINI_FUNCS
printf("gssint_lib_fini\n");
diff --git a/src/lib/gssapi/gss_libinit.h b/src/lib/gssapi/gss_libinit.h
index 5a36604263..11849923c6 100644
--- a/src/lib/gssapi/gss_libinit.h
+++ b/src/lib/gssapi/gss_libinit.h
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
#ifndef GSSAPI_LIBINIT_H
#define GSSAPI_LIBINIT_H
diff --git a/src/lib/gssapi/krb5/accept_sec_context.c b/src/lib/gssapi/krb5/accept_sec_context.c
index 3ae460e1fb..8d01f5e674 100644
--- a/src/lib/gssapi/krb5/accept_sec_context.c
+++ b/src/lib/gssapi/krb5/accept_sec_context.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000, 2004, 2007, 2008 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -46,14 +47,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -64,7 +65,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -84,7 +85,7 @@
#define CFX_ACCEPTOR_SUBKEY 1
#endif
-#ifndef LEAN_CLIENT
+#ifndef LEAN_CLIENT
/* Decode, decrypt and store the forwarded creds in the local ccache. */
static krb5_error_code
@@ -99,91 +100,91 @@ rd_and_store_for_creds(context, auth_context, inbuf, out_cred)
krb5_ccache ccache = NULL;
krb5_gss_cred_id_t cred = NULL;
krb5_auth_context new_auth_ctx = NULL;
- krb5_int32 flags_org;
-
- if ((retval = krb5_auth_con_getflags(context, auth_context, &flags_org)))
- return retval;
- krb5_auth_con_setflags(context, auth_context,
- 0);
-
- /*
- * By the time krb5_rd_cred is called here (after krb5_rd_req has been
- * called in krb5_gss_accept_sec_context), the "keyblock" field of
- * auth_context contains a pointer to the session key, and the
- * "recv_subkey" field might contain a session subkey. Either of
- * these (the "recv_subkey" if it isn't NULL, otherwise the
- * "keyblock") might have been used to encrypt the encrypted part of
- * the KRB_CRED message that contains the forwarded credentials. (The
- * Java Crypto and Security Implementation from the DSTC in Australia
- * always uses the session key. But apparently it never negotiates a
- * subkey, so this code works fine against a JCSI client.) Up to the
- * present, though, GSSAPI clients linked against the MIT code (which
- * is almost all GSSAPI clients) don't encrypt the KRB_CRED message at
- * all -- at this level. So if the first call to krb5_rd_cred fails,
- * we should call it a second time with another auth context freshly
- * created by krb5_auth_con_init. All of its keyblock fields will be
- * NULL, so krb5_rd_cred will assume that the KRB_CRED message is
- * unencrypted. (The MIT code doesn't actually send the KRB_CRED
- * message in the clear -- the "authenticator" whose "checksum" ends up
- * containing the KRB_CRED message does get encrypted.)
- */
- if (krb5_rd_cred(context, auth_context, inbuf, &creds, NULL)) {
- if ((retval = krb5_auth_con_init(context, &new_auth_ctx)))
- goto cleanup;
- krb5_auth_con_setflags(context, new_auth_ctx, 0);
- if ((retval = krb5_rd_cred(context, new_auth_ctx, inbuf,
- &creds, NULL)))
- goto cleanup;
- }
+ krb5_int32 flags_org;
+
+ if ((retval = krb5_auth_con_getflags(context, auth_context, &flags_org)))
+ return retval;
+ krb5_auth_con_setflags(context, auth_context,
+ 0);
+
+ /*
+ * By the time krb5_rd_cred is called here (after krb5_rd_req has been
+ * called in krb5_gss_accept_sec_context), the "keyblock" field of
+ * auth_context contains a pointer to the session key, and the
+ * "recv_subkey" field might contain a session subkey. Either of
+ * these (the "recv_subkey" if it isn't NULL, otherwise the
+ * "keyblock") might have been used to encrypt the encrypted part of
+ * the KRB_CRED message that contains the forwarded credentials. (The
+ * Java Crypto and Security Implementation from the DSTC in Australia
+ * always uses the session key. But apparently it never negotiates a
+ * subkey, so this code works fine against a JCSI client.) Up to the
+ * present, though, GSSAPI clients linked against the MIT code (which
+ * is almost all GSSAPI clients) don't encrypt the KRB_CRED message at
+ * all -- at this level. So if the first call to krb5_rd_cred fails,
+ * we should call it a second time with another auth context freshly
+ * created by krb5_auth_con_init. All of its keyblock fields will be
+ * NULL, so krb5_rd_cred will assume that the KRB_CRED message is
+ * unencrypted. (The MIT code doesn't actually send the KRB_CRED
+ * message in the clear -- the "authenticator" whose "checksum" ends up
+ * containing the KRB_CRED message does get encrypted.)
+ */
+ if (krb5_rd_cred(context, auth_context, inbuf, &creds, NULL)) {
+ if ((retval = krb5_auth_con_init(context, &new_auth_ctx)))
+ goto cleanup;
+ krb5_auth_con_setflags(context, new_auth_ctx, 0);
+ if ((retval = krb5_rd_cred(context, new_auth_ctx, inbuf,
+ &creds, NULL)))
+ goto cleanup;
+ }
if ((retval = krb5_cc_new_unique(context, "MEMORY", NULL, &ccache))) {
- ccache = NULL;
+ ccache = NULL;
goto cleanup;
}
if ((retval = krb5_cc_initialize(context, ccache, creds[0]->client)))
- goto cleanup;
+ goto cleanup;
if ((retval = krb5_cc_store_cred(context, ccache, creds[0])))
- goto cleanup;
+ goto cleanup;
/* generate a delegated credential handle */
if (out_cred) {
- /* allocate memory for a cred_t... */
- if (!(cred =
- (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec)))) {
- retval = ENOMEM; /* out of memory? */
- goto cleanup;
- }
-
- /* zero it out... */
- memset(cred, 0, sizeof(krb5_gss_cred_id_rec));
-
- retval = k5_mutex_init(&cred->lock);
- if (retval) {
- xfree(cred);
- cred = NULL;
- goto cleanup;
- }
-
- /* copy the client principle into it... */
- if ((retval =
- krb5_copy_principal(context, creds[0]->client, &(cred->princ)))) {
- k5_mutex_destroy(&cred->lock);
- retval = ENOMEM; /* out of memory? */
- xfree(cred); /* clean up memory on failure */
- cred = NULL;
- goto cleanup;
- }
-
- cred->usage = GSS_C_INITIATE; /* we can't accept with this */
- /* cred->princ already set */
- cred->prerfc_mech = 1; /* this cred will work with all three mechs */
- cred->rfc_mech = 1;
- cred->keytab = NULL; /* no keytab associated with this... */
- cred->tgt_expire = creds[0]->times.endtime; /* store the end time */
- cred->ccache = ccache; /* the ccache containing the credential */
- ccache = NULL; /* cred takes ownership so don't destroy */
+ /* allocate memory for a cred_t... */
+ if (!(cred =
+ (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec)))) {
+ retval = ENOMEM; /* out of memory? */
+ goto cleanup;
+ }
+
+ /* zero it out... */
+ memset(cred, 0, sizeof(krb5_gss_cred_id_rec));
+
+ retval = k5_mutex_init(&cred->lock);
+ if (retval) {
+ xfree(cred);
+ cred = NULL;
+ goto cleanup;
+ }
+
+ /* copy the client principle into it... */
+ if ((retval =
+ krb5_copy_principal(context, creds[0]->client, &(cred->princ)))) {
+ k5_mutex_destroy(&cred->lock);
+ retval = ENOMEM; /* out of memory? */
+ xfree(cred); /* clean up memory on failure */
+ cred = NULL;
+ goto cleanup;
+ }
+
+ cred->usage = GSS_C_INITIATE; /* we can't accept with this */
+ /* cred->princ already set */
+ cred->prerfc_mech = 1; /* this cred will work with all three mechs */
+ cred->rfc_mech = 1;
+ cred->keytab = NULL; /* no keytab associated with this... */
+ cred->tgt_expire = creds[0]->times.endtime; /* store the end time */
+ cred->ccache = ccache; /* the ccache containing the credential */
+ ccache = NULL; /* cred takes ownership so don't destroy */
}
/* If there were errors, there might have been a memory leak
@@ -193,16 +194,16 @@ rd_and_store_for_creds(context, auth_context, inbuf, out_cred)
*/
cleanup:
if (creds)
- krb5_free_tgt_creds(context, creds);
+ krb5_free_tgt_creds(context, creds);
if (ccache)
- (void)krb5_cc_destroy(context, ccache);
+ (void)krb5_cc_destroy(context, ccache);
if (out_cred)
- *out_cred = cred; /* return credential */
+ *out_cred = cred; /* return credential */
if (new_auth_ctx)
- krb5_auth_con_free(context, new_auth_ctx);
+ krb5_auth_con_free(context, new_auth_ctx);
krb5_auth_con_setflags(context, auth_context, flags_org);
@@ -211,286 +212,286 @@ cleanup:
OM_uint32
-krb5_gss_accept_sec_context(minor_status, context_handle,
- verifier_cred_handle, input_token,
- input_chan_bindings, src_name, mech_type,
- output_token, ret_flags, time_rec,
- delegated_cred_handle)
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_cred_id_t verifier_cred_handle;
- gss_buffer_t input_token;
- gss_channel_bindings_t input_chan_bindings;
- gss_name_t *src_name;
- gss_OID *mech_type;
- gss_buffer_t output_token;
- OM_uint32 *ret_flags;
- OM_uint32 *time_rec;
- gss_cred_id_t *delegated_cred_handle;
+krb5_gss_accept_sec_context(minor_status, context_handle,
+ verifier_cred_handle, input_token,
+ input_chan_bindings, src_name, mech_type,
+ output_token, ret_flags, time_rec,
+ delegated_cred_handle)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_cred_id_t verifier_cred_handle;
+ gss_buffer_t input_token;
+ gss_channel_bindings_t input_chan_bindings;
+ gss_name_t *src_name;
+ gss_OID *mech_type;
+ gss_buffer_t output_token;
+ OM_uint32 *ret_flags;
+ OM_uint32 *time_rec;
+ gss_cred_id_t *delegated_cred_handle;
{
- krb5_context context;
- unsigned char *ptr, *ptr2;
- char *sptr;
- long tmp;
- size_t md5len;
- int bigend;
- krb5_gss_cred_id_t cred = 0;
- krb5_data ap_rep, ap_req;
- unsigned int i;
- krb5_error_code code;
- krb5_address addr, *paddr;
- krb5_authenticator *authdat = 0;
- krb5_checksum reqcksum;
- krb5_principal name = NULL;
- krb5_ui_4 gss_flags = 0;
- int decode_req_message = 0;
- krb5_gss_ctx_id_rec *ctx = 0;
- krb5_timestamp now;
- gss_buffer_desc token;
- krb5_auth_context auth_context = NULL;
- krb5_ticket * ticket = NULL;
- int option_id;
- krb5_data option;
- const gss_OID_desc *mech_used = NULL;
- OM_uint32 major_status = GSS_S_FAILURE;
- OM_uint32 tmp_minor_status;
- krb5_error krb_error_data;
- krb5_data scratch;
- gss_cred_id_t cred_handle = NULL;
- krb5_gss_cred_id_t deleg_cred = NULL;
- krb5int_access kaccess;
- int cred_rcache = 0;
-
- code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
- if (code) {
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- /* set up returns to be freeable */
-
- if (src_name)
- *src_name = (gss_name_t) NULL;
- output_token->length = 0;
- output_token->value = NULL;
- token.value = 0;
- reqcksum.contents = 0;
- ap_req.data = 0;
- ap_rep.data = 0;
-
- if (mech_type)
- *mech_type = GSS_C_NULL_OID;
- /* return a bogus cred handle */
- if (delegated_cred_handle)
- *delegated_cred_handle = GSS_C_NO_CREDENTIAL;
-
- /*
- * Context handle must be unspecified. Actually, it must be
- * non-established, but currently, accept_sec_context never returns
- * a non-established context handle.
- */
- /*SUPPRESS 29*/
- if (*context_handle != GSS_C_NO_CONTEXT) {
- *minor_status = EINVAL;
- save_error_string(EINVAL, "accept_sec_context called with existing context handle");
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- /* handle default cred handle */
- if (verifier_cred_handle == GSS_C_NO_CREDENTIAL) {
- major_status = krb5_gss_acquire_cred(minor_status, GSS_C_NO_NAME,
- GSS_C_INDEFINITE, GSS_C_NO_OID_SET,
- GSS_C_ACCEPT, &cred_handle,
- NULL, NULL);
- if (major_status != GSS_S_COMPLETE) {
- code = *minor_status;
- goto fail;
- }
- } else {
- major_status = krb5_gss_validate_cred(minor_status,
- verifier_cred_handle);
- if (GSS_ERROR(major_status)) {
- code = *minor_status;
- goto fail;
- }
- cred_handle = verifier_cred_handle;
- }
-
- cred = (krb5_gss_cred_id_t) cred_handle;
-
- /* make sure the supplied credentials are valid for accept */
-
- if ((cred->usage != GSS_C_ACCEPT) &&
- (cred->usage != GSS_C_BOTH)) {
- code = 0;
- major_status = GSS_S_NO_CRED;
- goto fail;
- }
-
- /* verify the token's integrity, and leave the token in ap_req.
- figure out which mech oid was used, and save it */
-
- ptr = (unsigned char *) input_token->value;
-
- if (!(code = g_verify_token_header(gss_mech_krb5,
- &(ap_req.length),
- &ptr, KG_TOK_CTX_AP_REQ,
- input_token->length, 1))) {
- mech_used = gss_mech_krb5;
- } else if ((code == G_WRONG_MECH)
- &&!(code = g_verify_token_header((gss_OID) gss_mech_krb5_wrong,
- &(ap_req.length),
- &ptr, KG_TOK_CTX_AP_REQ,
- input_token->length, 1))) {
- mech_used = gss_mech_krb5_wrong;
- } else if ((code == G_WRONG_MECH) &&
- !(code = g_verify_token_header(gss_mech_krb5_old,
- &(ap_req.length),
- &ptr, KG_TOK_CTX_AP_REQ,
- input_token->length, 1))) {
- /*
- * Previous versions of this library used the old mech_id
- * and some broken behavior (wrong IV on checksum
- * encryption). We support the old mech_id for
- * compatibility, and use it to decide when to use the
- * old behavior.
- */
- mech_used = gss_mech_krb5_old;
- } else if (code == G_WRONG_TOKID) {
- major_status = GSS_S_CONTINUE_NEEDED;
- code = KRB5KRB_AP_ERR_MSG_TYPE;
- mech_used = gss_mech_krb5;
- goto fail;
- } else {
- major_status = GSS_S_DEFECTIVE_TOKEN;
- goto fail;
- }
-
- sptr = (char *) ptr;
- TREAD_STR(sptr, ap_req.data, ap_req.length);
- decode_req_message = 1;
-
- /* construct the sender_addr */
-
- if ((input_chan_bindings != GSS_C_NO_CHANNEL_BINDINGS) &&
- (input_chan_bindings->initiator_addrtype == GSS_C_AF_INET)) {
- /* XXX is this right? */
- addr.addrtype = ADDRTYPE_INET;
- addr.length = input_chan_bindings->initiator_address.length;
- addr.contents = input_chan_bindings->initiator_address.value;
-
- paddr = &addr;
- } else {
- paddr = NULL;
- }
-
- /* decode the AP_REQ message */
-
- /* decode the message */
-
- if ((code = krb5_auth_con_init(context, &auth_context))) {
- major_status = GSS_S_FAILURE;
- save_error_info(code, context);
- goto fail;
- }
- if (cred->rcache) {
- cred_rcache = 1;
- if ((code = krb5_auth_con_setrcache(context, auth_context, cred->rcache))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- }
- if ((code = krb5_auth_con_setaddrs(context, auth_context, NULL, paddr))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- if ((code = krb5_rd_req(context, &auth_context, &ap_req, cred->princ,
- cred->keytab, NULL, &ticket))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- krb5_auth_con_setflags(context, auth_context,
- KRB5_AUTH_CONTEXT_DO_SEQUENCE);
-
- krb5_auth_con_getauthenticator(context, auth_context, &authdat);
+ krb5_context context;
+ unsigned char *ptr, *ptr2;
+ char *sptr;
+ long tmp;
+ size_t md5len;
+ int bigend;
+ krb5_gss_cred_id_t cred = 0;
+ krb5_data ap_rep, ap_req;
+ unsigned int i;
+ krb5_error_code code;
+ krb5_address addr, *paddr;
+ krb5_authenticator *authdat = 0;
+ krb5_checksum reqcksum;
+ krb5_principal name = NULL;
+ krb5_ui_4 gss_flags = 0;
+ int decode_req_message = 0;
+ krb5_gss_ctx_id_rec *ctx = 0;
+ krb5_timestamp now;
+ gss_buffer_desc token;
+ krb5_auth_context auth_context = NULL;
+ krb5_ticket * ticket = NULL;
+ int option_id;
+ krb5_data option;
+ const gss_OID_desc *mech_used = NULL;
+ OM_uint32 major_status = GSS_S_FAILURE;
+ OM_uint32 tmp_minor_status;
+ krb5_error krb_error_data;
+ krb5_data scratch;
+ gss_cred_id_t cred_handle = NULL;
+ krb5_gss_cred_id_t deleg_cred = NULL;
+ krb5int_access kaccess;
+ int cred_rcache = 0;
+
+ code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
+ if (code) {
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ /* set up returns to be freeable */
+
+ if (src_name)
+ *src_name = (gss_name_t) NULL;
+ output_token->length = 0;
+ output_token->value = NULL;
+ token.value = 0;
+ reqcksum.contents = 0;
+ ap_req.data = 0;
+ ap_rep.data = 0;
+
+ if (mech_type)
+ *mech_type = GSS_C_NULL_OID;
+ /* return a bogus cred handle */
+ if (delegated_cred_handle)
+ *delegated_cred_handle = GSS_C_NO_CREDENTIAL;
+
+ /*
+ * Context handle must be unspecified. Actually, it must be
+ * non-established, but currently, accept_sec_context never returns
+ * a non-established context handle.
+ */
+ /*SUPPRESS 29*/
+ if (*context_handle != GSS_C_NO_CONTEXT) {
+ *minor_status = EINVAL;
+ save_error_string(EINVAL, "accept_sec_context called with existing context handle");
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ /* handle default cred handle */
+ if (verifier_cred_handle == GSS_C_NO_CREDENTIAL) {
+ major_status = krb5_gss_acquire_cred(minor_status, GSS_C_NO_NAME,
+ GSS_C_INDEFINITE, GSS_C_NO_OID_SET,
+ GSS_C_ACCEPT, &cred_handle,
+ NULL, NULL);
+ if (major_status != GSS_S_COMPLETE) {
+ code = *minor_status;
+ goto fail;
+ }
+ } else {
+ major_status = krb5_gss_validate_cred(minor_status,
+ verifier_cred_handle);
+ if (GSS_ERROR(major_status)) {
+ code = *minor_status;
+ goto fail;
+ }
+ cred_handle = verifier_cred_handle;
+ }
+
+ cred = (krb5_gss_cred_id_t) cred_handle;
+
+ /* make sure the supplied credentials are valid for accept */
+
+ if ((cred->usage != GSS_C_ACCEPT) &&
+ (cred->usage != GSS_C_BOTH)) {
+ code = 0;
+ major_status = GSS_S_NO_CRED;
+ goto fail;
+ }
+
+ /* verify the token's integrity, and leave the token in ap_req.
+ figure out which mech oid was used, and save it */
+
+ ptr = (unsigned char *) input_token->value;
+
+ if (!(code = g_verify_token_header(gss_mech_krb5,
+ &(ap_req.length),
+ &ptr, KG_TOK_CTX_AP_REQ,
+ input_token->length, 1))) {
+ mech_used = gss_mech_krb5;
+ } else if ((code == G_WRONG_MECH)
+ &&!(code = g_verify_token_header((gss_OID) gss_mech_krb5_wrong,
+ &(ap_req.length),
+ &ptr, KG_TOK_CTX_AP_REQ,
+ input_token->length, 1))) {
+ mech_used = gss_mech_krb5_wrong;
+ } else if ((code == G_WRONG_MECH) &&
+ !(code = g_verify_token_header(gss_mech_krb5_old,
+ &(ap_req.length),
+ &ptr, KG_TOK_CTX_AP_REQ,
+ input_token->length, 1))) {
+ /*
+ * Previous versions of this library used the old mech_id
+ * and some broken behavior (wrong IV on checksum
+ * encryption). We support the old mech_id for
+ * compatibility, and use it to decide when to use the
+ * old behavior.
+ */
+ mech_used = gss_mech_krb5_old;
+ } else if (code == G_WRONG_TOKID) {
+ major_status = GSS_S_CONTINUE_NEEDED;
+ code = KRB5KRB_AP_ERR_MSG_TYPE;
+ mech_used = gss_mech_krb5;
+ goto fail;
+ } else {
+ major_status = GSS_S_DEFECTIVE_TOKEN;
+ goto fail;
+ }
+
+ sptr = (char *) ptr;
+ TREAD_STR(sptr, ap_req.data, ap_req.length);
+ decode_req_message = 1;
+
+ /* construct the sender_addr */
+
+ if ((input_chan_bindings != GSS_C_NO_CHANNEL_BINDINGS) &&
+ (input_chan_bindings->initiator_addrtype == GSS_C_AF_INET)) {
+ /* XXX is this right? */
+ addr.addrtype = ADDRTYPE_INET;
+ addr.length = input_chan_bindings->initiator_address.length;
+ addr.contents = input_chan_bindings->initiator_address.value;
+
+ paddr = &addr;
+ } else {
+ paddr = NULL;
+ }
+
+ /* decode the AP_REQ message */
+
+ /* decode the message */
+
+ if ((code = krb5_auth_con_init(context, &auth_context))) {
+ major_status = GSS_S_FAILURE;
+ save_error_info(code, context);
+ goto fail;
+ }
+ if (cred->rcache) {
+ cred_rcache = 1;
+ if ((code = krb5_auth_con_setrcache(context, auth_context, cred->rcache))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
+ if ((code = krb5_auth_con_setaddrs(context, auth_context, NULL, paddr))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ if ((code = krb5_rd_req(context, &auth_context, &ap_req, cred->princ,
+ cred->keytab, NULL, &ticket))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ krb5_auth_con_setflags(context, auth_context,
+ KRB5_AUTH_CONTEXT_DO_SEQUENCE);
+
+ krb5_auth_con_getauthenticator(context, auth_context, &authdat);
#if 0
- /* make sure the necessary parts of the authdat are present */
-
- if ((authdat->authenticator->subkey == NULL) ||
- (authdat->ticket->enc_part2 == NULL)) {
- code = KG_NO_SUBKEY;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
+ /* make sure the necessary parts of the authdat are present */
+
+ if ((authdat->authenticator->subkey == NULL) ||
+ (authdat->ticket->enc_part2 == NULL)) {
+ code = KG_NO_SUBKEY;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
#endif
- {
- /* gss krb5 v1 */
+ {
+ /* gss krb5 v1 */
- /* stash this now, for later. */
- code = krb5_c_checksum_length(context, CKSUMTYPE_RSA_MD5, &md5len);
- if (code) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
+ /* stash this now, for later. */
+ code = krb5_c_checksum_length(context, CKSUMTYPE_RSA_MD5, &md5len);
+ if (code) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
- /* verify that the checksum is correct */
+ /* verify that the checksum is correct */
- /*
- The checksum may be either exactly 24 bytes, in which case
- no options are specified, or greater than 24 bytes, in which case
- one or more options are specified. Currently, the only valid
- option is KRB5_GSS_FOR_CREDS_OPTION ( = 1 ).
- */
+ /*
+ The checksum may be either exactly 24 bytes, in which case
+ no options are specified, or greater than 24 bytes, in which case
+ one or more options are specified. Currently, the only valid
+ option is KRB5_GSS_FOR_CREDS_OPTION ( = 1 ).
+ */
- if ((authdat->checksum->checksum_type != CKSUMTYPE_KG_CB) ||
- (authdat->checksum->length < 24)) {
- code = 0;
- major_status = GSS_S_BAD_BINDINGS;
- goto fail;
- }
+ if ((authdat->checksum->checksum_type != CKSUMTYPE_KG_CB) ||
+ (authdat->checksum->length < 24)) {
+ code = 0;
+ major_status = GSS_S_BAD_BINDINGS;
+ goto fail;
+ }
- /*
- "Be liberal in what you accept, and
- conservative in what you send"
- -- rfc1123
+ /*
+ "Be liberal in what you accept, and
+ conservative in what you send"
+ -- rfc1123
- This code will let this acceptor interoperate with an initiator
- using little-endian or big-endian integer encoding.
- */
+ This code will let this acceptor interoperate with an initiator
+ using little-endian or big-endian integer encoding.
+ */
- ptr = (unsigned char *) authdat->checksum->contents;
- bigend = 0;
+ ptr = (unsigned char *) authdat->checksum->contents;
+ bigend = 0;
- TREAD_INT(ptr, tmp, bigend);
+ TREAD_INT(ptr, tmp, bigend);
- if (tmp != md5len) {
- ptr = (unsigned char *) authdat->checksum->contents;
- bigend = 1;
+ if (tmp != md5len) {
+ ptr = (unsigned char *) authdat->checksum->contents;
+ bigend = 1;
- TREAD_INT(ptr, tmp, bigend);
+ TREAD_INT(ptr, tmp, bigend);
- if (tmp != md5len) {
- code = KG_BAD_LENGTH;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- }
+ if (tmp != md5len) {
+ code = KG_BAD_LENGTH;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
- /* at this point, bigend is set according to the initiator's
- byte order */
+ /* at this point, bigend is set according to the initiator's
+ byte order */
- /*
+ /*
The following section of code attempts to implement the
optional channel binding facility as described in RFC2743.
@@ -503,507 +504,506 @@ krb5_gss_accept_sec_context(minor_status, context_handle,
a checksum and compare against those provided by the
client. */
- if ((code = kg_checksum_channel_bindings(context,
- input_chan_bindings,
- &reqcksum, bigend))) {
- major_status = GSS_S_BAD_BINDINGS;
- goto fail;
- }
-
- /* Always read the clients bindings - eventhough we might ignore them */
- TREAD_STR(ptr, ptr2, reqcksum.length);
-
- if (input_chan_bindings != GSS_C_NO_CHANNEL_BINDINGS ) {
- if (memcmp(ptr2, reqcksum.contents, reqcksum.length) != 0) {
- xfree(reqcksum.contents);
- reqcksum.contents = 0;
- code = 0;
- major_status = GSS_S_BAD_BINDINGS;
- goto fail;
- }
-
- }
-
- xfree(reqcksum.contents);
- reqcksum.contents = 0;
-
- TREAD_INT(ptr, gss_flags, bigend);
+ if ((code = kg_checksum_channel_bindings(context,
+ input_chan_bindings,
+ &reqcksum, bigend))) {
+ major_status = GSS_S_BAD_BINDINGS;
+ goto fail;
+ }
+
+ /* Always read the clients bindings - eventhough we might ignore them */
+ TREAD_STR(ptr, ptr2, reqcksum.length);
+
+ if (input_chan_bindings != GSS_C_NO_CHANNEL_BINDINGS ) {
+ if (memcmp(ptr2, reqcksum.contents, reqcksum.length) != 0) {
+ xfree(reqcksum.contents);
+ reqcksum.contents = 0;
+ code = 0;
+ major_status = GSS_S_BAD_BINDINGS;
+ goto fail;
+ }
+
+ }
+
+ xfree(reqcksum.contents);
+ reqcksum.contents = 0;
+
+ TREAD_INT(ptr, gss_flags, bigend);
#if 0
- gss_flags &= ~GSS_C_DELEG_FLAG; /* mask out the delegation flag; if
- there's a delegation, we'll set
- it below */
+ gss_flags &= ~GSS_C_DELEG_FLAG; /* mask out the delegation flag; if
+ there's a delegation, we'll set
+ it below */
#endif
- decode_req_message = 0;
+ decode_req_message = 0;
- /* if the checksum length > 24, there are options to process */
+ /* if the checksum length > 24, there are options to process */
- if(authdat->checksum->length > 24 && (gss_flags & GSS_C_DELEG_FLAG)) {
+ if(authdat->checksum->length > 24 && (gss_flags & GSS_C_DELEG_FLAG)) {
- i = authdat->checksum->length - 24;
+ i = authdat->checksum->length - 24;
- if (i >= 4) {
+ if (i >= 4) {
- TREAD_INT16(ptr, option_id, bigend);
+ TREAD_INT16(ptr, option_id, bigend);
- TREAD_INT16(ptr, option.length, bigend);
+ TREAD_INT16(ptr, option.length, bigend);
- i -= 4;
+ i -= 4;
- if (i < option.length || option.length < 0) {
- code = KG_BAD_LENGTH;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
+ if (i < option.length || option.length < 0) {
+ code = KG_BAD_LENGTH;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
- /* have to use ptr2, since option.data is wrong type and
- macro uses ptr as both lvalue and rvalue */
+ /* have to use ptr2, since option.data is wrong type and
+ macro uses ptr as both lvalue and rvalue */
- TREAD_STR(ptr, ptr2, option.length);
- option.data = (char *) ptr2;
+ TREAD_STR(ptr, ptr2, option.length);
+ option.data = (char *) ptr2;
- i -= option.length;
+ i -= option.length;
- if (option_id != KRB5_GSS_FOR_CREDS_OPTION) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
+ if (option_id != KRB5_GSS_FOR_CREDS_OPTION) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
- /* store the delegated credential */
+ /* store the delegated credential */
- code = rd_and_store_for_creds(context, auth_context, &option,
- (delegated_cred_handle) ?
- &deleg_cred : NULL);
- if (code) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
+ code = rd_and_store_for_creds(context, auth_context, &option,
+ (delegated_cred_handle) ?
+ &deleg_cred : NULL);
+ if (code) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
- } /* if i >= 4 */
- /* ignore any additional trailing data, for now */
+ } /* if i >= 4 */
+ /* ignore any additional trailing data, for now */
#ifdef CFX_EXERCISE
- {
- FILE *f = fopen("/tmp/gsslog", "a");
- if (f) {
- fprintf(f,
- "initial context token with delegation, %d extra bytes\n",
- i);
- fclose(f);
- }
- }
+ {
+ FILE *f = fopen("/tmp/gsslog", "a");
+ if (f) {
+ fprintf(f,
+ "initial context token with delegation, %d extra bytes\n",
+ i);
+ fclose(f);
+ }
+ }
#endif
- } else {
+ } else {
#ifdef CFX_EXERCISE
- {
- FILE *f = fopen("/tmp/gsslog", "a");
- if (f) {
- if (gss_flags & GSS_C_DELEG_FLAG)
- fprintf(f,
- "initial context token, delegation flag but too small\n");
- else
- /* no deleg flag, length might still be too big */
- fprintf(f,
- "initial context token, %d extra bytes\n",
- authdat->checksum->length - 24);
- fclose(f);
- }
- }
+ {
+ FILE *f = fopen("/tmp/gsslog", "a");
+ if (f) {
+ if (gss_flags & GSS_C_DELEG_FLAG)
+ fprintf(f,
+ "initial context token, delegation flag but too small\n");
+ else
+ /* no deleg flag, length might still be too big */
+ fprintf(f,
+ "initial context token, %d extra bytes\n",
+ authdat->checksum->length - 24);
+ fclose(f);
+ }
+ }
#endif
- }
- }
-
- /* create the ctx struct and start filling it in */
-
- if ((ctx = (krb5_gss_ctx_id_rec *) xmalloc(sizeof(krb5_gss_ctx_id_rec)))
- == NULL) {
- code = ENOMEM;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
- ctx->mech_used = (gss_OID) mech_used;
- ctx->auth_context = auth_context;
- ctx->initiate = 0;
- ctx->gss_flags = (GSS_C_TRANS_FLAG |
- ((gss_flags) & (GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG |
- GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG |
- GSS_C_SEQUENCE_FLAG | GSS_C_DELEG_FLAG)));
- ctx->seed_init = 0;
- ctx->big_endian = bigend;
- ctx->cred_rcache = cred_rcache;
-
- /* Intern the ctx pointer so that delete_sec_context works */
- if (! kg_save_ctx_id((gss_ctx_id_t) ctx)) {
- xfree(ctx);
- ctx = 0;
-
- code = G_VALIDATE_FAILED;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- if ((code = krb5_copy_principal(context, ticket->server, &ctx->here))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- if ((code = krb5_copy_principal(context, authdat->client, &ctx->there))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- if ((code = krb5_auth_con_getrecvsubkey(context, auth_context,
- &ctx->subkey))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- /* use the session key if the subkey isn't present */
-
- if (ctx->subkey == NULL) {
- if ((code = krb5_auth_con_getkey(context, auth_context,
- &ctx->subkey))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- }
-
- if (ctx->subkey == NULL) {
- /* this isn't a very good error, but it's not clear to me this
- can actually happen */
- major_status = GSS_S_FAILURE;
- code = KRB5KDC_ERR_NULL_KEY;
- goto fail;
- }
-
- ctx->proto = 0;
- switch(ctx->subkey->enctype) {
- case ENCTYPE_DES_CBC_MD5:
- case ENCTYPE_DES_CBC_CRC:
- ctx->subkey->enctype = ENCTYPE_DES_CBC_RAW;
- ctx->signalg = SGN_ALG_DES_MAC_MD5;
- ctx->cksum_size = 8;
- ctx->sealalg = SEAL_ALG_DES;
-
- /* fill in the encryption descriptors */
-
- if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- for (i=0; i<ctx->enc->length; i++)
- /*SUPPRESS 113*/
- ctx->enc->contents[i] ^= 0xf0;
-
- goto copy_subkey_to_seq;
-
- case ENCTYPE_DES3_CBC_SHA1:
- ctx->subkey->enctype = ENCTYPE_DES3_CBC_RAW;
- ctx->signalg = SGN_ALG_HMAC_SHA1_DES3_KD;
- ctx->cksum_size = 20;
- ctx->sealalg = SEAL_ALG_DES3KD;
-
- /* fill in the encryption descriptors */
- copy_subkey:
- if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- copy_subkey_to_seq:
- if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->seq))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- break;
-
- case ENCTYPE_ARCFOUR_HMAC:
- ctx->signalg = SGN_ALG_HMAC_MD5 ;
- ctx->cksum_size = 8;
- ctx->sealalg = SEAL_ALG_MICROSOFT_RC4 ;
- goto copy_subkey;
-
- default:
- ctx->signalg = -1;
- ctx->sealalg = -1;
- ctx->proto = 1;
- code = (*kaccess.krb5int_c_mandatory_cksumtype)(context, ctx->subkey->enctype,
- &ctx->cksumtype);
- if (code)
- goto fail;
- code = krb5_c_checksum_length(context, ctx->cksumtype,
- &ctx->cksum_size);
- if (code)
- goto fail;
- ctx->have_acceptor_subkey = 0;
- goto copy_subkey;
- }
-
- ctx->endtime = ticket->enc_part2->times.endtime;
- ctx->krb_flags = ticket->enc_part2->flags;
-
- krb5_free_ticket(context, ticket); /* Done with ticket */
-
- {
- krb5_ui_4 seq_temp;
- krb5_auth_con_getremoteseqnumber(context, auth_context, &seq_temp);
- ctx->seq_recv = seq_temp;
- }
-
- if ((code = krb5_timeofday(context, &now))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- if (ctx->endtime < now) {
- code = 0;
- major_status = GSS_S_CREDENTIALS_EXPIRED;
- goto fail;
- }
-
- g_order_init(&(ctx->seqstate), ctx->seq_recv,
- (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
- (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) != 0, ctx->proto);
-
- /* at this point, the entire context structure is filled in,
- so it can be released. */
-
- /* generate an AP_REP if necessary */
-
- if (ctx->gss_flags & GSS_C_MUTUAL_FLAG) {
- unsigned char * ptr3;
- krb5_ui_4 seq_temp;
- int cfx_generate_subkey;
-
- if (ctx->proto == 1)
- cfx_generate_subkey = CFX_ACCEPTOR_SUBKEY;
- else
- cfx_generate_subkey = 0;
-
- if (cfx_generate_subkey) {
- krb5_int32 acflags;
- code = krb5_auth_con_getflags(context, auth_context, &acflags);
- if (code == 0) {
- acflags |= KRB5_AUTH_CONTEXT_USE_SUBKEY;
- code = krb5_auth_con_setflags(context, auth_context, acflags);
- }
- if (code) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- }
-
- if ((code = krb5_mk_rep(context, auth_context, &ap_rep))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
-
- krb5_auth_con_getlocalseqnumber(context, auth_context, &seq_temp);
- ctx->seq_send = seq_temp & 0xffffffffL;
-
- if (cfx_generate_subkey) {
- /* Get the new acceptor subkey. With the code above, there
- should always be one if we make it to this point. */
- code = krb5_auth_con_getsendsubkey(context, auth_context,
- &ctx->acceptor_subkey);
- if (code != 0) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- code = (*kaccess.krb5int_c_mandatory_cksumtype)(context,
- ctx->acceptor_subkey->enctype,
- &ctx->acceptor_subkey_cksumtype);
- if (code) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- ctx->have_acceptor_subkey = 1;
- }
-
- /* the reply token hasn't been sent yet, but that's ok. */
- ctx->gss_flags |= GSS_C_PROT_READY_FLAG;
- ctx->established = 1;
-
- token.length = g_token_size(mech_used, ap_rep.length);
-
- if ((token.value = (unsigned char *) xmalloc(token.length))
- == NULL) {
- major_status = GSS_S_FAILURE;
- code = ENOMEM;
- goto fail;
- }
- ptr3 = token.value;
- g_make_token_header(mech_used, ap_rep.length,
- &ptr3, KG_TOK_CTX_AP_REP);
-
- TWRITE_STR(ptr3, ap_rep.data, ap_rep.length);
-
- ctx->established = 1;
-
- } else {
- token.length = 0;
- token.value = NULL;
- ctx->seq_send = ctx->seq_recv;
-
- ctx->established = 1;
- }
-
- /* set the return arguments */
-
- if (src_name) {
- if ((code = krb5_copy_principal(context, ctx->there, &name))) {
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- /* intern the src_name */
- if (! kg_save_name((gss_name_t) name)) {
- code = G_VALIDATE_FAILED;
- major_status = GSS_S_FAILURE;
- goto fail;
- }
- }
-
- if (mech_type)
- *mech_type = (gss_OID) mech_used;
-
- if (time_rec)
- *time_rec = ctx->endtime - now;
-
- if (ret_flags)
- *ret_flags = ctx->gss_flags;
-
- *context_handle = (gss_ctx_id_t)ctx;
- *output_token = token;
-
- if (src_name)
- *src_name = (gss_name_t) name;
-
- if (delegated_cred_handle && deleg_cred) {
- if (!kg_save_cred_id((gss_cred_id_t) deleg_cred)) {
- major_status = GSS_S_FAILURE;
- code = G_VALIDATE_FAILED;
- goto fail;
- }
-
- *delegated_cred_handle = (gss_cred_id_t) deleg_cred;
- }
-
- /* finally! */
-
- *minor_status = 0;
- major_status = GSS_S_COMPLETE;
-
- fail:
- if (authdat)
- krb5_free_authenticator(context, authdat);
- /* The ctx structure has the handle of the auth_context */
- if (auth_context && !ctx) {
- if (cred_rcache)
- (void)krb5_auth_con_setrcache(context, auth_context, NULL);
-
- krb5_auth_con_free(context, auth_context);
- }
- if (reqcksum.contents)
- xfree(reqcksum.contents);
- if (ap_rep.data)
- krb5_free_data_contents(context, &ap_rep);
-
- if (!GSS_ERROR(major_status) && major_status != GSS_S_CONTINUE_NEEDED) {
- ctx->k5_context = context;
- context = NULL;
- goto done;
- }
-
- /* from here on is the real "fail" code */
-
- if (ctx)
- (void) krb5_gss_delete_sec_context(&tmp_minor_status,
- (gss_ctx_id_t *) &ctx, NULL);
- if (deleg_cred) { /* free memory associated with the deleg credential */
- if (deleg_cred->ccache)
- (void)krb5_cc_close(context, deleg_cred->ccache);
- if (deleg_cred->princ)
- krb5_free_principal(context, deleg_cred->princ);
- xfree(deleg_cred);
- }
- if (token.value)
- xfree(token.value);
- if (name) {
- (void) kg_delete_name((gss_name_t) name);
- krb5_free_principal(context, name);
- }
-
- *minor_status = code;
-
- /*
- * If decode_req_message is set, then we need to decode the ap_req
- * message to determine whether or not to send a response token.
- * We need to do this because for some errors we won't be able to
- * decode the authenticator to read out the gss_flags field.
- */
- if (decode_req_message) {
- krb5_ap_req * request;
-
- if (decode_krb5_ap_req(&ap_req, &request))
- goto done;
-
- if (request->ap_options & AP_OPTS_MUTUAL_REQUIRED)
- gss_flags |= GSS_C_MUTUAL_FLAG;
- krb5_free_ap_req(context, request);
- }
-
- if (cred
- && ((gss_flags & GSS_C_MUTUAL_FLAG)
- || (major_status == GSS_S_CONTINUE_NEEDED))) {
- unsigned int tmsglen;
- int toktype;
-
- /*
- * The client is expecting a response, so we can send an
- * error token back
- */
- memset(&krb_error_data, 0, sizeof(krb_error_data));
-
- code -= ERROR_TABLE_BASE_krb5;
- if (code < 0 || code > 128)
- code = 60 /* KRB_ERR_GENERIC */;
-
- krb_error_data.error = code;
- (void) krb5_us_timeofday(context, &krb_error_data.stime,
- &krb_error_data.susec);
- krb_error_data.server = cred->princ;
-
- code = krb5_mk_error(context, &krb_error_data, &scratch);
- if (code)
- goto done;
-
- tmsglen = scratch.length;
- toktype = KG_TOK_CTX_ERROR;
-
- token.length = g_token_size(mech_used, tmsglen);
- token.value = (unsigned char *) xmalloc(token.length);
- if (!token.value)
- goto done;
-
- ptr = token.value;
- g_make_token_header(mech_used, tmsglen, &ptr, toktype);
-
- TWRITE_STR(ptr, scratch.data, scratch.length);
- krb5_free_data_contents(context, &scratch);
-
- *output_token = token;
- }
-
- done:
- if (!verifier_cred_handle && cred_handle) {
- krb5_gss_release_cred(&tmp_minor_status, &cred_handle);
- }
- if (context) {
- if (major_status && *minor_status)
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- }
- return (major_status);
+ }
+ }
+
+ /* create the ctx struct and start filling it in */
+
+ if ((ctx = (krb5_gss_ctx_id_rec *) xmalloc(sizeof(krb5_gss_ctx_id_rec)))
+ == NULL) {
+ code = ENOMEM;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
+ ctx->mech_used = (gss_OID) mech_used;
+ ctx->auth_context = auth_context;
+ ctx->initiate = 0;
+ ctx->gss_flags = (GSS_C_TRANS_FLAG |
+ ((gss_flags) & (GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG |
+ GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG |
+ GSS_C_SEQUENCE_FLAG | GSS_C_DELEG_FLAG)));
+ ctx->seed_init = 0;
+ ctx->big_endian = bigend;
+ ctx->cred_rcache = cred_rcache;
+
+ /* Intern the ctx pointer so that delete_sec_context works */
+ if (! kg_save_ctx_id((gss_ctx_id_t) ctx)) {
+ xfree(ctx);
+ ctx = 0;
+
+ code = G_VALIDATE_FAILED;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ if ((code = krb5_copy_principal(context, ticket->server, &ctx->here))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ if ((code = krb5_copy_principal(context, authdat->client, &ctx->there))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ if ((code = krb5_auth_con_getrecvsubkey(context, auth_context,
+ &ctx->subkey))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ /* use the session key if the subkey isn't present */
+
+ if (ctx->subkey == NULL) {
+ if ((code = krb5_auth_con_getkey(context, auth_context,
+ &ctx->subkey))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
+
+ if (ctx->subkey == NULL) {
+ /* this isn't a very good error, but it's not clear to me this
+ can actually happen */
+ major_status = GSS_S_FAILURE;
+ code = KRB5KDC_ERR_NULL_KEY;
+ goto fail;
+ }
+
+ ctx->proto = 0;
+ switch(ctx->subkey->enctype) {
+ case ENCTYPE_DES_CBC_MD5:
+ case ENCTYPE_DES_CBC_CRC:
+ ctx->subkey->enctype = ENCTYPE_DES_CBC_RAW;
+ ctx->signalg = SGN_ALG_DES_MAC_MD5;
+ ctx->cksum_size = 8;
+ ctx->sealalg = SEAL_ALG_DES;
+
+ /* fill in the encryption descriptors */
+
+ if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ for (i=0; i<ctx->enc->length; i++)
+ /*SUPPRESS 113*/
+ ctx->enc->contents[i] ^= 0xf0;
+
+ goto copy_subkey_to_seq;
+
+ case ENCTYPE_DES3_CBC_SHA1:
+ ctx->subkey->enctype = ENCTYPE_DES3_CBC_RAW;
+ ctx->signalg = SGN_ALG_HMAC_SHA1_DES3_KD;
+ ctx->cksum_size = 20;
+ ctx->sealalg = SEAL_ALG_DES3KD;
+
+ /* fill in the encryption descriptors */
+ copy_subkey:
+ if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ copy_subkey_to_seq:
+ if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->seq))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ break;
+
+ case ENCTYPE_ARCFOUR_HMAC:
+ ctx->signalg = SGN_ALG_HMAC_MD5 ;
+ ctx->cksum_size = 8;
+ ctx->sealalg = SEAL_ALG_MICROSOFT_RC4 ;
+ goto copy_subkey;
+
+ default:
+ ctx->signalg = -1;
+ ctx->sealalg = -1;
+ ctx->proto = 1;
+ code = (*kaccess.krb5int_c_mandatory_cksumtype)(context, ctx->subkey->enctype,
+ &ctx->cksumtype);
+ if (code)
+ goto fail;
+ code = krb5_c_checksum_length(context, ctx->cksumtype,
+ &ctx->cksum_size);
+ if (code)
+ goto fail;
+ ctx->have_acceptor_subkey = 0;
+ goto copy_subkey;
+ }
+
+ ctx->endtime = ticket->enc_part2->times.endtime;
+ ctx->krb_flags = ticket->enc_part2->flags;
+
+ krb5_free_ticket(context, ticket); /* Done with ticket */
+
+ {
+ krb5_ui_4 seq_temp;
+ krb5_auth_con_getremoteseqnumber(context, auth_context, &seq_temp);
+ ctx->seq_recv = seq_temp;
+ }
+
+ if ((code = krb5_timeofday(context, &now))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ if (ctx->endtime < now) {
+ code = 0;
+ major_status = GSS_S_CREDENTIALS_EXPIRED;
+ goto fail;
+ }
+
+ g_order_init(&(ctx->seqstate), ctx->seq_recv,
+ (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
+ (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) != 0, ctx->proto);
+
+ /* at this point, the entire context structure is filled in,
+ so it can be released. */
+
+ /* generate an AP_REP if necessary */
+
+ if (ctx->gss_flags & GSS_C_MUTUAL_FLAG) {
+ unsigned char * ptr3;
+ krb5_ui_4 seq_temp;
+ int cfx_generate_subkey;
+
+ if (ctx->proto == 1)
+ cfx_generate_subkey = CFX_ACCEPTOR_SUBKEY;
+ else
+ cfx_generate_subkey = 0;
+
+ if (cfx_generate_subkey) {
+ krb5_int32 acflags;
+ code = krb5_auth_con_getflags(context, auth_context, &acflags);
+ if (code == 0) {
+ acflags |= KRB5_AUTH_CONTEXT_USE_SUBKEY;
+ code = krb5_auth_con_setflags(context, auth_context, acflags);
+ }
+ if (code) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
+
+ if ((code = krb5_mk_rep(context, auth_context, &ap_rep))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+
+ krb5_auth_con_getlocalseqnumber(context, auth_context, &seq_temp);
+ ctx->seq_send = seq_temp & 0xffffffffL;
+
+ if (cfx_generate_subkey) {
+ /* Get the new acceptor subkey. With the code above, there
+ should always be one if we make it to this point. */
+ code = krb5_auth_con_getsendsubkey(context, auth_context,
+ &ctx->acceptor_subkey);
+ if (code != 0) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ code = (*kaccess.krb5int_c_mandatory_cksumtype)(context,
+ ctx->acceptor_subkey->enctype,
+ &ctx->acceptor_subkey_cksumtype);
+ if (code) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ ctx->have_acceptor_subkey = 1;
+ }
+
+ /* the reply token hasn't been sent yet, but that's ok. */
+ ctx->gss_flags |= GSS_C_PROT_READY_FLAG;
+ ctx->established = 1;
+
+ token.length = g_token_size(mech_used, ap_rep.length);
+
+ if ((token.value = (unsigned char *) xmalloc(token.length))
+ == NULL) {
+ major_status = GSS_S_FAILURE;
+ code = ENOMEM;
+ goto fail;
+ }
+ ptr3 = token.value;
+ g_make_token_header(mech_used, ap_rep.length,
+ &ptr3, KG_TOK_CTX_AP_REP);
+
+ TWRITE_STR(ptr3, ap_rep.data, ap_rep.length);
+
+ ctx->established = 1;
+
+ } else {
+ token.length = 0;
+ token.value = NULL;
+ ctx->seq_send = ctx->seq_recv;
+
+ ctx->established = 1;
+ }
+
+ /* set the return arguments */
+
+ if (src_name) {
+ if ((code = krb5_copy_principal(context, ctx->there, &name))) {
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ /* intern the src_name */
+ if (! kg_save_name((gss_name_t) name)) {
+ code = G_VALIDATE_FAILED;
+ major_status = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
+
+ if (mech_type)
+ *mech_type = (gss_OID) mech_used;
+
+ if (time_rec)
+ *time_rec = ctx->endtime - now;
+
+ if (ret_flags)
+ *ret_flags = ctx->gss_flags;
+
+ *context_handle = (gss_ctx_id_t)ctx;
+ *output_token = token;
+
+ if (src_name)
+ *src_name = (gss_name_t) name;
+
+ if (delegated_cred_handle && deleg_cred) {
+ if (!kg_save_cred_id((gss_cred_id_t) deleg_cred)) {
+ major_status = GSS_S_FAILURE;
+ code = G_VALIDATE_FAILED;
+ goto fail;
+ }
+
+ *delegated_cred_handle = (gss_cred_id_t) deleg_cred;
+ }
+
+ /* finally! */
+
+ *minor_status = 0;
+ major_status = GSS_S_COMPLETE;
+
+fail:
+ if (authdat)
+ krb5_free_authenticator(context, authdat);
+ /* The ctx structure has the handle of the auth_context */
+ if (auth_context && !ctx) {
+ if (cred_rcache)
+ (void)krb5_auth_con_setrcache(context, auth_context, NULL);
+
+ krb5_auth_con_free(context, auth_context);
+ }
+ if (reqcksum.contents)
+ xfree(reqcksum.contents);
+ if (ap_rep.data)
+ krb5_free_data_contents(context, &ap_rep);
+
+ if (!GSS_ERROR(major_status) && major_status != GSS_S_CONTINUE_NEEDED) {
+ ctx->k5_context = context;
+ context = NULL;
+ goto done;
+ }
+
+ /* from here on is the real "fail" code */
+
+ if (ctx)
+ (void) krb5_gss_delete_sec_context(&tmp_minor_status,
+ (gss_ctx_id_t *) &ctx, NULL);
+ if (deleg_cred) { /* free memory associated with the deleg credential */
+ if (deleg_cred->ccache)
+ (void)krb5_cc_close(context, deleg_cred->ccache);
+ if (deleg_cred->princ)
+ krb5_free_principal(context, deleg_cred->princ);
+ xfree(deleg_cred);
+ }
+ if (token.value)
+ xfree(token.value);
+ if (name) {
+ (void) kg_delete_name((gss_name_t) name);
+ krb5_free_principal(context, name);
+ }
+
+ *minor_status = code;
+
+ /*
+ * If decode_req_message is set, then we need to decode the ap_req
+ * message to determine whether or not to send a response token.
+ * We need to do this because for some errors we won't be able to
+ * decode the authenticator to read out the gss_flags field.
+ */
+ if (decode_req_message) {
+ krb5_ap_req * request;
+
+ if (decode_krb5_ap_req(&ap_req, &request))
+ goto done;
+
+ if (request->ap_options & AP_OPTS_MUTUAL_REQUIRED)
+ gss_flags |= GSS_C_MUTUAL_FLAG;
+ krb5_free_ap_req(context, request);
+ }
+
+ if (cred
+ && ((gss_flags & GSS_C_MUTUAL_FLAG)
+ || (major_status == GSS_S_CONTINUE_NEEDED))) {
+ unsigned int tmsglen;
+ int toktype;
+
+ /*
+ * The client is expecting a response, so we can send an
+ * error token back
+ */
+ memset(&krb_error_data, 0, sizeof(krb_error_data));
+
+ code -= ERROR_TABLE_BASE_krb5;
+ if (code < 0 || code > 128)
+ code = 60 /* KRB_ERR_GENERIC */;
+
+ krb_error_data.error = code;
+ (void) krb5_us_timeofday(context, &krb_error_data.stime,
+ &krb_error_data.susec);
+ krb_error_data.server = cred->princ;
+
+ code = krb5_mk_error(context, &krb_error_data, &scratch);
+ if (code)
+ goto done;
+
+ tmsglen = scratch.length;
+ toktype = KG_TOK_CTX_ERROR;
+
+ token.length = g_token_size(mech_used, tmsglen);
+ token.value = (unsigned char *) xmalloc(token.length);
+ if (!token.value)
+ goto done;
+
+ ptr = token.value;
+ g_make_token_header(mech_used, tmsglen, &ptr, toktype);
+
+ TWRITE_STR(ptr, scratch.data, scratch.length);
+ krb5_free_data_contents(context, &scratch);
+
+ *output_token = token;
+ }
+
+done:
+ if (!verifier_cred_handle && cred_handle) {
+ krb5_gss_release_cred(&tmp_minor_status, &cred_handle);
+ }
+ if (context) {
+ if (major_status && *minor_status)
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ }
+ return (major_status);
}
#endif /* LEAN_CLIENT */
-
diff --git a/src/lib/gssapi/krb5/acquire_cred.c b/src/lib/gssapi/krb5/acquire_cred.c
index a36dfe060f..daf899223a 100644
--- a/src/lib/gssapi/krb5/acquire_cred.c
+++ b/src/lib/gssapi/krb5/acquire_cred.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000, 2007, 2008 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -46,14 +47,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -64,7 +65,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -104,590 +105,590 @@ krb5_gss_register_acceptor_identity(const char *keytab)
err = gssint_initialize_library();
if (err != 0)
- return GSS_S_FAILURE;
+ return GSS_S_FAILURE;
if (keytab == NULL)
- return GSS_S_FAILURE;
+ return GSS_S_FAILURE;
new = strdup(keytab);
if (new == NULL)
- return GSS_S_FAILURE;
+ return GSS_S_FAILURE;
err = k5_mutex_lock(&gssint_krb5_keytab_lock);
if (err) {
- free(new);
- return GSS_S_FAILURE;
+ free(new);
+ return GSS_S_FAILURE;
}
old = krb5_gss_keytab;
krb5_gss_keytab = new;
k5_mutex_unlock(&gssint_krb5_keytab_lock);
if (old != NULL)
- free(old);
+ free(old);
return GSS_S_COMPLETE;
}
/* get credentials corresponding to a key in the krb5 keytab.
If the default name is requested, return the name in output_princ.
- If output_princ is non-NULL, the caller will use or free it, regardless
- of the return value.
+ If output_princ is non-NULL, the caller will use or free it, regardless
+ of the return value.
If successful, set the keytab-specific fields in cred
- */
+*/
-static OM_uint32
+static OM_uint32
acquire_accept_cred(context, minor_status, desired_name, output_princ, cred)
- krb5_context context;
- OM_uint32 *minor_status;
- gss_name_t desired_name;
- krb5_principal *output_princ;
- krb5_gss_cred_id_rec *cred;
+ krb5_context context;
+ OM_uint32 *minor_status;
+ gss_name_t desired_name;
+ krb5_principal *output_princ;
+ krb5_gss_cred_id_rec *cred;
{
- krb5_error_code code;
- krb5_principal princ;
- krb5_keytab kt;
- krb5_keytab_entry entry;
-
- *output_princ = NULL;
- cred->keytab = NULL;
-
- /* open the default keytab */
-
- code = gssint_initialize_library();
- if (code != 0) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
- code = k5_mutex_lock(&gssint_krb5_keytab_lock);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
- if (krb5_gss_keytab != NULL) {
- code = krb5_kt_resolve(context, krb5_gss_keytab, &kt);
- k5_mutex_unlock(&gssint_krb5_keytab_lock);
- } else {
- k5_mutex_unlock(&gssint_krb5_keytab_lock);
- code = krb5_kt_default(context, &kt);
- }
-
- if (code) {
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
-
- if (desired_name != GSS_C_NO_NAME) {
- princ = (krb5_principal) desired_name;
- if ((code = krb5_kt_get_entry(context, kt, princ, 0, 0, &entry))) {
- (void) krb5_kt_close(context, kt);
- if (code == KRB5_KT_NOTFOUND) {
- char *errstr = krb5_get_error_message(context, code);
- krb5_set_error_message(context, KG_KEYTAB_NOMATCH, "%s", errstr);
- krb5_free_error_message(context, errstr);
- *minor_status = KG_KEYTAB_NOMATCH;
- } else
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
- krb5_kt_free_entry(context, &entry);
-
- /* Open the replay cache for this principal. */
- if ((code = krb5_get_server_rcache(context,
- krb5_princ_component(context, princ, 0),
- &cred->rcache))) {
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- }
+ krb5_error_code code;
+ krb5_principal princ;
+ krb5_keytab kt;
+ krb5_keytab_entry entry;
+
+ *output_princ = NULL;
+ cred->keytab = NULL;
+
+ /* open the default keytab */
+
+ code = gssint_initialize_library();
+ if (code != 0) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+ code = k5_mutex_lock(&gssint_krb5_keytab_lock);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+ if (krb5_gss_keytab != NULL) {
+ code = krb5_kt_resolve(context, krb5_gss_keytab, &kt);
+ k5_mutex_unlock(&gssint_krb5_keytab_lock);
+ } else {
+ k5_mutex_unlock(&gssint_krb5_keytab_lock);
+ code = krb5_kt_default(context, &kt);
+ }
+
+ if (code) {
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+
+ if (desired_name != GSS_C_NO_NAME) {
+ princ = (krb5_principal) desired_name;
+ if ((code = krb5_kt_get_entry(context, kt, princ, 0, 0, &entry))) {
+ (void) krb5_kt_close(context, kt);
+ if (code == KRB5_KT_NOTFOUND) {
+ char *errstr = krb5_get_error_message(context, code);
+ krb5_set_error_message(context, KG_KEYTAB_NOMATCH, "%s", errstr);
+ krb5_free_error_message(context, errstr);
+ *minor_status = KG_KEYTAB_NOMATCH;
+ } else
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+ krb5_kt_free_entry(context, &entry);
+
+ /* Open the replay cache for this principal. */
+ if ((code = krb5_get_server_rcache(context,
+ krb5_princ_component(context, princ, 0),
+ &cred->rcache))) {
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ }
/* hooray. we made it */
- cred->keytab = kt;
+ cred->keytab = kt;
- return(GSS_S_COMPLETE);
+ return(GSS_S_COMPLETE);
}
#endif /* LEAN_CLIENT */
/* get credentials corresponding to the default credential cache.
If the default name is requested, return the name in output_princ.
- If output_princ is non-NULL, the caller will use or free it, regardless
- of the return value.
+ If output_princ is non-NULL, the caller will use or free it, regardless
+ of the return value.
If successful, set the ccache-specific fields in cred.
- */
+*/
-static OM_uint32
+static OM_uint32
acquire_init_cred(context, minor_status, desired_name, output_princ, cred)
- krb5_context context;
- OM_uint32 *minor_status;
- gss_name_t desired_name;
- krb5_principal *output_princ;
- krb5_gss_cred_id_rec *cred;
+ krb5_context context;
+ OM_uint32 *minor_status;
+ gss_name_t desired_name;
+ krb5_principal *output_princ;
+ krb5_gss_cred_id_rec *cred;
{
- krb5_error_code code;
- krb5_ccache ccache;
- krb5_principal princ, tmp_princ;
- krb5_flags flags;
- krb5_cc_cursor cur;
- krb5_creds creds;
- int got_endtime;
- int caller_provided_ccache_name = 0;
-
- cred->ccache = NULL;
-
- /* load the GSS ccache name into the kg_context */
-
- if (GSS_ERROR(kg_sync_ccache_name(context, minor_status)))
- return(GSS_S_FAILURE);
-
- /* check to see if the caller provided a ccache name if so
- * we will just use that and not search the cache collection */
- if (GSS_ERROR(kg_caller_provided_ccache_name (minor_status, &caller_provided_ccache_name))) {
- return(GSS_S_FAILURE);
- }
+ krb5_error_code code;
+ krb5_ccache ccache;
+ krb5_principal princ, tmp_princ;
+ krb5_flags flags;
+ krb5_cc_cursor cur;
+ krb5_creds creds;
+ int got_endtime;
+ int caller_provided_ccache_name = 0;
+
+ cred->ccache = NULL;
+
+ /* load the GSS ccache name into the kg_context */
+
+ if (GSS_ERROR(kg_sync_ccache_name(context, minor_status)))
+ return(GSS_S_FAILURE);
+
+ /* check to see if the caller provided a ccache name if so
+ * we will just use that and not search the cache collection */
+ if (GSS_ERROR(kg_caller_provided_ccache_name (minor_status, &caller_provided_ccache_name))) {
+ return(GSS_S_FAILURE);
+ }
#if defined(USE_KIM) || defined(USE_LEASH)
- if (desired_name && !caller_provided_ccache_name) {
+ if (desired_name && !caller_provided_ccache_name) {
#if defined(USE_KIM)
- kim_error err = KIM_NO_ERROR;
- kim_ccache kimccache = NULL;
- kim_identity identity = NULL;
-
- err = kim_identity_create_from_krb5_principal (&identity,
- context,
- (krb5_principal) desired_name);
-
- if (!err) {
- err = kim_ccache_create_new_if_needed (&kimccache,
- identity,
- KIM_OPTIONS_DEFAULT);
- }
-
- if (!err) {
- err = kim_ccache_get_krb5_ccache (kimccache, context, &ccache);
- }
-
- kim_ccache_free (&kimccache);
- kim_identity_free (&identity);
-
- if (err) {
- *minor_status = err;
- return(GSS_S_CRED_UNAVAIL);
- }
-
+ kim_error err = KIM_NO_ERROR;
+ kim_ccache kimccache = NULL;
+ kim_identity identity = NULL;
+
+ err = kim_identity_create_from_krb5_principal (&identity,
+ context,
+ (krb5_principal) desired_name);
+
+ if (!err) {
+ err = kim_ccache_create_new_if_needed (&kimccache,
+ identity,
+ KIM_OPTIONS_DEFAULT);
+ }
+
+ if (!err) {
+ err = kim_ccache_get_krb5_ccache (kimccache, context, &ccache);
+ }
+
+ kim_ccache_free (&kimccache);
+ kim_identity_free (&identity);
+
+ if (err) {
+ *minor_status = err;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+
#elif defined(USE_LEASH)
- if ( hLeashDLL == INVALID_HANDLE_VALUE ) {
- hLeashDLL = LoadLibrary(LEASH_DLL);
- if ( hLeashDLL != INVALID_HANDLE_VALUE ) {
- (FARPROC) pLeash_AcquireInitialTicketsIfNeeded =
- GetProcAddress(hLeashDLL, "not_an_API_Leash_AcquireInitialTicketsIfNeeded");
- }
- }
-
- if ( pLeash_AcquireInitialTicketsIfNeeded ) {
- char ccname[256]="";
- pLeash_AcquireInitialTicketsIfNeeded(context, (krb5_principal) desired_name, ccname, sizeof(ccname));
- if (!ccname[0]) {
- *minor_status = KRB5_CC_NOTFOUND;
- return(GSS_S_CRED_UNAVAIL);
- }
-
- if ((code = krb5_cc_resolve (context, ccname, &ccache))) {
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
- } else {
- /* leash dll not available, open the default credential cache */
-
- if ((code = krb5int_cc_default(context, &ccache))) {
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
- }
+ if ( hLeashDLL == INVALID_HANDLE_VALUE ) {
+ hLeashDLL = LoadLibrary(LEASH_DLL);
+ if ( hLeashDLL != INVALID_HANDLE_VALUE ) {
+ (FARPROC) pLeash_AcquireInitialTicketsIfNeeded =
+ GetProcAddress(hLeashDLL, "not_an_API_Leash_AcquireInitialTicketsIfNeeded");
+ }
+ }
+
+ if ( pLeash_AcquireInitialTicketsIfNeeded ) {
+ char ccname[256]="";
+ pLeash_AcquireInitialTicketsIfNeeded(context, (krb5_principal) desired_name, ccname, sizeof(ccname));
+ if (!ccname[0]) {
+ *minor_status = KRB5_CC_NOTFOUND;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+
+ if ((code = krb5_cc_resolve (context, ccname, &ccache))) {
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+ } else {
+ /* leash dll not available, open the default credential cache */
+
+ if ((code = krb5int_cc_default(context, &ccache))) {
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+ }
#endif /* USE_LEASH */
- } else
+ } else
#endif /* USE_KIM || USE_LEASH */
- {
- /* open the default credential cache */
-
- if ((code = krb5int_cc_default(context, &ccache))) {
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
- }
-
- /* turn off OPENCLOSE mode while extensive frobbing is going on */
-
- flags = 0; /* turns off OPENCLOSE mode */
- if ((code = krb5_cc_set_flags(context, ccache, flags))) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_CRED_UNAVAIL);
- }
-
- /* get out the principal name and see if it matches */
-
- if ((code = krb5_cc_get_principal(context, ccache, &princ))) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- if (desired_name != (gss_name_t) NULL) {
- if (! krb5_principal_compare(context, princ, (krb5_principal) desired_name)) {
- (void)krb5_free_principal(context, princ);
- (void)krb5_cc_close(context, ccache);
- *minor_status = KG_CCACHE_NOMATCH;
- return(GSS_S_CRED_UNAVAIL);
- }
- (void)krb5_free_principal(context, princ);
- princ = (krb5_principal) desired_name;
- } else {
- *output_princ = princ;
- }
-
- /* iterate over the ccache, find the tgt */
-
- if ((code = krb5_cc_start_seq_get(context, ccache, &cur))) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- /* this is hairy. If there's a tgt for the principal's local realm
- in here, that's what we want for the expire time. But if
- there's not, then we want to use the first key. */
-
- got_endtime = 0;
-
- code = krb5_build_principal_ext(context, &tmp_princ,
- krb5_princ_realm(context, princ)->length,
- krb5_princ_realm(context, princ)->data,
- 6, "krbtgt",
- krb5_princ_realm(context, princ)->length,
- krb5_princ_realm(context, princ)->data,
- 0);
- if (code) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
- while (!(code = krb5_cc_next_cred(context, ccache, &cur, &creds))) {
- if (krb5_principal_compare(context, tmp_princ, creds.server)) {
- cred->tgt_expire = creds.times.endtime;
- got_endtime = 1;
- *minor_status = 0;
- code = 0;
- krb5_free_cred_contents(context, &creds);
- break;
- }
- if (got_endtime == 0) {
- cred->tgt_expire = creds.times.endtime;
- got_endtime = 1;
- }
- krb5_free_cred_contents(context, &creds);
- }
- krb5_free_principal(context, tmp_princ);
-
- if (code && code != KRB5_CC_END) {
- /* this means some error occurred reading the ccache */
- (void)krb5_cc_end_seq_get(context, ccache, &cur);
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- } else if (! got_endtime) {
- /* this means the ccache was entirely empty */
- (void)krb5_cc_end_seq_get(context, ccache, &cur);
- (void)krb5_cc_close(context, ccache);
- *minor_status = KG_EMPTY_CCACHE;
- return(GSS_S_FAILURE);
- } else {
- /* this means that we found an endtime to use. */
- if ((code = krb5_cc_end_seq_get(context, ccache, &cur))) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
- flags = KRB5_TC_OPENCLOSE; /* turns on OPENCLOSE mode */
- if ((code = krb5_cc_set_flags(context, ccache, flags))) {
- (void)krb5_cc_close(context, ccache);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
- }
-
- /* the credentials match and are valid */
-
- cred->ccache = ccache;
- /* minor_status is set while we are iterating over the ccache */
- return(GSS_S_COMPLETE);
+ {
+ /* open the default credential cache */
+
+ if ((code = krb5int_cc_default(context, &ccache))) {
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+ }
+
+ /* turn off OPENCLOSE mode while extensive frobbing is going on */
+
+ flags = 0; /* turns off OPENCLOSE mode */
+ if ((code = krb5_cc_set_flags(context, ccache, flags))) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+
+ /* get out the principal name and see if it matches */
+
+ if ((code = krb5_cc_get_principal(context, ccache, &princ))) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ if (desired_name != (gss_name_t) NULL) {
+ if (! krb5_principal_compare(context, princ, (krb5_principal) desired_name)) {
+ (void)krb5_free_principal(context, princ);
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = KG_CCACHE_NOMATCH;
+ return(GSS_S_CRED_UNAVAIL);
+ }
+ (void)krb5_free_principal(context, princ);
+ princ = (krb5_principal) desired_name;
+ } else {
+ *output_princ = princ;
+ }
+
+ /* iterate over the ccache, find the tgt */
+
+ if ((code = krb5_cc_start_seq_get(context, ccache, &cur))) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ /* this is hairy. If there's a tgt for the principal's local realm
+ in here, that's what we want for the expire time. But if
+ there's not, then we want to use the first key. */
+
+ got_endtime = 0;
+
+ code = krb5_build_principal_ext(context, &tmp_princ,
+ krb5_princ_realm(context, princ)->length,
+ krb5_princ_realm(context, princ)->data,
+ 6, "krbtgt",
+ krb5_princ_realm(context, princ)->length,
+ krb5_princ_realm(context, princ)->data,
+ 0);
+ if (code) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+ while (!(code = krb5_cc_next_cred(context, ccache, &cur, &creds))) {
+ if (krb5_principal_compare(context, tmp_princ, creds.server)) {
+ cred->tgt_expire = creds.times.endtime;
+ got_endtime = 1;
+ *minor_status = 0;
+ code = 0;
+ krb5_free_cred_contents(context, &creds);
+ break;
+ }
+ if (got_endtime == 0) {
+ cred->tgt_expire = creds.times.endtime;
+ got_endtime = 1;
+ }
+ krb5_free_cred_contents(context, &creds);
+ }
+ krb5_free_principal(context, tmp_princ);
+
+ if (code && code != KRB5_CC_END) {
+ /* this means some error occurred reading the ccache */
+ (void)krb5_cc_end_seq_get(context, ccache, &cur);
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ } else if (! got_endtime) {
+ /* this means the ccache was entirely empty */
+ (void)krb5_cc_end_seq_get(context, ccache, &cur);
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = KG_EMPTY_CCACHE;
+ return(GSS_S_FAILURE);
+ } else {
+ /* this means that we found an endtime to use. */
+ if ((code = krb5_cc_end_seq_get(context, ccache, &cur))) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+ flags = KRB5_TC_OPENCLOSE; /* turns on OPENCLOSE mode */
+ if ((code = krb5_cc_set_flags(context, ccache, flags))) {
+ (void)krb5_cc_close(context, ccache);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+ }
+
+ /* the credentials match and are valid */
+
+ cred->ccache = ccache;
+ /* minor_status is set while we are iterating over the ccache */
+ return(GSS_S_COMPLETE);
}
-
+
/*ARGSUSED*/
OM_uint32
krb5_gss_acquire_cred(minor_status, desired_name, time_req,
- desired_mechs, cred_usage, output_cred_handle,
- actual_mechs, time_rec)
- OM_uint32 *minor_status;
- gss_name_t desired_name;
- OM_uint32 time_req;
- gss_OID_set desired_mechs;
- gss_cred_usage_t cred_usage;
- gss_cred_id_t *output_cred_handle;
- gss_OID_set *actual_mechs;
- OM_uint32 *time_rec;
+ desired_mechs, cred_usage, output_cred_handle,
+ actual_mechs, time_rec)
+ OM_uint32 *minor_status;
+ gss_name_t desired_name;
+ OM_uint32 time_req;
+ gss_OID_set desired_mechs;
+ gss_cred_usage_t cred_usage;
+ gss_cred_id_t *output_cred_handle;
+ gss_OID_set *actual_mechs;
+ OM_uint32 *time_rec;
{
- krb5_context context;
- size_t i;
- krb5_gss_cred_id_t cred;
- gss_OID_set ret_mechs;
- int req_old, req_new;
- OM_uint32 ret;
- krb5_error_code code;
-
- code = gssint_initialize_library();
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- /* make sure all outputs are valid */
-
- *output_cred_handle = NULL;
- if (actual_mechs)
- *actual_mechs = NULL;
- if (time_rec)
- *time_rec = 0;
-
- /* validate the name */
-
- /*SUPPRESS 29*/
- if ((desired_name != (gss_name_t) NULL) &&
- (! kg_validate_name(desired_name))) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
-
- /* verify that the requested mechanism set is the default, or
- contains krb5 */
-
- if (desired_mechs == GSS_C_NULL_OID_SET) {
- req_old = 1;
- req_new = 1;
- } else {
- req_old = 0;
- req_new = 0;
-
- for (i=0; i<desired_mechs->count; i++) {
- if (g_OID_equal(gss_mech_krb5_old, &(desired_mechs->elements[i])))
- req_old++;
- if (g_OID_equal(gss_mech_krb5, &(desired_mechs->elements[i])))
- req_new++;
- }
-
- if (!req_old && !req_new) {
- *minor_status = 0;
- krb5_free_context(context);
- return(GSS_S_BAD_MECH);
- }
- }
-
- /* create the gss cred structure */
-
- if ((cred =
- (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec))) == NULL) {
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- memset(cred, 0, sizeof(krb5_gss_cred_id_rec));
-
- cred->usage = cred_usage;
- cred->princ = NULL;
- cred->prerfc_mech = req_old;
- cred->rfc_mech = req_new;
+ krb5_context context;
+ size_t i;
+ krb5_gss_cred_id_t cred;
+ gss_OID_set ret_mechs;
+ int req_old, req_new;
+ OM_uint32 ret;
+ krb5_error_code code;
+
+ code = gssint_initialize_library();
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ /* make sure all outputs are valid */
+
+ *output_cred_handle = NULL;
+ if (actual_mechs)
+ *actual_mechs = NULL;
+ if (time_rec)
+ *time_rec = 0;
+
+ /* validate the name */
+
+ /*SUPPRESS 29*/
+ if ((desired_name != (gss_name_t) NULL) &&
+ (! kg_validate_name(desired_name))) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
+
+ /* verify that the requested mechanism set is the default, or
+ contains krb5 */
+
+ if (desired_mechs == GSS_C_NULL_OID_SET) {
+ req_old = 1;
+ req_new = 1;
+ } else {
+ req_old = 0;
+ req_new = 0;
+
+ for (i=0; i<desired_mechs->count; i++) {
+ if (g_OID_equal(gss_mech_krb5_old, &(desired_mechs->elements[i])))
+ req_old++;
+ if (g_OID_equal(gss_mech_krb5, &(desired_mechs->elements[i])))
+ req_new++;
+ }
+
+ if (!req_old && !req_new) {
+ *minor_status = 0;
+ krb5_free_context(context);
+ return(GSS_S_BAD_MECH);
+ }
+ }
+
+ /* create the gss cred structure */
+
+ if ((cred =
+ (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec))) == NULL) {
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ memset(cred, 0, sizeof(krb5_gss_cred_id_rec));
+
+ cred->usage = cred_usage;
+ cred->princ = NULL;
+ cred->prerfc_mech = req_old;
+ cred->rfc_mech = req_new;
#ifndef LEAN_CLIENT
- cred->keytab = NULL;
+ cred->keytab = NULL;
#endif /* LEAN_CLIENT */
- cred->ccache = NULL;
-
- code = k5_mutex_init(&cred->lock);
- if (code) {
- *minor_status = code;
- krb5_free_context(context);
- return GSS_S_FAILURE;
- }
- /* Note that we don't need to lock this GSSAPI credential record
- here, because no other thread can gain access to it until we
- return it. */
-
- if ((cred_usage != GSS_C_INITIATE) &&
- (cred_usage != GSS_C_ACCEPT) &&
- (cred_usage != GSS_C_BOTH)) {
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- *minor_status = (OM_uint32) G_BAD_USAGE;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- /* if requested, acquire credentials for accepting */
- /* this will fill in cred->princ if the desired_name is not specified */
+ cred->ccache = NULL;
+
+ code = k5_mutex_init(&cred->lock);
+ if (code) {
+ *minor_status = code;
+ krb5_free_context(context);
+ return GSS_S_FAILURE;
+ }
+ /* Note that we don't need to lock this GSSAPI credential record
+ here, because no other thread can gain access to it until we
+ return it. */
+
+ if ((cred_usage != GSS_C_INITIATE) &&
+ (cred_usage != GSS_C_ACCEPT) &&
+ (cred_usage != GSS_C_BOTH)) {
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ *minor_status = (OM_uint32) G_BAD_USAGE;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ /* if requested, acquire credentials for accepting */
+ /* this will fill in cred->princ if the desired_name is not specified */
#ifndef LEAN_CLIENT
- if ((cred_usage == GSS_C_ACCEPT) ||
- (cred_usage == GSS_C_BOTH))
- if ((ret = acquire_accept_cred(context, minor_status, desired_name,
- &(cred->princ), cred))
- != GSS_S_COMPLETE) {
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- /* minor_status set by acquire_accept_cred() */
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(ret);
- }
+ if ((cred_usage == GSS_C_ACCEPT) ||
+ (cred_usage == GSS_C_BOTH))
+ if ((ret = acquire_accept_cred(context, minor_status, desired_name,
+ &(cred->princ), cred))
+ != GSS_S_COMPLETE) {
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ /* minor_status set by acquire_accept_cred() */
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(ret);
+ }
#endif /* LEAN_CLIENT */
- /* if requested, acquire credentials for initiation */
- /* this will fill in cred->princ if it wasn't set above, and
- the desired_name is not specified */
-
- if ((cred_usage == GSS_C_INITIATE) ||
- (cred_usage == GSS_C_BOTH))
- if ((ret =
- acquire_init_cred(context, minor_status,
- cred->princ?(gss_name_t)cred->princ:desired_name,
- &(cred->princ), cred))
- != GSS_S_COMPLETE) {
+ /* if requested, acquire credentials for initiation */
+ /* this will fill in cred->princ if it wasn't set above, and
+ the desired_name is not specified */
+
+ if ((cred_usage == GSS_C_INITIATE) ||
+ (cred_usage == GSS_C_BOTH))
+ if ((ret =
+ acquire_init_cred(context, minor_status,
+ cred->princ?(gss_name_t)cred->princ:desired_name,
+ &(cred->princ), cred))
+ != GSS_S_COMPLETE) {
#ifndef LEAN_CLIENT
- if (cred->keytab)
- krb5_kt_close(context, cred->keytab);
+ if (cred->keytab)
+ krb5_kt_close(context, cred->keytab);
#endif /* LEAN_CLIENT */
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- /* minor_status set by acquire_init_cred() */
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(ret);
- }
-
- /* if the princ wasn't filled in already, fill it in now */
-
- if (!cred->princ && (desired_name != GSS_C_NO_NAME))
- if ((code = krb5_copy_principal(context, (krb5_principal) desired_name,
- &(cred->princ)))) {
- if (cred->ccache)
- (void)krb5_cc_close(context, cred->ccache);
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ /* minor_status set by acquire_init_cred() */
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(ret);
+ }
+
+ /* if the princ wasn't filled in already, fill it in now */
+
+ if (!cred->princ && (desired_name != GSS_C_NO_NAME))
+ if ((code = krb5_copy_principal(context, (krb5_principal) desired_name,
+ &(cred->princ)))) {
+ if (cred->ccache)
+ (void)krb5_cc_close(context, cred->ccache);
#ifndef LEAN_CLIENT
- if (cred->keytab)
- (void)krb5_kt_close(context, cred->keytab);
+ if (cred->keytab)
+ (void)krb5_kt_close(context, cred->keytab);
#endif /* LEAN_CLIENT */
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- /*** at this point, the cred structure has been completely created */
-
- /* compute time_rec */
-
- if (cred_usage == GSS_C_ACCEPT) {
- if (time_rec)
- *time_rec = GSS_C_INDEFINITE;
- } else {
- krb5_timestamp now;
-
- if ((code = krb5_timeofday(context, &now))) {
- if (cred->ccache)
- (void)krb5_cc_close(context, cred->ccache);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ /*** at this point, the cred structure has been completely created */
+
+ /* compute time_rec */
+
+ if (cred_usage == GSS_C_ACCEPT) {
+ if (time_rec)
+ *time_rec = GSS_C_INDEFINITE;
+ } else {
+ krb5_timestamp now;
+
+ if ((code = krb5_timeofday(context, &now))) {
+ if (cred->ccache)
+ (void)krb5_cc_close(context, cred->ccache);
#ifndef LEAN_CLIENT
- if (cred->keytab)
- (void)krb5_kt_close(context, cred->keytab);
+ if (cred->keytab)
+ (void)krb5_kt_close(context, cred->keytab);
#endif /* LEAN_CLIENT */
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- if (time_rec)
- *time_rec = (cred->tgt_expire > now) ? (cred->tgt_expire - now) : 0;
- }
-
- /* create mechs */
-
- if (actual_mechs) {
- if (GSS_ERROR(ret = generic_gss_create_empty_oid_set(minor_status,
- &ret_mechs)) ||
- (cred->prerfc_mech &&
- GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
- gss_mech_krb5_old,
- &ret_mechs))) ||
- (cred->rfc_mech &&
- GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
- gss_mech_krb5,
- &ret_mechs)))) {
- if (cred->ccache)
- (void)krb5_cc_close(context, cred->ccache);
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ if (time_rec)
+ *time_rec = (cred->tgt_expire > now) ? (cred->tgt_expire - now) : 0;
+ }
+
+ /* create mechs */
+
+ if (actual_mechs) {
+ if (GSS_ERROR(ret = generic_gss_create_empty_oid_set(minor_status,
+ &ret_mechs)) ||
+ (cred->prerfc_mech &&
+ GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
+ gss_mech_krb5_old,
+ &ret_mechs))) ||
+ (cred->rfc_mech &&
+ GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
+ gss_mech_krb5,
+ &ret_mechs)))) {
+ if (cred->ccache)
+ (void)krb5_cc_close(context, cred->ccache);
#ifndef LEAN_CLIENT
- if (cred->keytab)
- (void)krb5_kt_close(context, cred->keytab);
+ if (cred->keytab)
+ (void)krb5_kt_close(context, cred->keytab);
#endif /* LEAN_CLIENT */
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- /* *minor_status set above */
- krb5_free_context(context);
- return(ret);
- }
- }
-
- /* intern the credential handle */
-
- if (! kg_save_cred_id((gss_cred_id_t) cred)) {
- free(ret_mechs->elements);
- free(ret_mechs);
- if (cred->ccache)
- (void)krb5_cc_close(context, cred->ccache);
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ /* *minor_status set above */
+ krb5_free_context(context);
+ return(ret);
+ }
+ }
+
+ /* intern the credential handle */
+
+ if (! kg_save_cred_id((gss_cred_id_t) cred)) {
+ free(ret_mechs->elements);
+ free(ret_mechs);
+ if (cred->ccache)
+ (void)krb5_cc_close(context, cred->ccache);
#ifndef LEAN_CLIENT
- if (cred->keytab)
- (void)krb5_kt_close(context, cred->keytab);
+ if (cred->keytab)
+ (void)krb5_kt_close(context, cred->keytab);
#endif /* LEAN_CLIENT */
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
- k5_mutex_destroy(&cred->lock);
- xfree(cred);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- save_error_string(*minor_status, "error saving credentials");
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- /* return success */
-
- *minor_status = 0;
- *output_cred_handle = (gss_cred_id_t) cred;
- if (actual_mechs)
- *actual_mechs = ret_mechs;
-
- krb5_free_context(context);
- return(GSS_S_COMPLETE);
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
+ k5_mutex_destroy(&cred->lock);
+ xfree(cred);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ save_error_string(*minor_status, "error saving credentials");
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ /* return success */
+
+ *minor_status = 0;
+ *output_cred_handle = (gss_cred_id_t) cred;
+ if (actual_mechs)
+ *actual_mechs = ret_mechs;
+
+ krb5_free_context(context);
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/add_cred.c b/src/lib/gssapi/krb5/add_cred.c
index fdcd9c0d33..3652f918b7 100644
--- a/src/lib/gssapi/krb5/add_cred.c
+++ b/src/lib/gssapi/krb5/add_cred.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000, 2008 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,18 +21,18 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -42,7 +43,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -62,26 +63,26 @@
/* V2 interface */
OM_uint32
krb5_gss_add_cred(minor_status, input_cred_handle,
- desired_name, desired_mech, cred_usage,
- initiator_time_req, acceptor_time_req,
- output_cred_handle, actual_mechs,
- initiator_time_rec, acceptor_time_rec)
- OM_uint32 *minor_status;
- gss_cred_id_t input_cred_handle;
- gss_name_t desired_name;
- gss_OID desired_mech;
- gss_cred_usage_t cred_usage;
- OM_uint32 initiator_time_req;
- OM_uint32 acceptor_time_req;
- gss_cred_id_t *output_cred_handle;
- gss_OID_set *actual_mechs;
- OM_uint32 *initiator_time_rec;
- OM_uint32 *acceptor_time_rec;
+ desired_name, desired_mech, cred_usage,
+ initiator_time_req, acceptor_time_req,
+ output_cred_handle, actual_mechs,
+ initiator_time_rec, acceptor_time_rec)
+ OM_uint32 *minor_status;
+ gss_cred_id_t input_cred_handle;
+ gss_name_t desired_name;
+ gss_OID desired_mech;
+ gss_cred_usage_t cred_usage;
+ OM_uint32 initiator_time_req;
+ OM_uint32 acceptor_time_req;
+ gss_cred_id_t *output_cred_handle;
+ gss_OID_set *actual_mechs;
+ OM_uint32 *initiator_time_rec;
+ OM_uint32 *acceptor_time_rec;
{
- krb5_context context;
- OM_uint32 major_status, lifetime;
- krb5_gss_cred_id_t cred;
- krb5_error_code code;
+ krb5_context context;
+ OM_uint32 major_status, lifetime;
+ krb5_gss_cred_id_t cred;
+ krb5_error_code code;
/* this is pretty simple, since there's not really any difference
between the underlying mechanisms. The main hair is in copying
@@ -90,18 +91,18 @@ krb5_gss_add_cred(minor_status, input_cred_handle,
/* check if the desired_mech is bogus */
if (!g_OID_equal(desired_mech, gss_mech_krb5) &&
- !g_OID_equal(desired_mech, gss_mech_krb5_old)) {
- *minor_status = 0;
- return(GSS_S_BAD_MECH);
+ !g_OID_equal(desired_mech, gss_mech_krb5_old)) {
+ *minor_status = 0;
+ return(GSS_S_BAD_MECH);
}
/* check if the desired_mech is bogus */
if ((cred_usage != GSS_C_INITIATE) &&
- (cred_usage != GSS_C_ACCEPT) &&
- (cred_usage != GSS_C_BOTH)) {
- *minor_status = (OM_uint32) G_BAD_USAGE;
- return(GSS_S_FAILURE);
+ (cred_usage != GSS_C_ACCEPT) &&
+ (cred_usage != GSS_C_BOTH)) {
+ *minor_status = (OM_uint32) G_BAD_USAGE;
+ return(GSS_S_FAILURE);
}
/* since the default credential includes all the mechanisms,
@@ -109,22 +110,22 @@ krb5_gss_add_cred(minor_status, input_cred_handle,
/*SUPPRESS 29*/
if (input_cred_handle == GSS_C_NO_CREDENTIAL) {
- *minor_status = 0;
- return(GSS_S_DUPLICATE_ELEMENT);
+ *minor_status = 0;
+ return(GSS_S_DUPLICATE_ELEMENT);
}
code = krb5_gss_init_context(&context);
if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
+ *minor_status = code;
+ return GSS_S_FAILURE;
}
major_status = krb5_gss_validate_cred_1(minor_status, input_cred_handle,
- context);
+ context);
if (GSS_ERROR(major_status)) {
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return major_status;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return major_status;
}
cred = (krb5_gss_cred_id_t) input_cred_handle;
@@ -134,252 +135,252 @@ krb5_gss_add_cred(minor_status, input_cred_handle,
if copying */
if (!((cred->usage == cred_usage) ||
- ((cred->usage == GSS_C_BOTH) &&
- (output_cred_handle != NULL)))) {
- *minor_status = (OM_uint32) G_BAD_USAGE;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
+ ((cred->usage == GSS_C_BOTH) &&
+ (output_cred_handle != NULL)))) {
+ *minor_status = (OM_uint32) G_BAD_USAGE;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
}
/* check that desired_mech isn't already in the credential */
if ((g_OID_equal(desired_mech, gss_mech_krb5_old) && cred->prerfc_mech) ||
- (g_OID_equal(desired_mech, gss_mech_krb5) && cred->rfc_mech)) {
- *minor_status = 0;
- krb5_free_context(context);
- return(GSS_S_DUPLICATE_ELEMENT);
+ (g_OID_equal(desired_mech, gss_mech_krb5) && cred->rfc_mech)) {
+ *minor_status = 0;
+ krb5_free_context(context);
+ return(GSS_S_DUPLICATE_ELEMENT);
}
if (GSS_ERROR(kg_sync_ccache_name(context, minor_status))) {
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return GSS_S_FAILURE;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return GSS_S_FAILURE;
}
/* verify the desired_name */
/*SUPPRESS 29*/
if ((desired_name != (gss_name_t) NULL) &&
- (! kg_validate_name(desired_name))) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ (! kg_validate_name(desired_name))) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
}
/* make sure the desired_name is the same as the existing one */
if (desired_name &&
- !krb5_principal_compare(context, (krb5_principal) desired_name,
- cred->princ)) {
- *minor_status = 0;
- krb5_free_context(context);
- return(GSS_S_BAD_NAME);
+ !krb5_principal_compare(context, (krb5_principal) desired_name,
+ cred->princ)) {
+ *minor_status = 0;
+ krb5_free_context(context);
+ return(GSS_S_BAD_NAME);
}
/* copy the cred if necessary */
if (output_cred_handle) {
- /* make a copy */
- krb5_gss_cred_id_t new_cred;
- char ktboth[1024];
- const char *kttype, *cctype, *ccname;
- char ccboth[1024];
-
- if ((new_cred =
- (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec)))
- == NULL) {
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- memset(new_cred, 0, sizeof(krb5_gss_cred_id_rec));
-
- new_cred->usage = cred_usage;
- new_cred->prerfc_mech = cred->prerfc_mech;
- new_cred->rfc_mech = cred->rfc_mech;
- new_cred->tgt_expire = cred->tgt_expire;
-
- if (cred->princ)
- code = krb5_copy_principal(context, cred->princ, &new_cred->princ);
- if (code) {
- xfree(new_cred);
-
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-#ifndef LEAN_CLIENT
- if (cred->keytab) {
- kttype = krb5_kt_get_type(context, cred->keytab);
- if ((strlen(kttype)+2) > sizeof(ktboth)) {
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- strncpy(ktboth, kttype, sizeof(ktboth) - 1);
- ktboth[sizeof(ktboth) - 1] = '\0';
- strncat(ktboth, ":", sizeof(ktboth) - 1 - strlen(ktboth));
-
- code = krb5_kt_get_name(context, cred->keytab,
- ktboth+strlen(ktboth),
- sizeof(ktboth)-strlen(ktboth));
- if (code) {
- if(new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- code = krb5_kt_resolve(context, ktboth, &new_cred->keytab);
- if (code) {
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- } else {
+ /* make a copy */
+ krb5_gss_cred_id_t new_cred;
+ char ktboth[1024];
+ const char *kttype, *cctype, *ccname;
+ char ccboth[1024];
+
+ if ((new_cred =
+ (krb5_gss_cred_id_t) xmalloc(sizeof(krb5_gss_cred_id_rec)))
+ == NULL) {
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ memset(new_cred, 0, sizeof(krb5_gss_cred_id_rec));
+
+ new_cred->usage = cred_usage;
+ new_cred->prerfc_mech = cred->prerfc_mech;
+ new_cred->rfc_mech = cred->rfc_mech;
+ new_cred->tgt_expire = cred->tgt_expire;
+
+ if (cred->princ)
+ code = krb5_copy_principal(context, cred->princ, &new_cred->princ);
+ if (code) {
+ xfree(new_cred);
+
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+#ifndef LEAN_CLIENT
+ if (cred->keytab) {
+ kttype = krb5_kt_get_type(context, cred->keytab);
+ if ((strlen(kttype)+2) > sizeof(ktboth)) {
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ strncpy(ktboth, kttype, sizeof(ktboth) - 1);
+ ktboth[sizeof(ktboth) - 1] = '\0';
+ strncat(ktboth, ":", sizeof(ktboth) - 1 - strlen(ktboth));
+
+ code = krb5_kt_get_name(context, cred->keytab,
+ ktboth+strlen(ktboth),
+ sizeof(ktboth)-strlen(ktboth));
+ if (code) {
+ if(new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ code = krb5_kt_resolve(context, ktboth, &new_cred->keytab);
+ if (code) {
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ } else {
#endif /* LEAN_CLIENT */
- new_cred->keytab = NULL;
-#ifndef LEAN_CLIENT
- }
+ new_cred->keytab = NULL;
+#ifndef LEAN_CLIENT
+ }
#endif /* LEAN_CLIENT */
-
- if (cred->rcache) {
- /* Open the replay cache for this principal. */
- if ((code = krb5_get_server_rcache(context,
- krb5_princ_component(context, cred->princ, 0),
- &new_cred->rcache))) {
-#ifndef LEAN_CLIENT
- if (new_cred->keytab)
- krb5_kt_close(context, new_cred->keytab);
+
+ if (cred->rcache) {
+ /* Open the replay cache for this principal. */
+ if ((code = krb5_get_server_rcache(context,
+ krb5_princ_component(context, cred->princ, 0),
+ &new_cred->rcache))) {
+#ifndef LEAN_CLIENT
+ if (new_cred->keytab)
+ krb5_kt_close(context, new_cred->keytab);
#endif /* LEAN_CLIENT */
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- } else {
- new_cred->rcache = NULL;
- }
-
- if (cred->ccache) {
- cctype = krb5_cc_get_type(context, cred->ccache);
- ccname = krb5_cc_get_name(context, cred->ccache);
-
- if ((strlen(cctype)+strlen(ccname)+2) > sizeof(ccboth)) {
- if (new_cred->rcache)
- krb5_rc_close(context, new_cred->rcache);
-#ifndef LEAN_CLIENT
- if (new_cred->keytab)
- krb5_kt_close(context, new_cred->keytab);
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ new_cred->rcache = NULL;
+ }
+
+ if (cred->ccache) {
+ cctype = krb5_cc_get_type(context, cred->ccache);
+ ccname = krb5_cc_get_name(context, cred->ccache);
+
+ if ((strlen(cctype)+strlen(ccname)+2) > sizeof(ccboth)) {
+ if (new_cred->rcache)
+ krb5_rc_close(context, new_cred->rcache);
+#ifndef LEAN_CLIENT
+ if (new_cred->keytab)
+ krb5_kt_close(context, new_cred->keytab);
#endif /* LEAN_CLIENT */
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- krb5_free_context(context);
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
-
- strncpy(ccboth, cctype, sizeof(ccboth) - 1);
- ccboth[sizeof(ccboth) - 1] = '\0';
- strncat(ccboth, ":", sizeof(ccboth) - 1 - strlen(ccboth));
- strncat(ccboth, ccname, sizeof(ccboth) - 1 - strlen(ccboth));
-
- code = krb5_cc_resolve(context, ccboth, &new_cred->ccache);
- if (code) {
- if (new_cred->rcache)
- krb5_rc_close(context, new_cred->rcache);
-#ifndef LEAN_CLIENT
- if (new_cred->keytab)
- krb5_kt_close(context, new_cred->keytab);
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ krb5_free_context(context);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+
+ strncpy(ccboth, cctype, sizeof(ccboth) - 1);
+ ccboth[sizeof(ccboth) - 1] = '\0';
+ strncat(ccboth, ":", sizeof(ccboth) - 1 - strlen(ccboth));
+ strncat(ccboth, ccname, sizeof(ccboth) - 1 - strlen(ccboth));
+
+ code = krb5_cc_resolve(context, ccboth, &new_cred->ccache);
+ if (code) {
+ if (new_cred->rcache)
+ krb5_rc_close(context, new_cred->rcache);
+#ifndef LEAN_CLIENT
+ if (new_cred->keytab)
+ krb5_kt_close(context, new_cred->keytab);
#endif /* LEAN_CLIENT */
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
-
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- } else {
- new_cred->ccache = NULL;
- }
-
- /* intern the credential handle */
-
- if (! kg_save_cred_id((gss_cred_id_t) new_cred)) {
- if (new_cred->ccache)
- krb5_cc_close(context, new_cred->ccache);
- if (new_cred->rcache)
- krb5_rc_close(context, new_cred->rcache);
-#ifndef LEAN_CLIENT
- if (new_cred->keytab)
- krb5_kt_close(context, new_cred->keytab);
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ new_cred->ccache = NULL;
+ }
+
+ /* intern the credential handle */
+
+ if (! kg_save_cred_id((gss_cred_id_t) new_cred)) {
+ if (new_cred->ccache)
+ krb5_cc_close(context, new_cred->ccache);
+ if (new_cred->rcache)
+ krb5_rc_close(context, new_cred->rcache);
+#ifndef LEAN_CLIENT
+ if (new_cred->keytab)
+ krb5_kt_close(context, new_cred->keytab);
#endif /* LEAN_CLIENT */
- if (new_cred->princ)
- krb5_free_principal(context, new_cred->princ);
- xfree(new_cred);
- krb5_free_context(context);
+ if (new_cred->princ)
+ krb5_free_principal(context, new_cred->princ);
+ xfree(new_cred);
+ krb5_free_context(context);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
- }
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
+ }
- /* modify new_cred */
+ /* modify new_cred */
- cred = new_cred;
+ cred = new_cred;
}
-
+
/* set the flag for the new mechanism */
if (g_OID_equal(desired_mech, gss_mech_krb5_old))
- cred->prerfc_mech = 1;
+ cred->prerfc_mech = 1;
else if (g_OID_equal(desired_mech, gss_mech_krb5))
- cred->rfc_mech = 1;
+ cred->rfc_mech = 1;
/* set the outputs */
- if (GSS_ERROR(major_status = krb5_gss_inquire_cred(minor_status,
- (gss_cred_id_t)cred,
- NULL, &lifetime,
- NULL, actual_mechs))) {
- OM_uint32 dummy;
-
- if (output_cred_handle)
- (void) krb5_gss_release_cred(&dummy, (gss_cred_id_t *) &cred);
- krb5_free_context(context);
-
- return(major_status);
+ if (GSS_ERROR(major_status = krb5_gss_inquire_cred(minor_status,
+ (gss_cred_id_t)cred,
+ NULL, &lifetime,
+ NULL, actual_mechs))) {
+ OM_uint32 dummy;
+
+ if (output_cred_handle)
+ (void) krb5_gss_release_cred(&dummy, (gss_cred_id_t *) &cred);
+ krb5_free_context(context);
+
+ return(major_status);
}
if (initiator_time_rec)
- *initiator_time_rec = lifetime;
+ *initiator_time_rec = lifetime;
if (acceptor_time_rec)
- *acceptor_time_rec = lifetime;
+ *acceptor_time_rec = lifetime;
if (output_cred_handle)
- *output_cred_handle = (gss_cred_id_t)cred;
+ *output_cred_handle = (gss_cred_id_t)cred;
krb5_free_context(context);
*minor_status = 0;
diff --git a/src/lib/gssapi/krb5/canon_name.c b/src/lib/gssapi/krb5/canon_name.c
index 0f7c9cd9c0..b113a343e6 100644
--- a/src/lib/gssapi/krb5/canon_name.c
+++ b/src/lib/gssapi/krb5/canon_name.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/canon_name.c
*
@@ -30,15 +31,15 @@
/* This is trivial since we're a single mechanism implementation */
OM_uint32 krb5_gss_canonicalize_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
- const gss_OID mech_type,
- gss_name_t *output_name)
+ const gss_name_t input_name,
+ const gss_OID mech_type,
+ gss_name_t *output_name)
{
if ((mech_type != GSS_C_NULL_OID) &&
- !g_OID_equal(gss_mech_krb5, mech_type) &&
- !g_OID_equal(gss_mech_krb5_old, mech_type)) {
- *minor_status = 0;
- return(GSS_S_BAD_MECH);
+ !g_OID_equal(gss_mech_krb5, mech_type) &&
+ !g_OID_equal(gss_mech_krb5_old, mech_type)) {
+ *minor_status = 0;
+ return(GSS_S_BAD_MECH);
}
return(gss_duplicate_name(minor_status, input_name, output_name));
diff --git a/src/lib/gssapi/krb5/compare_name.c b/src/lib/gssapi/krb5/compare_name.c
index 805f9f1d70..e456ed50a1 100644
--- a/src/lib/gssapi/krb5/compare_name.c
+++ b/src/lib/gssapi/krb5/compare_name.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,33 +29,33 @@
OM_uint32
krb5_gss_compare_name(minor_status, name1, name2, name_equal)
- OM_uint32 *minor_status;
- gss_name_t name1;
- gss_name_t name2;
- int *name_equal;
-{
- krb5_context context;
- krb5_error_code code;
+ OM_uint32 *minor_status;
+ gss_name_t name1;
+ gss_name_t name2;
+ int *name_equal;
+{
+ krb5_context context;
+ krb5_error_code code;
- if (! kg_validate_name(name1)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
+ if (! kg_validate_name(name1)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
- if (! kg_validate_name(name2)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
+ if (! kg_validate_name(name2)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
- *minor_status = 0;
- *name_equal = krb5_principal_compare(context, (krb5_principal) name1,
- (krb5_principal) name2);
- krb5_free_context(context);
- return(GSS_S_COMPLETE);
+ *minor_status = 0;
+ *name_equal = krb5_principal_compare(context, (krb5_principal) name1,
+ (krb5_principal) name2);
+ krb5_free_context(context);
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/context_time.c b/src/lib/gssapi/krb5/context_time.c
index adaa625069..ec16239c4a 100644
--- a/src/lib/gssapi/krb5/context_time.c
+++ b/src/lib/gssapi/krb5/context_time.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,41 +29,41 @@
OM_uint32
krb5_gss_context_time(minor_status, context_handle, time_rec)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- OM_uint32 *time_rec;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ OM_uint32 *time_rec;
{
- krb5_error_code code;
- krb5_gss_ctx_id_rec *ctx;
- krb5_timestamp now;
- krb5_deltat lifetime;
+ krb5_error_code code;
+ krb5_gss_ctx_id_rec *ctx;
+ krb5_timestamp now;
+ krb5_deltat lifetime;
- /* validate the context handle */
- if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
+ /* validate the context handle */
+ if (! kg_validate_ctx_id(context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
- ctx = (krb5_gss_ctx_id_rec *) context_handle;
+ ctx = (krb5_gss_ctx_id_rec *) context_handle;
- if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
- }
+ if (! ctx->established) {
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
+ }
- if ((code = krb5_timeofday(ctx->k5_context, &now))) {
- *minor_status = code;
- save_error_info(*minor_status, ctx->k5_context);
- return(GSS_S_FAILURE);
- }
+ if ((code = krb5_timeofday(ctx->k5_context, &now))) {
+ *minor_status = code;
+ save_error_info(*minor_status, ctx->k5_context);
+ return(GSS_S_FAILURE);
+ }
- if ((lifetime = ctx->endtime - now) <= 0) {
- *time_rec = 0;
- *minor_status = 0;
- return(GSS_S_CONTEXT_EXPIRED);
- } else {
- *time_rec = lifetime;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
- }
+ if ((lifetime = ctx->endtime - now) <= 0) {
+ *time_rec = 0;
+ *minor_status = 0;
+ return(GSS_S_CONTEXT_EXPIRED);
+ } else {
+ *time_rec = lifetime;
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
+ }
}
diff --git a/src/lib/gssapi/krb5/copy_ccache.c b/src/lib/gssapi/krb5/copy_ccache.c
index 8553d92dba..2071df44a1 100644
--- a/src/lib/gssapi/krb5/copy_ccache.c
+++ b/src/lib/gssapi/krb5/copy_ccache.c
@@ -1,57 +1,58 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
#include "gssapiP_krb5.h"
-OM_uint32 KRB5_CALLCONV
+OM_uint32 KRB5_CALLCONV
gss_krb5int_copy_ccache(minor_status, cred_handle, out_ccache)
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
- krb5_ccache out_ccache;
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
+ krb5_ccache out_ccache;
{
- OM_uint32 major_status;
- krb5_gss_cred_id_t k5creds;
- krb5_cc_cursor cursor;
- krb5_creds creds;
- krb5_error_code code;
- krb5_context context;
+ OM_uint32 major_status;
+ krb5_gss_cred_id_t k5creds;
+ krb5_cc_cursor cursor;
+ krb5_creds creds;
+ krb5_error_code code;
+ krb5_context context;
- /* validate the cred handle */
- major_status = krb5_gss_validate_cred(minor_status, cred_handle);
- if (major_status)
- return(major_status);
-
- k5creds = (krb5_gss_cred_id_t) cred_handle;
- code = k5_mutex_lock(&k5creds->lock);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
- if (k5creds->usage == GSS_C_ACCEPT) {
- k5_mutex_unlock(&k5creds->lock);
- *minor_status = (OM_uint32) G_BAD_USAGE;
- return(GSS_S_FAILURE);
- }
+ /* validate the cred handle */
+ major_status = krb5_gss_validate_cred(minor_status, cred_handle);
+ if (major_status)
+ return(major_status);
- code = krb5_gss_init_context(&context);
- if (code) {
- k5_mutex_unlock(&k5creds->lock);
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ k5creds = (krb5_gss_cred_id_t) cred_handle;
+ code = k5_mutex_lock(&k5creds->lock);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+ if (k5creds->usage == GSS_C_ACCEPT) {
+ k5_mutex_unlock(&k5creds->lock);
+ *minor_status = (OM_uint32) G_BAD_USAGE;
+ return(GSS_S_FAILURE);
+ }
- code = krb5_cc_start_seq_get(context, k5creds->ccache, &cursor);
- if (code) {
- k5_mutex_unlock(&k5creds->lock);
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- while (!code && !krb5_cc_next_cred(context, k5creds->ccache, &cursor, &creds))
- code = krb5_cc_store_cred(context, out_ccache, &creds);
- krb5_cc_end_seq_get(context, k5creds->ccache, &cursor);
- k5_mutex_unlock(&k5creds->lock);
- *minor_status = code;
- if (code)
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return code ? GSS_S_FAILURE : GSS_S_COMPLETE;
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ k5_mutex_unlock(&k5creds->lock);
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ code = krb5_cc_start_seq_get(context, k5creds->ccache, &cursor);
+ if (code) {
+ k5_mutex_unlock(&k5creds->lock);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ while (!code && !krb5_cc_next_cred(context, k5creds->ccache, &cursor, &creds))
+ code = krb5_cc_store_cred(context, out_ccache, &creds);
+ krb5_cc_end_seq_get(context, k5creds->ccache, &cursor);
+ k5_mutex_unlock(&k5creds->lock);
+ *minor_status = code;
+ if (code)
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return code ? GSS_S_FAILURE : GSS_S_COMPLETE;
}
diff --git a/src/lib/gssapi/krb5/delete_sec_context.c b/src/lib/gssapi/krb5/delete_sec_context.c
index 60755d2519..b2ace922c3 100644
--- a/src/lib/gssapi/krb5/delete_sec_context.c
+++ b/src/lib/gssapi/krb5/delete_sec_context.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,94 +29,94 @@
OM_uint32
krb5_gss_delete_sec_context(minor_status, context_handle, output_token)
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_buffer_t output_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_buffer_t output_token;
{
- krb5_context context;
- krb5_gss_ctx_id_rec *ctx;
+ krb5_context context;
+ krb5_gss_ctx_id_rec *ctx;
- if (output_token) {
- output_token->length = 0;
- output_token->value = NULL;
- }
+ if (output_token) {
+ output_token->length = 0;
+ output_token->value = NULL;
+ }
- /*SUPPRESS 29*/
- if (*context_handle == GSS_C_NO_CONTEXT) {
- *minor_status = 0;
- return(GSS_S_COMPLETE);
- }
+ /*SUPPRESS 29*/
+ if (*context_handle == GSS_C_NO_CONTEXT) {
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
+ }
- /*SUPPRESS 29*/
- /* validate the context handle */
- if (! kg_validate_ctx_id(*context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
+ /*SUPPRESS 29*/
+ /* validate the context handle */
+ if (! kg_validate_ctx_id(*context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
- ctx = (krb5_gss_ctx_id_t) *context_handle;
- context = ctx->k5_context;
+ ctx = (krb5_gss_ctx_id_t) *context_handle;
+ context = ctx->k5_context;
- /* construct a delete context token if necessary */
+ /* construct a delete context token if necessary */
- if (output_token) {
- OM_uint32 major;
- gss_buffer_desc empty;
- empty.length = 0; empty.value = NULL;
+ if (output_token) {
+ OM_uint32 major;
+ gss_buffer_desc empty;
+ empty.length = 0; empty.value = NULL;
- if ((major = kg_seal(minor_status, *context_handle, 0,
- GSS_C_QOP_DEFAULT,
- &empty, NULL, output_token, KG_TOK_DEL_CTX))) {
- save_error_info(*minor_status, context);
- return(major);
- }
- }
+ if ((major = kg_seal(minor_status, *context_handle, 0,
+ GSS_C_QOP_DEFAULT,
+ &empty, NULL, output_token, KG_TOK_DEL_CTX))) {
+ save_error_info(*minor_status, context);
+ return(major);
+ }
+ }
- /* invalidate the context handle */
+ /* invalidate the context handle */
- (void)kg_delete_ctx_id(*context_handle);
+ (void)kg_delete_ctx_id(*context_handle);
- /* free all the context state */
+ /* free all the context state */
- if (ctx->seqstate)
- g_order_free(&(ctx->seqstate));
+ if (ctx->seqstate)
+ g_order_free(&(ctx->seqstate));
- if (ctx->enc)
- krb5_free_keyblock(context, ctx->enc);
+ if (ctx->enc)
+ krb5_free_keyblock(context, ctx->enc);
- if (ctx->seq)
- krb5_free_keyblock(context, ctx->seq);
+ if (ctx->seq)
+ krb5_free_keyblock(context, ctx->seq);
- if (ctx->here)
- krb5_free_principal(context, ctx->here);
- if (ctx->there)
- krb5_free_principal(context, ctx->there);
- if (ctx->subkey)
- krb5_free_keyblock(context, ctx->subkey);
- if (ctx->acceptor_subkey)
- krb5_free_keyblock(context, ctx->acceptor_subkey);
+ if (ctx->here)
+ krb5_free_principal(context, ctx->here);
+ if (ctx->there)
+ krb5_free_principal(context, ctx->there);
+ if (ctx->subkey)
+ krb5_free_keyblock(context, ctx->subkey);
+ if (ctx->acceptor_subkey)
+ krb5_free_keyblock(context, ctx->acceptor_subkey);
- if (ctx->auth_context) {
- if (ctx->cred_rcache)
- (void)krb5_auth_con_setrcache(context, ctx->auth_context, NULL);
+ if (ctx->auth_context) {
+ if (ctx->cred_rcache)
+ (void)krb5_auth_con_setrcache(context, ctx->auth_context, NULL);
- krb5_auth_con_free(context, ctx->auth_context);
- }
+ krb5_auth_con_free(context, ctx->auth_context);
+ }
- if (ctx->mech_used)
- gss_release_oid(minor_status, &ctx->mech_used);
-
- if (ctx->k5_context)
- krb5_free_context(ctx->k5_context);
+ if (ctx->mech_used)
+ gss_release_oid(minor_status, &ctx->mech_used);
- /* Zero out context */
- memset(ctx, 0, sizeof(*ctx));
- xfree(ctx);
+ if (ctx->k5_context)
+ krb5_free_context(ctx->k5_context);
- /* zero the handle itself */
+ /* Zero out context */
+ memset(ctx, 0, sizeof(*ctx));
+ xfree(ctx);
- *context_handle = GSS_C_NO_CONTEXT;
+ /* zero the handle itself */
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ *context_handle = GSS_C_NO_CONTEXT;
+
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/disp_name.c b/src/lib/gssapi/krb5/disp_name.c
index 1f67d51299..d6bf0f7bac 100644
--- a/src/lib/gssapi/krb5/disp_name.c
+++ b/src/lib/gssapi/krb5/disp_name.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -23,53 +24,53 @@
#include "gssapiP_krb5.h"
OM_uint32
-krb5_gss_display_name(minor_status, input_name, output_name_buffer,
- output_name_type)
- OM_uint32 *minor_status;
- gss_name_t input_name;
- gss_buffer_t output_name_buffer;
- gss_OID *output_name_type;
+krb5_gss_display_name(minor_status, input_name, output_name_buffer,
+ output_name_type)
+ OM_uint32 *minor_status;
+ gss_name_t input_name;
+ gss_buffer_t output_name_buffer;
+ gss_OID *output_name_type;
{
- krb5_context context;
- krb5_error_code code;
- char *str;
+ krb5_context context;
+ krb5_error_code code;
+ char *str;
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
- output_name_buffer->length = 0;
- output_name_buffer->value = NULL;
+ output_name_buffer->length = 0;
+ output_name_buffer->value = NULL;
- if (! kg_validate_name(input_name)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
+ if (! kg_validate_name(input_name)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
- if ((code = krb5_unparse_name(context,
- (krb5_principal) input_name, &str))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
+ if ((code = krb5_unparse_name(context,
+ (krb5_principal) input_name, &str))) {
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
- if (! g_make_string_buffer(str, output_name_buffer)) {
- krb5_free_unparsed_name(context, str);
- krb5_free_context(context);
+ if (! g_make_string_buffer(str, output_name_buffer)) {
+ krb5_free_unparsed_name(context, str);
+ krb5_free_context(context);
- *minor_status = (OM_uint32) G_BUFFER_ALLOC;
- return(GSS_S_FAILURE);
- }
+ *minor_status = (OM_uint32) G_BUFFER_ALLOC;
+ return(GSS_S_FAILURE);
+ }
- krb5_free_unparsed_name(context, str);
- krb5_free_context(context);
+ krb5_free_unparsed_name(context, str);
+ krb5_free_context(context);
- *minor_status = 0;
- if (output_name_type)
- *output_name_type = (gss_OID) gss_nt_krb5_name;
- return(GSS_S_COMPLETE);
+ *minor_status = 0;
+ if (output_name_type)
+ *output_name_type = (gss_OID) gss_nt_krb5_name;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/disp_status.c b/src/lib/gssapi/krb5/disp_status.c
index 9a0399d78b..2ee6aceec4 100644
--- a/src/lib/gssapi/krb5/disp_status.c
+++ b/src/lib/gssapi/krb5/disp_status.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -30,11 +31,11 @@ static inline int
compare_OM_uint32 (OM_uint32 a, OM_uint32 b)
{
if (a < b)
- return -1;
+ return -1;
else if (a == b)
- return 0;
+ return 0;
else
- return 1;
+ return 1;
}
static inline void
free_string (char *s)
@@ -49,19 +50,19 @@ char *get_error_message(OM_uint32 minor_code)
char *msg = 0;
#ifdef DEBUG
fprintf(stderr, "%s(%lu, p=%p)", __func__, (unsigned long) minor_code,
- (void *) p);
+ (void *) p);
#endif
if (p) {
- char **v = gsserrmap_find(p, minor_code);
- if (v) {
- msg = *v;
+ char **v = gsserrmap_find(p, minor_code);
+ if (v) {
+ msg = *v;
#ifdef DEBUG
- fprintf(stderr, " FOUND!");
+ fprintf(stderr, " FOUND!");
#endif
- }
+ }
}
if (msg == 0)
- msg = error_message(minor_code);
+ msg = error_message(minor_code);
#ifdef DEBUG
fprintf(stderr, " -> %p/%s\n", (void *) msg, msg);
#endif
@@ -78,24 +79,24 @@ static int save_error_string_nocopy(OM_uint32 minor_code, char *msg)
#endif
p = k5_getspecific(K5_KEY_GSS_KRB5_ERROR_MESSAGE);
if (!p) {
- p = malloc(sizeof(*p));
- if (p == NULL) {
- ret = 1;
- goto fail;
- }
- if (gsserrmap_init(p) != 0) {
- free(p);
- p = NULL;
- ret = 1;
- goto fail;
- }
- if (k5_setspecific(K5_KEY_GSS_KRB5_ERROR_MESSAGE, p) != 0) {
- gsserrmap_destroy(p);
- free(p);
- p = NULL;
- ret = 1;
- goto fail;
- }
+ p = malloc(sizeof(*p));
+ if (p == NULL) {
+ ret = 1;
+ goto fail;
+ }
+ if (gsserrmap_init(p) != 0) {
+ free(p);
+ p = NULL;
+ ret = 1;
+ goto fail;
+ }
+ if (k5_setspecific(K5_KEY_GSS_KRB5_ERROR_MESSAGE, p) != 0) {
+ gsserrmap_destroy(p);
+ free(p);
+ p = NULL;
+ ret = 1;
+ goto fail;
+ }
}
ret = gsserrmap_replace_or_insert(p, minor_code, msg);
fail:
@@ -108,8 +109,8 @@ void save_error_string(OM_uint32 minor_code, char *msg)
{
char *s = strdup(msg);
if (s) {
- if (save_error_string_nocopy(minor_code, s) != 0)
- free(s);
+ if (save_error_string_nocopy(minor_code, s) != 0)
+ free(s);
}
}
void save_error_message(OM_uint32 minor_code, const char *format, ...)
@@ -122,8 +123,8 @@ void save_error_message(OM_uint32 minor_code, const char *format, ...)
n = vasprintf(&s, format, ap);
va_end(ap);
if (n >= 0) {
- if (save_error_string_nocopy(minor_code, s) != 0)
- free(s);
+ if (save_error_string_nocopy(minor_code, s) != 0)
+ free(s);
}
}
void krb5_gss_save_error_info(OM_uint32 minor_code, krb5_context ctx)
@@ -132,12 +133,12 @@ void krb5_gss_save_error_info(OM_uint32 minor_code, krb5_context ctx)
#ifdef DEBUG
fprintf(stderr, "%s(%lu, ctx=%p)\n", __func__,
- (unsigned long) minor_code, (void *)ctx);
+ (unsigned long) minor_code, (void *)ctx);
#endif
s = krb5_get_error_message(ctx, minor_code);
#ifdef DEBUG
fprintf(stderr, "%s(%lu, ctx=%p) saving: %s\n", __func__,
- (unsigned long) minor_code, (void *)ctx, s);
+ (unsigned long) minor_code, (void *)ctx, s);
#endif
save_error_string(minor_code, s);
/* The get_error_message call above resets the error message in
@@ -154,44 +155,44 @@ void krb5_gss_delete_error_info(void *p)
OM_uint32
krb5_gss_display_status(minor_status, status_value, status_type,
- mech_type, message_context, status_string)
- OM_uint32 *minor_status;
- OM_uint32 status_value;
- int status_type;
- gss_OID mech_type;
- OM_uint32 *message_context;
- gss_buffer_t status_string;
+ mech_type, message_context, status_string)
+ OM_uint32 *minor_status;
+ OM_uint32 status_value;
+ int status_type;
+ gss_OID mech_type;
+ OM_uint32 *message_context;
+ gss_buffer_t status_string;
{
- status_string->length = 0;
- status_string->value = NULL;
+ status_string->length = 0;
+ status_string->value = NULL;
- if ((mech_type != GSS_C_NULL_OID) &&
- !g_OID_equal(gss_mech_krb5, mech_type) &&
- !g_OID_equal(gss_mech_krb5_old, mech_type)) {
- *minor_status = 0;
- return(GSS_S_BAD_MECH);
+ if ((mech_type != GSS_C_NULL_OID) &&
+ !g_OID_equal(gss_mech_krb5, mech_type) &&
+ !g_OID_equal(gss_mech_krb5_old, mech_type)) {
+ *minor_status = 0;
+ return(GSS_S_BAD_MECH);
}
- if (status_type == GSS_C_GSS_CODE) {
- return(g_display_major_status(minor_status, status_value,
- message_context, status_string));
- } else if (status_type == GSS_C_MECH_CODE) {
- (void) gssint_initialize_library();
+ if (status_type == GSS_C_GSS_CODE) {
+ return(g_display_major_status(minor_status, status_value,
+ message_context, status_string));
+ } else if (status_type == GSS_C_MECH_CODE) {
+ (void) gssint_initialize_library();
- if (*message_context) {
- *minor_status = (OM_uint32) G_BAD_MSG_CTX;
- return(GSS_S_FAILURE);
- }
+ if (*message_context) {
+ *minor_status = (OM_uint32) G_BAD_MSG_CTX;
+ return(GSS_S_FAILURE);
+ }
- /* If this fails, there's not much we can do... */
- if (g_make_string_buffer(krb5_gss_get_error_message(status_value),
- status_string) != 0)
- *minor_status = ENOMEM;
- else
- *minor_status = 0;
- return 0;
- } else {
- *minor_status = 0;
- return(GSS_S_BAD_STATUS);
- }
+ /* If this fails, there's not much we can do... */
+ if (g_make_string_buffer(krb5_gss_get_error_message(status_value),
+ status_string) != 0)
+ *minor_status = ENOMEM;
+ else
+ *minor_status = 0;
+ return 0;
+ } else {
+ *minor_status = 0;
+ return(GSS_S_BAD_STATUS);
+ }
}
diff --git a/src/lib/gssapi/krb5/duplicate_name.c b/src/lib/gssapi/krb5/duplicate_name.c
index 5d352bdf36..add3a2ed03 100644
--- a/src/lib/gssapi/krb5/duplicate_name.c
+++ b/src/lib/gssapi/krb5/duplicate_name.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/duplicate_name.c
*
@@ -28,53 +29,47 @@
#include "gssapiP_krb5.h"
OM_uint32 krb5_gss_duplicate_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
- gss_name_t *dest_name)
+ const gss_name_t input_name,
+ gss_name_t *dest_name)
{
- krb5_context context;
- krb5_error_code code;
- krb5_principal princ, outprinc;
+ krb5_context context;
+ krb5_error_code code;
+ krb5_principal princ, outprinc;
- if (minor_status)
- *minor_status = 0;
-
- code = krb5_gss_init_context(&context);
- if (code) {
- if (minor_status)
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- if (! kg_validate_name(input_name)) {
- if (minor_status)
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
-
- princ = (krb5_principal)input_name;
- if ((code = krb5_copy_principal(context, princ, &outprinc))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- if (! kg_save_name((gss_name_t) outprinc)) {
- krb5_free_principal(context, outprinc);
- krb5_free_context(context);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
- }
-
- krb5_free_context(context);
- *dest_name = (gss_name_t) outprinc;
- return(GSS_S_COMPLETE);
-
-}
+ if (minor_status)
+ *minor_status = 0;
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ if (minor_status)
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+ if (! kg_validate_name(input_name)) {
+ if (minor_status)
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
+ princ = (krb5_principal)input_name;
+ if ((code = krb5_copy_principal(context, princ, &outprinc))) {
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ if (! kg_save_name((gss_name_t) outprinc)) {
+ krb5_free_principal(context, outprinc);
+ krb5_free_context(context);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
+ }
+ krb5_free_context(context);
+ *dest_name = (gss_name_t) outprinc;
+ return(GSS_S_COMPLETE);
+}
diff --git a/src/lib/gssapi/krb5/export_name.c b/src/lib/gssapi/krb5/export_name.c
index 9a54032b1d..d55a174e01 100644
--- a/src/lib/gssapi/krb5/export_name.c
+++ b/src/lib/gssapi/krb5/export_name.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/export_name.c
*
@@ -28,68 +29,68 @@
#include "gssapiP_krb5.h"
OM_uint32 krb5_gss_export_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
- gss_buffer_t exported_name)
+ const gss_name_t input_name,
+ gss_buffer_t exported_name)
{
- krb5_context context;
- krb5_error_code code;
- size_t length;
- char *str, *cp;
+ krb5_context context;
+ krb5_error_code code;
+ size_t length;
+ char *str, *cp;
- if (minor_status)
- *minor_status = 0;
+ if (minor_status)
+ *minor_status = 0;
- code = krb5_gss_init_context(&context);
- if (code) {
- if (minor_status)
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ if (minor_status)
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
- exported_name->length = 0;
- exported_name->value = NULL;
-
- if (! kg_validate_name(input_name)) {
- if (minor_status)
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
+ exported_name->length = 0;
+ exported_name->value = NULL;
- if ((code = krb5_unparse_name(context, (krb5_principal) input_name,
- &str))) {
- if (minor_status)
- *minor_status = code;
- save_error_info(code, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
+ if (! kg_validate_name(input_name)) {
+ if (minor_status)
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
- krb5_free_context(context);
- length = strlen(str);
- exported_name->length = 10 + length + gss_mech_krb5->length;
- exported_name->value = malloc(exported_name->length);
- if (!exported_name->value) {
- free(str);
- if (minor_status)
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- cp = exported_name->value;
+ if ((code = krb5_unparse_name(context, (krb5_principal) input_name,
+ &str))) {
+ if (minor_status)
+ *minor_status = code;
+ save_error_info(code, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
- /* Note: we assume the OID will be less than 128 bytes... */
- *cp++ = 0x04; *cp++ = 0x01;
- store_16_be(gss_mech_krb5->length+2, cp);
- cp += 2;
- *cp++ = 0x06;
- *cp++ = (gss_mech_krb5->length) & 0xFF;
- memcpy(cp, gss_mech_krb5->elements, gss_mech_krb5->length);
- cp += gss_mech_krb5->length;
- store_32_be(length, cp);
- cp += 4;
- memcpy(cp, str, length);
+ krb5_free_context(context);
+ length = strlen(str);
+ exported_name->length = 10 + length + gss_mech_krb5->length;
+ exported_name->value = malloc(exported_name->length);
+ if (!exported_name->value) {
+ free(str);
+ if (minor_status)
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ cp = exported_name->value;
- free(str);
+ /* Note: we assume the OID will be less than 128 bytes... */
+ *cp++ = 0x04; *cp++ = 0x01;
+ store_16_be(gss_mech_krb5->length+2, cp);
+ cp += 2;
+ *cp++ = 0x06;
+ *cp++ = (gss_mech_krb5->length) & 0xFF;
+ memcpy(cp, gss_mech_krb5->elements, gss_mech_krb5->length);
+ cp += gss_mech_krb5->length;
+ store_32_be(length, cp);
+ cp += 4;
+ memcpy(cp, str, length);
- return(GSS_S_COMPLETE);
+ free(str);
+
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/export_sec_context.c b/src/lib/gssapi/krb5/export_sec_context.c
index f20d853d05..6b618d7956 100644
--- a/src/lib/gssapi/krb5/export_sec_context.c
+++ b/src/lib/gssapi/krb5/export_sec_context.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/export_sec_context.c
*
@@ -26,22 +27,22 @@
*/
/*
- * export_sec_context.c - Externalize the security context.
+ * export_sec_context.c - Externalize the security context.
*/
#include "gssapiP_krb5.h"
#ifndef LEAN_CLIENT
OM_uint32
krb5_gss_export_sec_context(minor_status, context_handle, interprocess_token)
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_buffer_t interprocess_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_buffer_t interprocess_token;
{
- krb5_context context = NULL;
- krb5_error_code kret;
- OM_uint32 retval;
- size_t bufsize, blen;
- krb5_gss_ctx_id_t ctx;
- krb5_octet *obuffer, *obp;
+ krb5_context context = NULL;
+ krb5_error_code kret;
+ OM_uint32 retval;
+ size_t bufsize, blen;
+ krb5_gss_ctx_id_t ctx;
+ krb5_octet *obuffer, *obp;
/* Assume a tragic failure */
obuffer = (krb5_octet *) NULL;
@@ -49,35 +50,35 @@ krb5_gss_export_sec_context(minor_status, context_handle, interprocess_token)
*minor_status = 0;
if (!kg_validate_ctx_id(*context_handle)) {
- kret = (OM_uint32) G_VALIDATE_FAILED;
- retval = GSS_S_NO_CONTEXT;
- goto error_out;
+ kret = (OM_uint32) G_VALIDATE_FAILED;
+ retval = GSS_S_NO_CONTEXT;
+ goto error_out;
}
ctx = (krb5_gss_ctx_id_t) *context_handle;
context = ctx->k5_context;
kret = krb5_gss_ser_init(context);
if (kret)
- goto error_out;
+ goto error_out;
/* Determine size needed for externalization of context */
bufsize = 0;
if ((kret = kg_ctx_size(context, (krb5_pointer) ctx,
- &bufsize)))
- goto error_out;
+ &bufsize)))
+ goto error_out;
/* Allocate the buffer */
if ((obuffer = (krb5_octet *) xmalloc(bufsize)) == NULL) {
- kret = ENOMEM;
- goto error_out;
+ kret = ENOMEM;
+ goto error_out;
}
obp = obuffer;
blen = bufsize;
/* Externalize the context */
if ((kret = kg_ctx_externalize(context,
- (krb5_pointer) ctx, &obp, &blen)))
- goto error_out;
+ (krb5_pointer) ctx, &obp, &blen)))
+ goto error_out;
/* Success! Return the buffer */
interprocess_token->length = bufsize - blen;
@@ -93,14 +94,14 @@ krb5_gss_export_sec_context(minor_status, context_handle, interprocess_token)
error_out:
if (retval != GSS_S_COMPLETE)
- if (kret != 0 && context != 0)
- save_error_info(kret, context);
+ if (kret != 0 && context != 0)
+ save_error_info(kret, context);
if (obuffer && bufsize) {
- memset(obuffer, 0, bufsize);
- xfree(obuffer);
+ memset(obuffer, 0, bufsize);
+ xfree(obuffer);
}
- if (*minor_status == 0)
- *minor_status = (OM_uint32) kret;
+ if (*minor_status == 0)
+ *minor_status = (OM_uint32) kret;
return(retval);
}
#endif /* LEAN_CLIENT */
diff --git a/src/lib/gssapi/krb5/get_tkt_flags.c b/src/lib/gssapi/krb5/get_tkt_flags.c
index 19841a086d..f4d9b92d2d 100644
--- a/src/lib/gssapi/krb5/get_tkt_flags.c
+++ b/src/lib/gssapi/krb5/get_tkt_flags.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -26,30 +27,30 @@
* $Id$
*/
-OM_uint32 KRB5_CALLCONV
+OM_uint32 KRB5_CALLCONV
gss_krb5int_get_tkt_flags(minor_status, context_handle, ticket_flags)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- krb5_flags *ticket_flags;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ krb5_flags *ticket_flags;
{
- krb5_gss_ctx_id_rec *ctx;
+ krb5_gss_ctx_id_rec *ctx;
- /* validate the context handle */
- if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
+ /* validate the context handle */
+ if (! kg_validate_ctx_id(context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
- ctx = (krb5_gss_ctx_id_rec *) context_handle;
+ ctx = (krb5_gss_ctx_id_rec *) context_handle;
- if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
- }
+ if (! ctx->established) {
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
+ }
- if (ticket_flags)
- *ticket_flags = ctx->krb_flags;
+ if (ticket_flags)
+ *ticket_flags = ctx->krb_flags;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/gssapiP_krb5.h b/src/lib/gssapi/krb5/gssapiP_krb5.h
index 33036fc534..617024b7c3 100644
--- a/src/lib/gssapi/krb5/gssapiP_krb5.h
+++ b/src/lib/gssapi/krb5/gssapiP_krb5.h
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000, 2008 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -85,44 +86,44 @@
#define GSS_MECH_KRB5_WRONG_OID "\052\206\110\202\367\022\001\002\002"
-#define CKSUMTYPE_KG_CB 0x8003
+#define CKSUMTYPE_KG_CB 0x8003
-#define KG_TOK_CTX_AP_REQ 0x0100
-#define KG_TOK_CTX_AP_REP 0x0200
-#define KG_TOK_CTX_ERROR 0x0300
-#define KG_TOK_SIGN_MSG 0x0101
-#define KG_TOK_SEAL_MSG 0x0201
-#define KG_TOK_MIC_MSG 0x0101
-#define KG_TOK_WRAP_MSG 0x0201
-#define KG_TOK_DEL_CTX 0x0102
+#define KG_TOK_CTX_AP_REQ 0x0100
+#define KG_TOK_CTX_AP_REP 0x0200
+#define KG_TOK_CTX_ERROR 0x0300
+#define KG_TOK_SIGN_MSG 0x0101
+#define KG_TOK_SEAL_MSG 0x0201
+#define KG_TOK_MIC_MSG 0x0101
+#define KG_TOK_WRAP_MSG 0x0201
+#define KG_TOK_DEL_CTX 0x0102
-#define KG2_TOK_INITIAL 0x0101
-#define KG2_TOK_RESPONSE 0x0202
-#define KG2_TOK_MIC 0x0303
-#define KG2_TOK_WRAP_INTEG 0x0404
-#define KG2_TOK_WRAP_PRIV 0x0505
+#define KG2_TOK_INITIAL 0x0101
+#define KG2_TOK_RESPONSE 0x0202
+#define KG2_TOK_MIC 0x0303
+#define KG2_TOK_WRAP_INTEG 0x0404
+#define KG2_TOK_WRAP_PRIV 0x0505
#define KRB5_GSS_FOR_CREDS_OPTION 1
-#define KG2_RESP_FLAG_ERROR 0x0001
-#define KG2_RESP_FLAG_DELEG_OK 0x0002
+#define KG2_RESP_FLAG_ERROR 0x0001
+#define KG2_RESP_FLAG_DELEG_OK 0x0002
/* These are to be stored in little-endian order, i.e., des-mac is
stored as 02 00. */
enum sgn_alg {
- SGN_ALG_DES_MAC_MD5 = 0x0000,
- SGN_ALG_MD2_5 = 0x0001,
- SGN_ALG_DES_MAC = 0x0002,
- SGN_ALG_3 = 0x0003, /* not published */
- SGN_ALG_HMAC_MD5 = 0x0011, /* microsoft w2k; */
- SGN_ALG_HMAC_SHA1_DES3_KD = 0x0004
+ SGN_ALG_DES_MAC_MD5 = 0x0000,
+ SGN_ALG_MD2_5 = 0x0001,
+ SGN_ALG_DES_MAC = 0x0002,
+ SGN_ALG_3 = 0x0003, /* not published */
+ SGN_ALG_HMAC_MD5 = 0x0011, /* microsoft w2k; */
+ SGN_ALG_HMAC_SHA1_DES3_KD = 0x0004
};
enum seal_alg {
- SEAL_ALG_NONE = 0xffff,
- SEAL_ALG_DES = 0x0000,
- SEAL_ALG_1 = 0x0001, /* not published */
- SEAL_ALG_MICROSOFT_RC4 = 0x0010, /* microsoft w2k; */
- SEAL_ALG_DES3KD = 0x0002
+ SEAL_ALG_NONE = 0xffff,
+ SEAL_ALG_DES = 0x0000,
+ SEAL_ALG_1 = 0x0001, /* not published */
+ SEAL_ALG_MICROSOFT_RC4 = 0x0010, /* microsoft w2k; */
+ SEAL_ALG_DES3KD = 0x0002
};
/* for 3DES */
@@ -131,20 +132,20 @@ enum seal_alg {
#define KG_USAGE_SEQ 24
/* for draft-ietf-krb-wg-gssapi-cfx-01 */
-#define KG_USAGE_ACCEPTOR_SEAL 22
-#define KG_USAGE_ACCEPTOR_SIGN 23
-#define KG_USAGE_INITIATOR_SEAL 24
-#define KG_USAGE_INITIATOR_SIGN 25
+#define KG_USAGE_ACCEPTOR_SEAL 22
+#define KG_USAGE_ACCEPTOR_SIGN 23
+#define KG_USAGE_INITIATOR_SEAL 24
+#define KG_USAGE_INITIATOR_SIGN 25
enum qop {
- GSS_KRB5_INTEG_C_QOP_MD5 = 0x0001, /* *partial* MD5 = "MD2.5" */
- GSS_KRB5_INTEG_C_QOP_DES_MD5 = 0x0002,
- GSS_KRB5_INTEG_C_QOP_DES_MAC = 0x0003,
- GSS_KRB5_INTEG_C_QOP_HMAC_SHA1 = 0x0004,
- GSS_KRB5_INTEG_C_QOP_MASK = 0x00ff,
- GSS_KRB5_CONF_C_QOP_DES = 0x0100,
- GSS_KRB5_CONF_C_QOP_DES3_KD = 0x0200,
- GSS_KRB5_CONF_C_QOP_MASK = 0xff00
+ GSS_KRB5_INTEG_C_QOP_MD5 = 0x0001, /* *partial* MD5 = "MD2.5" */
+ GSS_KRB5_INTEG_C_QOP_DES_MD5 = 0x0002,
+ GSS_KRB5_INTEG_C_QOP_DES_MAC = 0x0003,
+ GSS_KRB5_INTEG_C_QOP_HMAC_SHA1 = 0x0004,
+ GSS_KRB5_INTEG_C_QOP_MASK = 0x00ff,
+ GSS_KRB5_CONF_C_QOP_DES = 0x0100,
+ GSS_KRB5_CONF_C_QOP_DES3_KD = 0x0200,
+ GSS_KRB5_CONF_C_QOP_MASK = 0xff00
};
/** internal types **/
@@ -152,61 +153,61 @@ enum qop {
typedef krb5_principal krb5_gss_name_t;
typedef struct _krb5_gss_cred_id_rec {
- /* protect against simultaneous accesses */
- k5_mutex_t lock;
+ /* protect against simultaneous accesses */
+ k5_mutex_t lock;
- /* name/type of credential */
- gss_cred_usage_t usage;
- krb5_principal princ; /* this is not interned as a gss_name_t */
- int prerfc_mech;
- int rfc_mech;
+ /* name/type of credential */
+ gss_cred_usage_t usage;
+ krb5_principal princ; /* this is not interned as a gss_name_t */
+ int prerfc_mech;
+ int rfc_mech;
- /* keytab (accept) data */
- krb5_keytab keytab;
- krb5_rcache rcache;
+ /* keytab (accept) data */
+ krb5_keytab keytab;
+ krb5_rcache rcache;
- /* ccache (init) data */
- krb5_ccache ccache;
- krb5_timestamp tgt_expire;
- krb5_enctype *req_enctypes; /* limit negotiated enctypes to this list */
-} krb5_gss_cred_id_rec, *krb5_gss_cred_id_t;
+ /* ccache (init) data */
+ krb5_ccache ccache;
+ krb5_timestamp tgt_expire;
+ krb5_enctype *req_enctypes; /* limit negotiated enctypes to this list */
+} krb5_gss_cred_id_rec, *krb5_gss_cred_id_t;
typedef struct _krb5_gss_ctx_id_rec {
- unsigned int initiate : 1; /* nonzero if initiating, zero if accepting */
- unsigned int established : 1;
- unsigned int big_endian : 1;
- unsigned int have_acceptor_subkey : 1;
- unsigned int seed_init : 1; /* XXX tested but never actually set */
- OM_uint32 gss_flags;
- unsigned char seed[16];
- krb5_principal here;
- krb5_principal there;
- krb5_keyblock *subkey;
- int signalg;
- size_t cksum_size;
- int sealalg;
- krb5_keyblock *enc;
- krb5_keyblock *seq;
- krb5_timestamp endtime;
- krb5_flags krb_flags;
- /* XXX these used to be signed. the old spec is inspecific, and
- the new spec specifies unsigned. I don't believe that the change
- affects the wire encoding. */
- gssint_uint64 seq_send;
- gssint_uint64 seq_recv;
- void *seqstate;
- krb5_context k5_context;
- krb5_auth_context auth_context;
- gss_OID_desc *mech_used;
+ unsigned int initiate : 1; /* nonzero if initiating, zero if accepting */
+ unsigned int established : 1;
+ unsigned int big_endian : 1;
+ unsigned int have_acceptor_subkey : 1;
+ unsigned int seed_init : 1; /* XXX tested but never actually set */
+ OM_uint32 gss_flags;
+ unsigned char seed[16];
+ krb5_principal here;
+ krb5_principal there;
+ krb5_keyblock *subkey;
+ int signalg;
+ size_t cksum_size;
+ int sealalg;
+ krb5_keyblock *enc;
+ krb5_keyblock *seq;
+ krb5_timestamp endtime;
+ krb5_flags krb_flags;
+ /* XXX these used to be signed. the old spec is inspecific, and
+ the new spec specifies unsigned. I don't believe that the change
+ affects the wire encoding. */
+ gssint_uint64 seq_send;
+ gssint_uint64 seq_recv;
+ void *seqstate;
+ krb5_context k5_context;
+ krb5_auth_context auth_context;
+ gss_OID_desc *mech_used;
/* Protocol spec revision
0 => RFC 1964 with 3DES and RC4 enhancements
1 => draft-ietf-krb-wg-gssapi-cfx-01
No others defined so far. */
- int proto;
- krb5_cksumtype cksumtype; /* for "main" subkey */
- krb5_keyblock *acceptor_subkey; /* CFX only */
- krb5_cksumtype acceptor_subkey_cksumtype;
- int cred_rcache; /* did we get rcache from creds? */
+ int proto;
+ krb5_cksumtype cksumtype; /* for "main" subkey */
+ krb5_keyblock *acceptor_subkey; /* CFX only */
+ krb5_cksumtype acceptor_subkey_cksumtype;
+ int cred_rcache; /* did we get rcache from creds? */
} krb5_gss_ctx_id_rec, *krb5_gss_ctx_id_t;
extern g_set kg_vdb;
@@ -217,471 +218,471 @@ extern k5_mutex_t gssint_krb5_keytab_lock;
/* helper macros */
-#define kg_save_name(name) g_save_name(&kg_vdb,name)
-#define kg_save_cred_id(cred) g_save_cred_id(&kg_vdb,cred)
-#define kg_save_ctx_id(ctx) g_save_ctx_id(&kg_vdb,ctx)
-#define kg_save_lucidctx_id(lctx) g_save_lucidctx_id(&kg_vdb,lctx)
+#define kg_save_name(name) g_save_name(&kg_vdb,name)
+#define kg_save_cred_id(cred) g_save_cred_id(&kg_vdb,cred)
+#define kg_save_ctx_id(ctx) g_save_ctx_id(&kg_vdb,ctx)
+#define kg_save_lucidctx_id(lctx) g_save_lucidctx_id(&kg_vdb,lctx)
-#define kg_validate_name(name) g_validate_name(&kg_vdb,name)
-#define kg_validate_cred_id(cred) g_validate_cred_id(&kg_vdb,cred)
-#define kg_validate_ctx_id(ctx) g_validate_ctx_id(&kg_vdb,ctx)
-#define kg_validate_lucidctx_id(lctx) g_validate_lucidctx_id(&kg_vdb,lctx)
+#define kg_validate_name(name) g_validate_name(&kg_vdb,name)
+#define kg_validate_cred_id(cred) g_validate_cred_id(&kg_vdb,cred)
+#define kg_validate_ctx_id(ctx) g_validate_ctx_id(&kg_vdb,ctx)
+#define kg_validate_lucidctx_id(lctx) g_validate_lucidctx_id(&kg_vdb,lctx)
-#define kg_delete_name(name) g_delete_name(&kg_vdb,name)
-#define kg_delete_cred_id(cred) g_delete_cred_id(&kg_vdb,cred)
-#define kg_delete_ctx_id(ctx) g_delete_ctx_id(&kg_vdb,ctx)
-#define kg_delete_lucidctx_id(lctx) g_delete_lucidctx_id(&kg_vdb,lctx)
+#define kg_delete_name(name) g_delete_name(&kg_vdb,name)
+#define kg_delete_cred_id(cred) g_delete_cred_id(&kg_vdb,cred)
+#define kg_delete_ctx_id(ctx) g_delete_ctx_id(&kg_vdb,ctx)
+#define kg_delete_lucidctx_id(lctx) g_delete_lucidctx_id(&kg_vdb,lctx)
/** helper functions **/
-OM_uint32 kg_get_defcred
- (OM_uint32 *minor_status,
- gss_cred_id_t *cred);
+OM_uint32 kg_get_defcred
+(OM_uint32 *minor_status,
+ gss_cred_id_t *cred);
krb5_error_code kg_checksum_channel_bindings
- (krb5_context context, gss_channel_bindings_t cb,
- krb5_checksum *cksum,
- int bigend);
+(krb5_context context, gss_channel_bindings_t cb,
+ krb5_checksum *cksum,
+ int bigend);
krb5_error_code kg_make_seq_num (krb5_context context,
- krb5_keyblock *key,
- int direction, krb5_ui_4 seqnum, unsigned char *cksum,
- unsigned char *buf);
+ krb5_keyblock *key,
+ int direction, krb5_ui_4 seqnum, unsigned char *cksum,
+ unsigned char *buf);
krb5_error_code kg_get_seq_num (krb5_context context,
- krb5_keyblock *key,
- unsigned char *cksum, unsigned char *buf, int *direction,
- krb5_ui_4 *seqnum);
+ krb5_keyblock *key,
+ unsigned char *cksum, unsigned char *buf, int *direction,
+ krb5_ui_4 *seqnum);
krb5_error_code kg_make_seed (krb5_context context,
- krb5_keyblock *key,
- unsigned char *seed);
+ krb5_keyblock *key,
+ unsigned char *seed);
int kg_confounder_size (krb5_context context, krb5_keyblock *key);
-krb5_error_code kg_make_confounder (krb5_context context,
- krb5_keyblock *key, unsigned char *buf);
+krb5_error_code kg_make_confounder (krb5_context context,
+ krb5_keyblock *key, unsigned char *buf);
-krb5_error_code kg_encrypt (krb5_context context,
- krb5_keyblock *key, int usage,
- krb5_pointer iv,
- krb5_const_pointer in,
- krb5_pointer out,
- unsigned int length);
+krb5_error_code kg_encrypt (krb5_context context,
+ krb5_keyblock *key, int usage,
+ krb5_pointer iv,
+ krb5_const_pointer in,
+ krb5_pointer out,
+ unsigned int length);
krb5_error_code
kg_arcfour_docrypt (const krb5_keyblock *longterm_key , int ms_usage,
- const unsigned char *kd_data, size_t kd_data_len,
- const unsigned char *input_buf, size_t input_len,
- unsigned char *output_buf);
+ const unsigned char *kd_data, size_t kd_data_len,
+ const unsigned char *input_buf, size_t input_len,
+ unsigned char *output_buf);
krb5_error_code kg_decrypt (krb5_context context,
- krb5_keyblock *key, int usage,
- krb5_pointer iv,
- krb5_const_pointer in,
- krb5_pointer out,
- unsigned int length);
+ krb5_keyblock *key, int usage,
+ krb5_pointer iv,
+ krb5_const_pointer in,
+ krb5_pointer out,
+ unsigned int length);
OM_uint32 kg_seal (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- int conf_req_flag,
- int qop_req,
- gss_buffer_t input_message_buffer,
- int *conf_state,
- gss_buffer_t output_message_buffer,
- int toktype);
+ gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ int qop_req,
+ gss_buffer_t input_message_buffer,
+ int *conf_state,
+ gss_buffer_t output_message_buffer,
+ int toktype);
OM_uint32 kg_unseal (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- gss_buffer_t input_token_buffer,
- gss_buffer_t message_buffer,
- int *conf_state,
- int *qop_state,
- int toktype);
+ gss_ctx_id_t context_handle,
+ gss_buffer_t input_token_buffer,
+ gss_buffer_t message_buffer,
+ int *conf_state,
+ int *qop_state,
+ int toktype);
OM_uint32 kg_seal_size (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- int conf_req_flag,
- gss_qop_t qop_req,
- OM_uint32 output_size,
- OM_uint32 *input_size);
+ gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ gss_qop_t qop_req,
+ OM_uint32 output_size,
+ OM_uint32 *input_size);
krb5_error_code kg_ctx_size (krb5_context kcontext,
- krb5_pointer arg,
- size_t *sizep);
+ krb5_pointer arg,
+ size_t *sizep);
krb5_error_code kg_ctx_externalize (krb5_context kcontext,
- krb5_pointer arg,
- krb5_octet **buffer,
- size_t *lenremain);
+ krb5_pointer arg,
+ krb5_octet **buffer,
+ size_t *lenremain);
krb5_error_code kg_ctx_internalize (krb5_context kcontext,
- krb5_pointer *argp,
- krb5_octet **buffer,
- size_t *lenremain);
+ krb5_pointer *argp,
+ krb5_octet **buffer,
+ size_t *lenremain);
OM_uint32 kg_sync_ccache_name (krb5_context context, OM_uint32 *minor_status);
-OM_uint32 kg_caller_provided_ccache_name (OM_uint32 *minor_status,
+OM_uint32 kg_caller_provided_ccache_name (OM_uint32 *minor_status,
int *out_caller_provided_name);
-OM_uint32 kg_get_ccache_name (OM_uint32 *minor_status,
+OM_uint32 kg_get_ccache_name (OM_uint32 *minor_status,
const char **out_name);
-OM_uint32 kg_set_ccache_name (OM_uint32 *minor_status,
+OM_uint32 kg_set_ccache_name (OM_uint32 *minor_status,
const char *name);
/** declarations of internal name mechanism functions **/
OM_uint32 krb5_gss_acquire_cred
(OM_uint32*, /* minor_status */
- gss_name_t, /* desired_name */
- OM_uint32, /* time_req */
- gss_OID_set, /* desired_mechs */
- gss_cred_usage_t, /* cred_usage */
- gss_cred_id_t*, /* output_cred_handle */
- gss_OID_set*, /* actual_mechs */
- OM_uint32* /* time_rec */
- );
+ gss_name_t, /* desired_name */
+ OM_uint32, /* time_req */
+ gss_OID_set, /* desired_mechs */
+ gss_cred_usage_t, /* cred_usage */
+ gss_cred_id_t*, /* output_cred_handle */
+ gss_OID_set*, /* actual_mechs */
+ OM_uint32* /* time_rec */
+);
OM_uint32 krb5_gss_release_cred
(OM_uint32*, /* minor_status */
- gss_cred_id_t* /* cred_handle */
- );
+ gss_cred_id_t* /* cred_handle */
+);
OM_uint32 krb5_gss_init_sec_context
(OM_uint32*, /* minor_status */
- gss_cred_id_t, /* claimant_cred_handle */
- gss_ctx_id_t*, /* context_handle */
- gss_name_t, /* target_name */
- gss_OID, /* mech_type */
- OM_uint32, /* req_flags */
- OM_uint32, /* time_req */
- gss_channel_bindings_t,
- /* input_chan_bindings */
- gss_buffer_t, /* input_token */
- gss_OID*, /* actual_mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32*, /* ret_flags */
- OM_uint32* /* time_rec */
- );
+ gss_cred_id_t, /* claimant_cred_handle */
+ gss_ctx_id_t*, /* context_handle */
+ gss_name_t, /* target_name */
+ gss_OID, /* mech_type */
+ OM_uint32, /* req_flags */
+ OM_uint32, /* time_req */
+ gss_channel_bindings_t,
+ /* input_chan_bindings */
+ gss_buffer_t, /* input_token */
+ gss_OID*, /* actual_mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32*, /* ret_flags */
+ OM_uint32* /* time_rec */
+);
#ifndef LEAN_CLIENT
OM_uint32 krb5_gss_accept_sec_context
(OM_uint32*, /* minor_status */
- gss_ctx_id_t*, /* context_handle */
- gss_cred_id_t, /* verifier_cred_handle */
- gss_buffer_t, /* input_token_buffer */
- gss_channel_bindings_t,
- /* input_chan_bindings */
- gss_name_t*, /* src_name */
- gss_OID*, /* mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32*, /* ret_flags */
- OM_uint32*, /* time_rec */
- gss_cred_id_t* /* delegated_cred_handle */
- );
+ gss_ctx_id_t*, /* context_handle */
+ gss_cred_id_t, /* verifier_cred_handle */
+ gss_buffer_t, /* input_token_buffer */
+ gss_channel_bindings_t,
+ /* input_chan_bindings */
+ gss_name_t*, /* src_name */
+ gss_OID*, /* mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32*, /* ret_flags */
+ OM_uint32*, /* time_rec */
+ gss_cred_id_t* /* delegated_cred_handle */
+);
#endif /* LEAN_CLIENT */
OM_uint32 krb5_gss_process_context_token
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t /* token_buffer */
- );
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t /* token_buffer */
+);
OM_uint32 krb5_gss_delete_sec_context
(OM_uint32*, /* minor_status */
- gss_ctx_id_t*, /* context_handle */
- gss_buffer_t /* output_token */
- );
+ gss_ctx_id_t*, /* context_handle */
+ gss_buffer_t /* output_token */
+);
OM_uint32 krb5_gss_context_time
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- OM_uint32* /* time_rec */
- );
+ gss_ctx_id_t, /* context_handle */
+ OM_uint32* /* time_rec */
+);
OM_uint32 krb5_gss_sign
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
+ gss_ctx_id_t, /* context_handle */
+ int, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t /* message_token */
+);
OM_uint32 krb5_gss_verify
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* token_buffer */
- int* /* qop_state */
- );
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* token_buffer */
+ int* /* qop_state */
+);
OM_uint32 krb5_gss_seal
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- int, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int*, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ int, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int*, /* conf_state */
+ gss_buffer_t /* output_message_buffer */
+);
OM_uint32 krb5_gss_unseal
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int*, /* conf_state */
- int* /* qop_state */
- );
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int*, /* conf_state */
+ int* /* qop_state */
+);
OM_uint32 krb5_gss_display_status
(OM_uint32*, /* minor_status */
- OM_uint32, /* status_value */
- int, /* status_type */
- gss_OID, /* mech_type */
- OM_uint32*, /* message_context */
- gss_buffer_t /* status_string */
- );
+ OM_uint32, /* status_value */
+ int, /* status_type */
+ gss_OID, /* mech_type */
+ OM_uint32*, /* message_context */
+ gss_buffer_t /* status_string */
+);
OM_uint32 krb5_gss_indicate_mechs
(OM_uint32*, /* minor_status */
- gss_OID_set* /* mech_set */
- );
+ gss_OID_set* /* mech_set */
+);
OM_uint32 krb5_gss_compare_name
(OM_uint32*, /* minor_status */
- gss_name_t, /* name1 */
- gss_name_t, /* name2 */
- int* /* name_equal */
- );
+ gss_name_t, /* name1 */
+ gss_name_t, /* name2 */
+ int* /* name_equal */
+);
OM_uint32 krb5_gss_display_name
(OM_uint32*, /* minor_status */
- gss_name_t, /* input_name */
- gss_buffer_t, /* output_name_buffer */
- gss_OID* /* output_name_type */
- );
+ gss_name_t, /* input_name */
+ gss_buffer_t, /* output_name_buffer */
+ gss_OID* /* output_name_type */
+);
OM_uint32 krb5_gss_import_name
(OM_uint32*, /* minor_status */
- gss_buffer_t, /* input_name_buffer */
- gss_OID, /* input_name_type */
- gss_name_t* /* output_name */
- );
+ gss_buffer_t, /* input_name_buffer */
+ gss_OID, /* input_name_type */
+ gss_name_t* /* output_name */
+);
OM_uint32 krb5_gss_release_name
(OM_uint32*, /* minor_status */
- gss_name_t* /* input_name */
- );
+ gss_name_t* /* input_name */
+);
OM_uint32 krb5_gss_inquire_cred
(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_name_t *, /* name */
- OM_uint32 *, /* lifetime */
- gss_cred_usage_t*,/* cred_usage */
- gss_OID_set * /* mechanisms */
- );
+ gss_cred_id_t, /* cred_handle */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* lifetime */
+ gss_cred_usage_t*,/* cred_usage */
+ gss_OID_set * /* mechanisms */
+);
OM_uint32 krb5_gss_inquire_context
(OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_name_t*, /* initiator_name */
- gss_name_t*, /* acceptor_name */
- OM_uint32*, /* lifetime_rec */
- gss_OID*, /* mech_type */
- OM_uint32*, /* ret_flags */
- int*, /* locally_initiated */
- int* /* open */
- );
+ gss_ctx_id_t, /* context_handle */
+ gss_name_t*, /* initiator_name */
+ gss_name_t*, /* acceptor_name */
+ OM_uint32*, /* lifetime_rec */
+ gss_OID*, /* mech_type */
+ OM_uint32*, /* ret_flags */
+ int*, /* locally_initiated */
+ int* /* open */
+);
/* New V2 entry points */
OM_uint32 krb5_gss_get_mic
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t /* message_token */
+);
OM_uint32 krb5_gss_verify_mic
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* message_token */
- gss_qop_t * /* qop_state */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* message_token */
+ gss_qop_t * /* qop_state */
+);
OM_uint32 krb5_gss_wrap
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int *, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int *, /* conf_state */
+ gss_buffer_t /* output_message_buffer */
+);
OM_uint32 krb5_gss_unwrap
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int *, /* conf_state */
- gss_qop_t * /* qop_state */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int *, /* conf_state */
+ gss_qop_t * /* qop_state */
+);
OM_uint32 krb5_gss_wrap_size_limit
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- OM_uint32, /* req_output_size */
- OM_uint32 * /* max_input_size */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ OM_uint32, /* req_output_size */
+ OM_uint32 * /* max_input_size */
+);
OM_uint32 krb5_gss_import_name_object
-(OM_uint32 *, /* minor_status */
- void *, /* input_name */
- gss_OID, /* input_name_type */
- gss_name_t * /* output_name */
- );
+(OM_uint32 *, /* minor_status */
+ void *, /* input_name */
+ gss_OID, /* input_name_type */
+ gss_name_t * /* output_name */
+);
OM_uint32 krb5_gss_export_name_object
-(OM_uint32 *, /* minor_status */
- gss_name_t, /* input_name */
- gss_OID, /* desired_name_type */
- void * * /* output_name */
- );
+(OM_uint32 *, /* minor_status */
+ gss_name_t, /* input_name */
+ gss_OID, /* desired_name_type */
+ void * * /* output_name */
+);
OM_uint32 krb5_gss_add_cred
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* input_cred_handle */
- gss_name_t, /* desired_name */
- gss_OID, /* desired_mech */
- gss_cred_usage_t, /* cred_usage */
- OM_uint32, /* initiator_time_req */
- OM_uint32, /* acceptor_time_req */
- gss_cred_id_t *, /* output_cred_handle */
- gss_OID_set *, /* actual_mechs */
- OM_uint32 *, /* initiator_time_rec */
- OM_uint32 * /* acceptor_time_rec */
- );
+(OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* input_cred_handle */
+ gss_name_t, /* desired_name */
+ gss_OID, /* desired_mech */
+ gss_cred_usage_t, /* cred_usage */
+ OM_uint32, /* initiator_time_req */
+ OM_uint32, /* acceptor_time_req */
+ gss_cred_id_t *, /* output_cred_handle */
+ gss_OID_set *, /* actual_mechs */
+ OM_uint32 *, /* initiator_time_rec */
+ OM_uint32 * /* acceptor_time_rec */
+);
OM_uint32 krb5_gss_inquire_cred_by_mech
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_OID, /* mech_type */
- gss_name_t *, /* name */
- OM_uint32 *, /* initiator_lifetime */
- OM_uint32 *, /* acceptor_lifetime */
- gss_cred_usage_t * /* cred_usage */
- );
+(OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* cred_handle */
+ gss_OID, /* mech_type */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* initiator_lifetime */
+ OM_uint32 *, /* acceptor_lifetime */
+ gss_cred_usage_t * /* cred_usage */
+);
#ifndef LEAN_CLIENT
OM_uint32 krb5_gss_export_sec_context
-(OM_uint32 *, /* minor_status */
- gss_ctx_id_t *, /* context_handle */
- gss_buffer_t /* interprocess_token */
- );
+(OM_uint32 *, /* minor_status */
+ gss_ctx_id_t *, /* context_handle */
+ gss_buffer_t /* interprocess_token */
+);
OM_uint32 krb5_gss_import_sec_context
-(OM_uint32 *, /* minor_status */
- gss_buffer_t, /* interprocess_token */
- gss_ctx_id_t * /* context_handle */
- );
+(OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* interprocess_token */
+ gss_ctx_id_t * /* context_handle */
+);
#endif /* LEAN_CLIENT */
krb5_error_code krb5_gss_ser_init(krb5_context);
OM_uint32 krb5_gss_release_oid
-(OM_uint32 *, /* minor_status */
- gss_OID * /* oid */
- );
+(OM_uint32 *, /* minor_status */
+ gss_OID * /* oid */
+);
OM_uint32 krb5_gss_internal_release_oid
-(OM_uint32 *, /* minor_status */
- gss_OID * /* oid */
- );
+(OM_uint32 *, /* minor_status */
+ gss_OID * /* oid */
+);
OM_uint32 krb5_gss_inquire_names_for_mech
-(OM_uint32 *, /* minor_status */
- gss_OID, /* mechanism */
- gss_OID_set * /* name_types */
- );
+(OM_uint32 *, /* minor_status */
+ gss_OID, /* mechanism */
+ gss_OID_set * /* name_types */
+);
OM_uint32 krb5_gss_canonicalize_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- const gss_OID, /* mech_type */
- gss_name_t * /* output_name */
- );
-
+(OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ const gss_OID, /* mech_type */
+ gss_name_t * /* output_name */
+);
+
OM_uint32 krb5_gss_export_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_buffer_t /* exported_name */
- );
+(OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_buffer_t /* exported_name */
+);
OM_uint32 krb5_gss_duplicate_name
-(OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_name_t * /* dest_name */
- );
+(OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_name_t * /* dest_name */
+);
OM_uint32 krb5_gss_validate_cred
-(OM_uint32 *, /* minor_status */
- gss_cred_id_t /* cred */
- );
+(OM_uint32 *, /* minor_status */
+ gss_cred_id_t /* cred */
+);
OM_uint32
krb5_gss_validate_cred_1(OM_uint32 * /* minor_status */,
- gss_cred_id_t /* cred_handle */,
- krb5_context /* context */);
+ gss_cred_id_t /* cred_handle */,
+ krb5_context /* context */);
gss_OID krb5_gss_convert_static_mech_oid(gss_OID oid);
-
+
krb5_error_code gss_krb5int_make_seal_token_v3(krb5_context,
- krb5_gss_ctx_id_rec *,
- const gss_buffer_desc *,
- gss_buffer_t,
- int, int);
+ krb5_gss_ctx_id_rec *,
+ const gss_buffer_desc *,
+ gss_buffer_t,
+ int, int);
OM_uint32 gss_krb5int_unseal_token_v3(krb5_context *contextptr,
- OM_uint32 *minor_status,
- krb5_gss_ctx_id_rec *ctx,
- unsigned char *ptr,
- unsigned int bodysize,
- gss_buffer_t message_buffer,
- int *conf_state, int *qop_state,
- int toktype);
+ OM_uint32 *minor_status,
+ krb5_gss_ctx_id_rec *ctx,
+ unsigned char *ptr,
+ unsigned int bodysize,
+ gss_buffer_t message_buffer,
+ int *conf_state, int *qop_state,
+ int toktype);
/*
* These take unglued krb5-mech-specific contexts.
*/
-OM_uint32 KRB5_CALLCONV gss_krb5int_get_tkt_flags
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- krb5_flags *ticket_flags);
+OM_uint32 KRB5_CALLCONV gss_krb5int_get_tkt_flags
+(OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ krb5_flags *ticket_flags);
OM_uint32 KRB5_CALLCONV gss_krb5int_copy_ccache
- (OM_uint32 *minor_status,
- gss_cred_id_t cred_handle,
- krb5_ccache out_ccache);
+(OM_uint32 *minor_status,
+ gss_cred_id_t cred_handle,
+ krb5_ccache out_ccache);
OM_uint32 KRB5_CALLCONV
-gss_krb5int_set_allowable_enctypes(OM_uint32 *minor_status,
- gss_cred_id_t cred,
- OM_uint32 num_ktypes,
- krb5_enctype *ktypes);
+gss_krb5int_set_allowable_enctypes(OM_uint32 *minor_status,
+ gss_cred_id_t cred,
+ OM_uint32 num_ktypes,
+ krb5_enctype *ktypes);
OM_uint32 KRB5_CALLCONV
gss_krb5int_export_lucid_sec_context(OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- OM_uint32 version,
- void **kctx);
+ gss_ctx_id_t *context_handle,
+ OM_uint32 version,
+ void **kctx);
extern k5_mutex_t kg_kdc_flag_mutex;
@@ -701,8 +702,8 @@ krb5_gss_save_error_message(OM_uint32 minor_code, const char *format, ...)
__attribute__((__format__(__printf__, 2, 3)))
#endif
;
-extern void
-krb5_gss_save_error_info(OM_uint32 minor_code, krb5_context ctx);
+ extern void
+ krb5_gss_save_error_info(OM_uint32 minor_code, krb5_context ctx);
#define get_error_message krb5_gss_get_error_message
#define save_error_string krb5_gss_save_error_string
#define save_error_message krb5_gss_save_error_message
diff --git a/src/lib/gssapi/krb5/gssapi_krb5.c b/src/lib/gssapi/krb5/gssapi_krb5.c
index 95a8763711..64812a78b1 100644
--- a/src/lib/gssapi/krb5/gssapi_krb5.c
+++ b/src/lib/gssapi/krb5/gssapi_krb5.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -22,14 +23,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -40,7 +41,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -61,21 +62,21 @@
/*
* The OID of the draft krb5 mechanism, assigned by IETF, is:
- * iso(1) org(3) dod(5) internet(1) security(5)
- * kerberosv5(2) = 1.3.5.1.5.2
+ * iso(1) org(3) dod(5) internet(1) security(5)
+ * kerberosv5(2) = 1.3.5.1.5.2
* The OID of the krb5_name type is:
- * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
- * krb5(2) krb5_name(1) = 1.2.840.113554.1.2.2.1
+ * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ * krb5(2) krb5_name(1) = 1.2.840.113554.1.2.2.1
* The OID of the krb5_principal type is:
- * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
- * krb5(2) krb5_principal(2) = 1.2.840.113554.1.2.2.2
+ * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ * krb5(2) krb5_principal(2) = 1.2.840.113554.1.2.2.2
* The OID of the proposed standard krb5 mechanism is:
- * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
- * krb5(2) = 1.2.840.113554.1.2.2
+ * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ * krb5(2) = 1.2.840.113554.1.2.2
* The OID of the proposed standard krb5 v2 mechanism is:
- * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
- * krb5v2(3) = 1.2.840.113554.1.2.3
- *
+ * iso(1) member-body(2) US(840) mit(113554) infosys(1) gssapi(2)
+ * krb5v2(3) = 1.2.840.113554.1.2.3
+ *
*/
/*
@@ -86,26 +87,26 @@
*/
const gss_OID_desc krb5_gss_oid_array[] = {
- /* this is the official, rfc-specified OID */
- {GSS_MECH_KRB5_OID_LENGTH, GSS_MECH_KRB5_OID},
- /* this pre-RFC mech OID */
- {GSS_MECH_KRB5_OLD_OID_LENGTH, GSS_MECH_KRB5_OLD_OID},
- /* this is the unofficial, incorrect mech OID emitted by MS */
- {GSS_MECH_KRB5_WRONG_OID_LENGTH, GSS_MECH_KRB5_WRONG_OID},
- /* this is the v2 assigned OID */
- {9, "\052\206\110\206\367\022\001\002\003"},
- /* these two are name type OID's */
+ /* this is the official, rfc-specified OID */
+ {GSS_MECH_KRB5_OID_LENGTH, GSS_MECH_KRB5_OID},
+ /* this pre-RFC mech OID */
+ {GSS_MECH_KRB5_OLD_OID_LENGTH, GSS_MECH_KRB5_OLD_OID},
+ /* this is the unofficial, incorrect mech OID emitted by MS */
+ {GSS_MECH_KRB5_WRONG_OID_LENGTH, GSS_MECH_KRB5_WRONG_OID},
+ /* this is the v2 assigned OID */
+ {9, "\052\206\110\206\367\022\001\002\003"},
+ /* these two are name type OID's */
/* 2.1.1. Kerberos Principal Name Form: (rfc 1964)
* This name form shall be represented by the Object Identifier {iso(1)
* member-body(2) United States(840) mit(113554) infosys(1) gssapi(2)
* krb5(2) krb5_name(1)}. The recommended symbolic name for this type
* is "GSS_KRB5_NT_PRINCIPAL_NAME". */
- {10, "\052\206\110\206\367\022\001\002\002\001"},
+ {10, "\052\206\110\206\367\022\001\002\002\001"},
- /* gss_nt_krb5_principal. Object identifier for a krb5_principal. Do not use. */
- {10, "\052\206\110\206\367\022\001\002\002\002"},
- { 0, 0 }
+ /* gss_nt_krb5_principal. Object identifier for a krb5_principal. Do not use. */
+ {10, "\052\206\110\206\367\022\001\002\002\002"},
+ { 0, 0 }
};
const gss_OID_desc * const gss_mech_krb5 = krb5_gss_oid_array+0;
@@ -116,11 +117,11 @@ const gss_OID_desc * const gss_nt_krb5_principal = krb5_gss_oid_array+5;
const gss_OID_desc * const GSS_KRB5_NT_PRINCIPAL_NAME = krb5_gss_oid_array+4;
static const gss_OID_set_desc oidsets[] = {
- {1, (gss_OID) krb5_gss_oid_array+0},
- {1, (gss_OID) krb5_gss_oid_array+1},
- {3, (gss_OID) krb5_gss_oid_array+0},
- {1, (gss_OID) krb5_gss_oid_array+2},
- {3, (gss_OID) krb5_gss_oid_array+0},
+ {1, (gss_OID) krb5_gss_oid_array+0},
+ {1, (gss_OID) krb5_gss_oid_array+1},
+ {3, (gss_OID) krb5_gss_oid_array+0},
+ {1, (gss_OID) krb5_gss_oid_array+2},
+ {3, (gss_OID) krb5_gss_oid_array+0},
};
const gss_OID_set_desc * const gss_mech_set_krb5 = oidsets+0;
@@ -137,54 +138,54 @@ g_set kg_vdb = G_SET_INIT;
*/
OM_uint32
kg_get_defcred(minor_status, cred)
- OM_uint32 *minor_status;
- gss_cred_id_t *cred;
+ OM_uint32 *minor_status;
+ gss_cred_id_t *cred;
{
OM_uint32 major;
-
- if ((major = krb5_gss_acquire_cred(minor_status,
- (gss_name_t) NULL, GSS_C_INDEFINITE,
- GSS_C_NULL_OID_SET, GSS_C_INITIATE,
- cred, NULL, NULL)) && GSS_ERROR(major)) {
- return(major);
- }
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+
+ if ((major = krb5_gss_acquire_cred(minor_status,
+ (gss_name_t) NULL, GSS_C_INDEFINITE,
+ GSS_C_NULL_OID_SET, GSS_C_INITIATE,
+ cred, NULL, NULL)) && GSS_ERROR(major)) {
+ return(major);
+ }
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
OM_uint32
kg_sync_ccache_name (krb5_context context, OM_uint32 *minor_status)
{
OM_uint32 err = 0;
-
- /*
+
+ /*
* Sync up the context ccache name with the GSSAPI ccache name.
- * If kg_ccache_name is NULL -- normal unless someone has called
- * gss_krb5_ccache_name() -- then the system default ccache will
+ * If kg_ccache_name is NULL -- normal unless someone has called
+ * gss_krb5_ccache_name() -- then the system default ccache will
* be picked up and used by resetting the context default ccache.
* This is needed for platforms which support multiple ccaches.
*/
-
+
if (!err) {
/* if NULL, resets the context default ccache */
err = krb5_cc_set_default_name(context,
- (char *) k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME));
+ (char *) k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME));
}
-
+
*minor_status = err;
return (*minor_status == 0) ? GSS_S_COMPLETE : GSS_S_FAILURE;
}
/* This function returns whether or not the caller set a cccache name. Used by
- * gss_acquire_cred to figure out if the caller wants to only look at this
+ * gss_acquire_cred to figure out if the caller wants to only look at this
* ccache or search the cache collection for the desired name */
OM_uint32
-kg_caller_provided_ccache_name (OM_uint32 *minor_status,
-int *out_caller_provided_name)
+kg_caller_provided_ccache_name (OM_uint32 *minor_status,
+ int *out_caller_provided_name)
{
if (out_caller_provided_name) {
- *out_caller_provided_name =
- (k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME) != NULL);
+ *out_caller_provided_name =
+ (k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME) != NULL);
}
*minor_status = 0;
@@ -199,31 +200,31 @@ kg_get_ccache_name (OM_uint32 *minor_status, const char **out_name)
char *kg_ccache_name;
kg_ccache_name = k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME);
-
+
if (kg_ccache_name != NULL) {
- name = strdup(kg_ccache_name);
- if (name == NULL)
- err = ENOMEM;
+ name = strdup(kg_ccache_name);
+ if (name == NULL)
+ err = ENOMEM;
} else {
- krb5_context context = NULL;
-
- /* Reset the context default ccache (see text above), and then
- retrieve it. */
- err = krb5_gss_init_context(&context);
- if (!err)
- err = krb5_cc_set_default_name (context, NULL);
- if (!err) {
- name = krb5_cc_default_name(context);
- if (name) {
- name = strdup(name);
- if (name == NULL)
- err = ENOMEM;
- }
- }
- if (err && context)
- save_error_info(err, context);
- if (context)
- krb5_free_context(context);
+ krb5_context context = NULL;
+
+ /* Reset the context default ccache (see text above), and then
+ retrieve it. */
+ err = krb5_gss_init_context(&context);
+ if (!err)
+ err = krb5_cc_set_default_name (context, NULL);
+ if (!err) {
+ name = krb5_cc_default_name(context);
+ if (name) {
+ name = strdup(name);
+ if (name == NULL)
+ err = ENOMEM;
+ }
+ }
+ if (err && context)
+ save_error_info(err, context);
+ if (context)
+ krb5_free_context(context);
}
if (!err) {
@@ -231,7 +232,7 @@ kg_get_ccache_name (OM_uint32 *minor_status, const char **out_name)
*out_name = name;
}
}
-
+
*minor_status = err;
return (*minor_status == 0) ? GSS_S_COMPLETE : GSS_S_FAILURE;
}
@@ -245,12 +246,12 @@ kg_set_ccache_name (OM_uint32 *minor_status, const char *name)
krb5_error_code kerr;
if (name) {
- new_name = malloc(strlen(name) + 1);
- if (new_name == NULL) {
- *minor_status = ENOMEM;
- return GSS_S_FAILURE;
- }
- strcpy(new_name, name);
+ new_name = malloc(strlen(name) + 1);
+ if (new_name == NULL) {
+ *minor_status = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+ strcpy(new_name, name);
}
kg_ccache_name = k5_getspecific(K5_KEY_GSS_KRB5_CCACHE_NAME);
@@ -259,11 +260,11 @@ kg_set_ccache_name (OM_uint32 *minor_status, const char *name)
new_name = swap;
kerr = k5_setspecific(K5_KEY_GSS_KRB5_CCACHE_NAME, kg_ccache_name);
if (kerr != 0) {
- /* Can't store, so free up the storage. */
- free(kg_ccache_name);
- /* ??? free(new_name); */
- *minor_status = kerr;
- return GSS_S_FAILURE;
+ /* Can't store, so free up the storage. */
+ free(kg_ccache_name);
+ /* ??? free(new_name); */
+ *minor_status = kerr;
+ return GSS_S_FAILURE;
}
free (new_name);
diff --git a/src/lib/gssapi/krb5/gssapi_krb5.hin b/src/lib/gssapi/krb5/gssapi_krb5.hin
index b9660e5b35..67791a5802 100644
--- a/src/lib/gssapi/krb5/gssapi_krb5.hin
+++ b/src/lib/gssapi/krb5/gssapi_krb5.hin
@@ -1,6 +1,7 @@
-/* -*- c -*-
+/* -*- mode: c; indent-tabs-mode: nil -*- */
+/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -50,7 +51,7 @@ GSS_DLLIMP extern const gss_OID_desc * const GSS_KRB5_NT_PRINCIPAL_NAME;
* "GSS_C_NT_HOSTBASED_SERVICE". */
/* 2.2.1. User Name Form */
-#define GSS_KRB5_NT_USER_NAME GSS_C_NT_USER_NAME
+#define GSS_KRB5_NT_USER_NAME GSS_C_NT_USER_NAME
/* This name form shall be represented by the Object Identifier {iso(1)
* member-body(2) United States(840) mit(113554) infosys(1) gssapi(2)
* generic(1) user_name(1)}. The recommended symbolic name for this
@@ -68,7 +69,7 @@ GSS_DLLIMP extern const gss_OID_desc * const GSS_KRB5_NT_PRINCIPAL_NAME;
/* This name form shall be represented by the Object Identifier {iso(1)
* member-body(2) United States(840) mit(113554) infosys(1) gssapi(2)
* generic(1) string_uid_name(3)}. The recommended symbolic name for
- * this type is "GSS_KRB5_NT_STRING_UID_NAME". */
+ * this type is "GSS_KRB5_NT_STRING_UID_NAME". */
GSS_DLLIMP extern const gss_OID_desc * const gss_mech_krb5;
GSS_DLLIMP extern const gss_OID_desc * const gss_mech_krb5_old;
@@ -82,12 +83,12 @@ GSS_DLLIMP extern const gss_OID_desc * const gss_nt_krb5_principal;
GSS_DLLIMP extern const gss_OID_desc krb5_gss_oid_array[];
-#define gss_krb5_nt_general_name gss_nt_krb5_name
-#define gss_krb5_nt_principal gss_nt_krb5_principal
-#define gss_krb5_nt_service_name gss_nt_service_name
-#define gss_krb5_nt_user_name gss_nt_user_name
-#define gss_krb5_nt_machine_uid_name gss_nt_machine_uid_name
-#define gss_krb5_nt_string_uid_name gss_nt_string_uid_name
+#define gss_krb5_nt_general_name gss_nt_krb5_name
+#define gss_krb5_nt_principal gss_nt_krb5_principal
+#define gss_krb5_nt_service_name gss_nt_service_name
+#define gss_krb5_nt_user_name gss_nt_user_name
+#define gss_krb5_nt_machine_uid_name gss_nt_machine_uid_name
+#define gss_krb5_nt_string_uid_name gss_nt_string_uid_name
#if defined(_WIN32)
@@ -99,48 +100,48 @@ typedef uint64_t gss_uint64;
typedef struct gss_krb5_lucid_key {
- OM_uint32 type; /* key encryption type */
- OM_uint32 length; /* length of key data */
- void * data; /* actual key data */
+ OM_uint32 type; /* key encryption type */
+ OM_uint32 length; /* length of key data */
+ void * data; /* actual key data */
} gss_krb5_lucid_key_t;
typedef struct gss_krb5_rfc1964_keydata {
- OM_uint32 sign_alg; /* signing algorthm */
- OM_uint32 seal_alg; /* seal/encrypt algorthm */
- gss_krb5_lucid_key_t ctx_key;
- /* Context key
- (Kerberos session key or subkey) */
+ OM_uint32 sign_alg; /* signing algorthm */
+ OM_uint32 seal_alg; /* seal/encrypt algorthm */
+ gss_krb5_lucid_key_t ctx_key;
+ /* Context key
+ (Kerberos session key or subkey) */
} gss_krb5_rfc1964_keydata_t;
typedef struct gss_krb5_cfx_keydata {
- OM_uint32 have_acceptor_subkey;
- /* 1 if there is an acceptor_subkey
- present, 0 otherwise */
- gss_krb5_lucid_key_t ctx_key;
- /* Context key
- (Kerberos session key or subkey) */
- gss_krb5_lucid_key_t acceptor_subkey;
- /* acceptor-asserted subkey or
- 0's if no acceptor subkey */
+ OM_uint32 have_acceptor_subkey;
+ /* 1 if there is an acceptor_subkey
+ present, 0 otherwise */
+ gss_krb5_lucid_key_t ctx_key;
+ /* Context key
+ (Kerberos session key or subkey) */
+ gss_krb5_lucid_key_t acceptor_subkey;
+ /* acceptor-asserted subkey or
+ 0's if no acceptor subkey */
} gss_krb5_cfx_keydata_t;
typedef struct gss_krb5_lucid_context_v1 {
- OM_uint32 version; /* Structure version number (1)
- MUST be at beginning of struct! */
- OM_uint32 initiate; /* Are we the initiator? */
- OM_uint32 endtime; /* expiration time of context */
- gss_uint64 send_seq; /* sender sequence number */
- gss_uint64 recv_seq; /* receive sequence number */
- OM_uint32 protocol; /* 0: rfc1964,
- 1: draft-ietf-krb-wg-gssapi-cfx-07 */
- /*
- * if (protocol == 0) rfc1964_kd should be used
- * and cfx_kd contents are invalid and should be zero
- * if (protocol == 1) cfx_kd should be used
- * and rfc1964_kd contents are invalid and should be zero
- */
- gss_krb5_rfc1964_keydata_t rfc1964_kd;
- gss_krb5_cfx_keydata_t cfx_kd;
+ OM_uint32 version; /* Structure version number (1)
+ MUST be at beginning of struct! */
+ OM_uint32 initiate; /* Are we the initiator? */
+ OM_uint32 endtime; /* expiration time of context */
+ gss_uint64 send_seq; /* sender sequence number */
+ gss_uint64 recv_seq; /* receive sequence number */
+ OM_uint32 protocol; /* 0: rfc1964,
+ 1: draft-ietf-krb-wg-gssapi-cfx-07 */
+ /*
+ * if (protocol == 0) rfc1964_kd should be used
+ * and cfx_kd contents are invalid and should be zero
+ * if (protocol == 1) cfx_kd should be used
+ * and rfc1964_kd contents are invalid and should be zero
+ */
+ gss_krb5_rfc1964_keydata_t rfc1964_kd;
+ gss_krb5_cfx_keydata_t cfx_kd;
} gss_krb5_lucid_context_v1_t;
/*
@@ -148,7 +149,7 @@ typedef struct gss_krb5_lucid_context_v1 {
* See example below for usage.
*/
typedef struct gss_krb5_lucid_context_version {
- OM_uint32 version; /* Structure version number */
+ OM_uint32 version; /* Structure version number */
} gss_krb5_lucid_context_version_t;
@@ -159,19 +160,19 @@ typedef struct gss_krb5_lucid_context_version {
OM_uint32 KRB5_CALLCONV krb5_gss_register_acceptor_identity(const char *);
-OM_uint32 KRB5_CALLCONV gss_krb5_get_tkt_flags
- (OM_uint32 *minor_status,
- gss_ctx_id_t context_handle,
- krb5_flags *ticket_flags);
+OM_uint32 KRB5_CALLCONV gss_krb5_get_tkt_flags(
+ OM_uint32 *minor_status,
+ gss_ctx_id_t context_handle,
+ krb5_flags *ticket_flags);
-OM_uint32 KRB5_CALLCONV gss_krb5_copy_ccache
- (OM_uint32 *minor_status,
- gss_cred_id_t cred_handle,
- krb5_ccache out_ccache);
+OM_uint32 KRB5_CALLCONV gss_krb5_copy_ccache(
+ OM_uint32 *minor_status,
+ gss_cred_id_t cred_handle,
+ krb5_ccache out_ccache);
-OM_uint32 KRB5_CALLCONV gss_krb5_ccache_name
- (OM_uint32 *minor_status, const char *name,
- const char **out_name);
+OM_uint32 KRB5_CALLCONV gss_krb5_ccache_name(
+ OM_uint32 *minor_status, const char *name,
+ const char **out_name);
/*
* gss_krb5_set_allowable_enctypes
@@ -197,14 +198,14 @@ OM_uint32 KRB5_CALLCONV gss_krb5_ccache_name
*
*/
OM_uint32 KRB5_CALLCONV
-gss_krb5_set_allowable_enctypes(OM_uint32 *minor_status,
- gss_cred_id_t cred,
- OM_uint32 num_ktypes,
- krb5_enctype *ktypes);
+gss_krb5_set_allowable_enctypes(OM_uint32 *minor_status,
+ gss_cred_id_t cred,
+ OM_uint32 num_ktypes,
+ krb5_enctype *ktypes);
/*
* Returns a non-opaque (lucid) version of the internal context
- * information.
+ * information.
*
* Note that context_handle must not be used again by the caller
* after this call. The GSS implementation is free to release any
@@ -212,7 +213,7 @@ gss_krb5_set_allowable_enctypes(OM_uint32 *minor_status,
* GSS implementation whether it returns pointers to existing data,
* or copies of the data. The caller should treat the returned
* lucid context as read-only.
- *
+ *
* The caller must call gss_krb5_free_lucid_context() to free
* the context and allocated resources when it is finished with it.
*
@@ -228,33 +229,33 @@ gss_krb5_set_allowable_enctypes(OM_uint32 *minor_status,
* (XXX Need error definition(s))
*
* For example:
- * void *return_ctx;
- * gss_krb5_lucid_context_v1_t *ctx;
- * OM_uint32 min_stat, maj_stat;
- * OM_uint32 vers;
- * gss_ctx_id_t *ctx_handle;
+ * void *return_ctx;
+ * gss_krb5_lucid_context_v1_t *ctx;
+ * OM_uint32 min_stat, maj_stat;
+ * OM_uint32 vers;
+ * gss_ctx_id_t *ctx_handle;
*
- * maj_stat = gss_krb5_export_lucid_sec_context(&min_stat,
- * ctx_handle, 1, &return_ctx);
- * // Verify success
+ * maj_stat = gss_krb5_export_lucid_sec_context(&min_stat,
+ * ctx_handle, 1, &return_ctx);
+ * // Verify success
*
- * vers = ((gss_krb5_lucid_context_version_t *)return_ctx)->version;
- * switch (vers) {
- * case 1:
- * ctx = (gss_krb5_lucid_context_v1_t *) return_ctx;
- * break;
- * default:
- * // Error, unknown version returned
- * break;
- * }
+ * vers = ((gss_krb5_lucid_context_version_t *)return_ctx)->version;
+ * switch (vers) {
+ * case 1:
+ * ctx = (gss_krb5_lucid_context_v1_t *) return_ctx;
+ * break;
+ * default:
+ * // Error, unknown version returned
+ * break;
+ * }
*
*/
OM_uint32 KRB5_CALLCONV
gss_krb5_export_lucid_sec_context(OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- OM_uint32 version,
- void **kctx);
+ gss_ctx_id_t *context_handle,
+ OM_uint32 version,
+ void **kctx);
/*
* Frees the allocated storage associated with an
@@ -262,7 +263,7 @@ gss_krb5_export_lucid_sec_context(OM_uint32 *minor_status,
*/
OM_uint32 KRB5_CALLCONV
gss_krb5_free_lucid_sec_context(OM_uint32 *minor_status,
- void *kctx);
+ void *kctx);
#ifdef __cplusplus
diff --git a/src/lib/gssapi/krb5/import_name.c b/src/lib/gssapi/krb5/import_name.c
index 58bc19f918..6879c766fa 100644
--- a/src/lib/gssapi/krb5/import_name.c
+++ b/src/lib/gssapi/krb5/import_name.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -39,201 +40,201 @@
/*
* errors:
- * GSS_S_BAD_NAMETYPE if the type is bogus
- * GSS_S_BAD_NAME if the type is good but the name is bogus
- * GSS_S_FAILURE if memory allocation fails
+ * GSS_S_BAD_NAMETYPE if the type is bogus
+ * GSS_S_BAD_NAME if the type is good but the name is bogus
+ * GSS_S_FAILURE if memory allocation fails
*/
OM_uint32
-krb5_gss_import_name(minor_status, input_name_buffer,
- input_name_type, output_name)
- OM_uint32 *minor_status;
- gss_buffer_t input_name_buffer;
- gss_OID input_name_type;
- gss_name_t *output_name;
+krb5_gss_import_name(minor_status, input_name_buffer,
+ input_name_type, output_name)
+ OM_uint32 *minor_status;
+ gss_buffer_t input_name_buffer;
+ gss_OID input_name_type;
+ gss_name_t *output_name;
{
- krb5_context context;
- krb5_principal princ;
- krb5_error_code code;
- char *stringrep, *tmp, *tmp2, *cp;
- OM_uint32 length;
+ krb5_context context;
+ krb5_principal princ;
+ krb5_error_code code;
+ char *stringrep, *tmp, *tmp2, *cp;
+ OM_uint32 length;
#ifndef NO_PASSWORD
- struct passwd *pw;
+ struct passwd *pw;
#endif
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- /* set up default returns */
-
- *output_name = NULL;
- *minor_status = 0;
-
- /* Go find the appropriate string rep to pass into parse_name */
-
- if ((input_name_type != GSS_C_NULL_OID) &&
- (g_OID_equal(input_name_type, gss_nt_service_name) ||
- g_OID_equal(input_name_type, gss_nt_service_name_v2))) {
- char *service, *host;
-
- if ((tmp =
- (char *) xmalloc(input_name_buffer->length + 1)) == NULL) {
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
-
- memcpy(tmp, input_name_buffer->value, input_name_buffer->length);
- tmp[input_name_buffer->length] = 0;
-
- service = tmp;
- if ((host = strchr(tmp, '@'))) {
- *host = '\0';
- host++;
- }
-
- code = krb5_sname_to_principal(context, host, service, KRB5_NT_SRV_HST,
- &princ);
-
- xfree(tmp);
- } else if ((input_name_type != GSS_C_NULL_OID) &&
- (g_OID_equal(input_name_type, gss_nt_krb5_principal))) {
- krb5_principal input;
-
- if (input_name_buffer->length != sizeof(krb5_principal)) {
- *minor_status = (OM_uint32) G_WRONG_SIZE;
- krb5_free_context(context);
- return(GSS_S_BAD_NAME);
- }
-
- input = *((krb5_principal *) input_name_buffer->value);
-
- if ((code = krb5_copy_principal(context, input, &princ))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- } else {
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ /* set up default returns */
+
+ *output_name = NULL;
+ *minor_status = 0;
+
+ /* Go find the appropriate string rep to pass into parse_name */
+
+ if ((input_name_type != GSS_C_NULL_OID) &&
+ (g_OID_equal(input_name_type, gss_nt_service_name) ||
+ g_OID_equal(input_name_type, gss_nt_service_name_v2))) {
+ char *service, *host;
+
+ if ((tmp =
+ (char *) xmalloc(input_name_buffer->length + 1)) == NULL) {
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+
+ memcpy(tmp, input_name_buffer->value, input_name_buffer->length);
+ tmp[input_name_buffer->length] = 0;
+
+ service = tmp;
+ if ((host = strchr(tmp, '@'))) {
+ *host = '\0';
+ host++;
+ }
+
+ code = krb5_sname_to_principal(context, host, service, KRB5_NT_SRV_HST,
+ &princ);
+
+ xfree(tmp);
+ } else if ((input_name_type != GSS_C_NULL_OID) &&
+ (g_OID_equal(input_name_type, gss_nt_krb5_principal))) {
+ krb5_principal input;
+
+ if (input_name_buffer->length != sizeof(krb5_principal)) {
+ *minor_status = (OM_uint32) G_WRONG_SIZE;
+ krb5_free_context(context);
+ return(GSS_S_BAD_NAME);
+ }
+
+ input = *((krb5_principal *) input_name_buffer->value);
+
+ if ((code = krb5_copy_principal(context, input, &princ))) {
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ } else {
#ifndef NO_PASSWORD
- uid_t uid;
- struct passwd pwx;
- char pwbuf[BUFSIZ];
+ uid_t uid;
+ struct passwd pwx;
+ char pwbuf[BUFSIZ];
#endif
- stringrep = NULL;
+ stringrep = NULL;
- if ((tmp =
- (char *) xmalloc(input_name_buffer->length + 1)) == NULL) {
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- tmp2 = 0;
+ if ((tmp =
+ (char *) xmalloc(input_name_buffer->length + 1)) == NULL) {
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ tmp2 = 0;
- memcpy(tmp, input_name_buffer->value, input_name_buffer->length);
- tmp[input_name_buffer->length] = 0;
+ memcpy(tmp, input_name_buffer->value, input_name_buffer->length);
+ tmp[input_name_buffer->length] = 0;
- if ((input_name_type == GSS_C_NULL_OID) ||
- g_OID_equal(input_name_type, gss_nt_krb5_name) ||
- g_OID_equal(input_name_type, gss_nt_user_name)) {
- stringrep = (char *) tmp;
+ if ((input_name_type == GSS_C_NULL_OID) ||
+ g_OID_equal(input_name_type, gss_nt_krb5_name) ||
+ g_OID_equal(input_name_type, gss_nt_user_name)) {
+ stringrep = (char *) tmp;
#ifndef NO_PASSWORD
- } else if (g_OID_equal(input_name_type, gss_nt_machine_uid_name)) {
- uid = *(uid_t *) input_name_buffer->value;
- do_getpwuid:
- if (k5_getpwuid_r(uid, &pwx, pwbuf, sizeof(pwbuf), &pw) == 0)
- stringrep = pw->pw_name;
- else
- *minor_status = (OM_uint32) G_NOUSER;
- } else if (g_OID_equal(input_name_type, gss_nt_string_uid_name)) {
- uid = atoi(tmp);
- goto do_getpwuid;
+ } else if (g_OID_equal(input_name_type, gss_nt_machine_uid_name)) {
+ uid = *(uid_t *) input_name_buffer->value;
+ do_getpwuid:
+ if (k5_getpwuid_r(uid, &pwx, pwbuf, sizeof(pwbuf), &pw) == 0)
+ stringrep = pw->pw_name;
+ else
+ *minor_status = (OM_uint32) G_NOUSER;
+ } else if (g_OID_equal(input_name_type, gss_nt_string_uid_name)) {
+ uid = atoi(tmp);
+ goto do_getpwuid;
#endif
- } else if (g_OID_equal(input_name_type, gss_nt_exported_name)) {
- cp = tmp;
- if (*cp++ != 0x04)
- goto fail_name;
- if (*cp++ != 0x01)
- goto fail_name;
- if (*cp++ != 0x00)
- goto fail_name;
- length = *cp++;
- if (length != gss_mech_krb5->length+2)
- goto fail_name;
- if (*cp++ != 0x06)
- goto fail_name;
- length = *cp++;
- if (length != gss_mech_krb5->length)
- goto fail_name;
- if (memcmp(cp, gss_mech_krb5->elements, length) != 0)
- goto fail_name;
- cp += length;
- length = *cp++;
- length = (length << 8) | *cp++;
- length = (length << 8) | *cp++;
- length = (length << 8) | *cp++;
- tmp2 = malloc(length+1);
- if (tmp2 == NULL) {
- xfree(tmp);
- *minor_status = ENOMEM;
- krb5_free_context(context);
- return GSS_S_FAILURE;
- }
- strncpy(tmp2, cp, length);
- tmp2[length] = 0;
-
- stringrep = tmp2;
- } else {
- xfree(tmp);
- krb5_free_context(context);
- return(GSS_S_BAD_NAMETYPE);
- }
-
- /* at this point, stringrep is set, or if not, *minor_status is. */
-
- if (stringrep)
- code = krb5_parse_name(context, (char *) stringrep, &princ);
- else {
- fail_name:
- xfree(tmp);
- if (tmp2)
- xfree(tmp2);
- krb5_free_context(context);
- return(GSS_S_BAD_NAME);
- }
-
- if (tmp2)
- xfree(tmp2);
- xfree(tmp);
- }
-
- /* at this point, a krb5 function has been called to set princ. code
- contains the return status */
-
- if (code) {
- *minor_status = (OM_uint32) code;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(GSS_S_BAD_NAME);
- }
-
- /* save the name in the validation database */
-
- if (! kg_save_name((gss_name_t) princ)) {
- krb5_free_principal(context, princ);
- krb5_free_context(context);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
- }
-
- krb5_free_context(context);
-
- /* return it */
-
- *output_name = (gss_name_t) princ;
- return(GSS_S_COMPLETE);
+ } else if (g_OID_equal(input_name_type, gss_nt_exported_name)) {
+ cp = tmp;
+ if (*cp++ != 0x04)
+ goto fail_name;
+ if (*cp++ != 0x01)
+ goto fail_name;
+ if (*cp++ != 0x00)
+ goto fail_name;
+ length = *cp++;
+ if (length != gss_mech_krb5->length+2)
+ goto fail_name;
+ if (*cp++ != 0x06)
+ goto fail_name;
+ length = *cp++;
+ if (length != gss_mech_krb5->length)
+ goto fail_name;
+ if (memcmp(cp, gss_mech_krb5->elements, length) != 0)
+ goto fail_name;
+ cp += length;
+ length = *cp++;
+ length = (length << 8) | *cp++;
+ length = (length << 8) | *cp++;
+ length = (length << 8) | *cp++;
+ tmp2 = malloc(length+1);
+ if (tmp2 == NULL) {
+ xfree(tmp);
+ *minor_status = ENOMEM;
+ krb5_free_context(context);
+ return GSS_S_FAILURE;
+ }
+ strncpy(tmp2, cp, length);
+ tmp2[length] = 0;
+
+ stringrep = tmp2;
+ } else {
+ xfree(tmp);
+ krb5_free_context(context);
+ return(GSS_S_BAD_NAMETYPE);
+ }
+
+ /* at this point, stringrep is set, or if not, *minor_status is. */
+
+ if (stringrep)
+ code = krb5_parse_name(context, (char *) stringrep, &princ);
+ else {
+ fail_name:
+ xfree(tmp);
+ if (tmp2)
+ xfree(tmp2);
+ krb5_free_context(context);
+ return(GSS_S_BAD_NAME);
+ }
+
+ if (tmp2)
+ xfree(tmp2);
+ xfree(tmp);
+ }
+
+ /* at this point, a krb5 function has been called to set princ. code
+ contains the return status */
+
+ if (code) {
+ *minor_status = (OM_uint32) code;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(GSS_S_BAD_NAME);
+ }
+
+ /* save the name in the validation database */
+
+ if (! kg_save_name((gss_name_t) princ)) {
+ krb5_free_principal(context, princ);
+ krb5_free_context(context);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
+ }
+
+ krb5_free_context(context);
+
+ /* return it */
+
+ *output_name = (gss_name_t) princ;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/import_sec_context.c b/src/lib/gssapi/krb5/import_sec_context.c
index b0d71c883f..fc6b6aff28 100644
--- a/src/lib/gssapi/krb5/import_sec_context.c
+++ b/src/lib/gssapi/krb5/import_sec_context.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/import_sec_context.c
*
@@ -26,7 +27,7 @@
*/
/*
- * import_sec_context.c - Internalize the security context.
+ * import_sec_context.c - Internalize the security context.
*/
#include "gssapiP_krb5.h"
/* for serialization initialization functions */
@@ -37,19 +38,19 @@
* the OID if possible.
*/
gss_OID krb5_gss_convert_static_mech_oid(oid)
- gss_OID oid;
+ gss_OID oid;
{
- const gss_OID_desc *p;
- OM_uint32 minor_status;
-
- for (p = krb5_gss_oid_array; p->length; p++) {
- if ((oid->length == p->length) &&
- (memcmp(oid->elements, p->elements, p->length) == 0)) {
- gss_release_oid(&minor_status, &oid);
- return (gss_OID) p;
- }
- }
- return oid;
+ const gss_OID_desc *p;
+ OM_uint32 minor_status;
+
+ for (p = krb5_gss_oid_array; p->length; p++) {
+ if ((oid->length == p->length) &&
+ (memcmp(oid->elements, p->elements, p->length) == 0)) {
+ gss_release_oid(&minor_status, &oid);
+ return (gss_OID) p;
+ }
+ }
+ return oid;
}
krb5_error_code
@@ -57,28 +58,28 @@ krb5_gss_ser_init (krb5_context context)
{
krb5_error_code code;
static krb5_error_code (KRB5_CALLCONV *const fns[])(krb5_context) = {
- krb5_ser_context_init, krb5_ser_auth_context_init,
- krb5_ser_ccache_init, krb5_ser_rcache_init, krb5_ser_keytab_init,
+ krb5_ser_context_init, krb5_ser_auth_context_init,
+ krb5_ser_ccache_init, krb5_ser_rcache_init, krb5_ser_keytab_init,
};
unsigned int i;
for (i = 0; i < sizeof(fns)/sizeof(fns[0]); i++)
- if ((code = (fns[i])(context)) != 0)
- return code;
+ if ((code = (fns[i])(context)) != 0)
+ return code;
return 0;
}
OM_uint32
krb5_gss_import_sec_context(minor_status, interprocess_token, context_handle)
- OM_uint32 *minor_status;
- gss_buffer_t interprocess_token;
- gss_ctx_id_t *context_handle;
+ OM_uint32 *minor_status;
+ gss_buffer_t interprocess_token;
+ gss_ctx_id_t *context_handle;
{
- krb5_context context;
- krb5_error_code kret = 0;
- size_t blen;
- krb5_gss_ctx_id_t ctx;
- krb5_octet *ibp;
+ krb5_context context;
+ krb5_error_code kret = 0;
+ size_t blen;
+ krb5_gss_ctx_id_t ctx;
+ krb5_octet *ibp;
/* This is a bit screwy. We create a krb5 context because we need
one when calling the serialization code. However, one of the
@@ -86,15 +87,15 @@ krb5_gss_import_sec_context(minor_status, interprocess_token, context_handle)
we can throw this one away. */
kret = krb5_gss_init_context(&context);
if (kret) {
- *minor_status = kret;
- return GSS_S_FAILURE;
+ *minor_status = kret;
+ return GSS_S_FAILURE;
}
kret = krb5_gss_ser_init(context);
if (kret) {
- *minor_status = kret;
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return GSS_S_FAILURE;
+ *minor_status = kret;
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return GSS_S_FAILURE;
}
/* Assume a tragic failure */
@@ -107,20 +108,20 @@ krb5_gss_import_sec_context(minor_status, interprocess_token, context_handle)
kret = kg_ctx_internalize(context, (krb5_pointer *) &ctx, &ibp, &blen);
krb5_free_context(context);
if (kret) {
- *minor_status = (OM_uint32) kret;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
+ *minor_status = (OM_uint32) kret;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
}
/* intern the context handle */
if (! kg_save_ctx_id((gss_ctx_id_t) ctx)) {
- (void)krb5_gss_delete_sec_context(minor_status,
- (gss_ctx_id_t *) &ctx, NULL);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
+ (void)krb5_gss_delete_sec_context(minor_status,
+ (gss_ctx_id_t *) &ctx, NULL);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
}
ctx->mech_used = krb5_gss_convert_static_mech_oid(ctx->mech_used);
-
+
*context_handle = (gss_ctx_id_t) ctx;
*minor_status = 0;
diff --git a/src/lib/gssapi/krb5/indicate_mechs.c b/src/lib/gssapi/krb5/indicate_mechs.c
index c7ee4746fd..53b8be3e0d 100644
--- a/src/lib/gssapi/krb5/indicate_mechs.c
+++ b/src/lib/gssapi/krb5/indicate_mechs.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -29,16 +30,16 @@
OM_uint32
krb5_gss_indicate_mechs(minor_status, mech_set)
- OM_uint32 *minor_status;
- gss_OID_set *mech_set;
+ OM_uint32 *minor_status;
+ gss_OID_set *mech_set;
{
- *minor_status = 0;
+ *minor_status = 0;
- if (gssint_copy_oid_set(minor_status, gss_mech_set_krb5_both, mech_set)) {
- *mech_set = GSS_C_NO_OID_SET;
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
+ if (gssint_copy_oid_set(minor_status, gss_mech_set_krb5_both, mech_set)) {
+ *mech_set = GSS_C_NO_OID_SET;
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
- return(GSS_S_COMPLETE);
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/init_sec_context.c b/src/lib/gssapi/krb5/init_sec_context.c
index 3e3f0192ab..40bc0bcbd4 100644
--- a/src/lib/gssapi/krb5/init_sec_context.c
+++ b/src/lib/gssapi/krb5/init_sec_context.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000,2002, 2003, 2007 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -46,14 +47,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -64,7 +65,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -92,7 +93,7 @@ int krb5_gss_dbg_client_expcreds = 0;
* ccache.
*/
static krb5_error_code get_credentials(context, cred, server, now,
- endtime, out_creds)
+ endtime, out_creds)
krb5_context context;
krb5_gss_cred_id_t cred;
krb5_principal server;
@@ -100,24 +101,24 @@ static krb5_error_code get_credentials(context, cred, server, now,
krb5_timestamp endtime;
krb5_creds **out_creds;
{
- krb5_error_code code;
- krb5_creds in_creds;
+ krb5_error_code code;
+ krb5_creds in_creds;
k5_mutex_assert_locked(&cred->lock);
memset((char *) &in_creds, 0, sizeof(krb5_creds));
if ((code = krb5_copy_principal(context, cred->princ, &in_creds.client)))
- goto cleanup;
+ goto cleanup;
if ((code = krb5_copy_principal(context, server, &in_creds.server)))
- goto cleanup;
+ goto cleanup;
in_creds.times.endtime = endtime;
in_creds.keyblock.enctype = 0;
code = krb5_get_credentials(context, 0, cred->ccache,
- &in_creds, out_creds);
+ &in_creds, out_creds);
if (code)
- goto cleanup;
+ goto cleanup;
/*
* Enforce a stricter limit (without timeskew forgiveness at the
@@ -125,16 +126,16 @@ static krb5_error_code get_credentials(context, cred, server, now,
* non-forgiving.
*/
if (!krb5_gss_dbg_client_expcreds && *out_creds != NULL &&
- (*out_creds)->times.endtime < now) {
- code = KRB5KRB_AP_ERR_TKT_EXPIRED;
- goto cleanup;
+ (*out_creds)->times.endtime < now) {
+ code = KRB5KRB_AP_ERR_TKT_EXPIRED;
+ goto cleanup;
}
-
+
cleanup:
if (in_creds.client)
- krb5_free_principal(context, in_creds.client);
+ krb5_free_principal(context, in_creds.client);
if (in_creds.server)
- krb5_free_principal(context, in_creds.server);
+ krb5_free_principal(context, in_creds.server);
return code;
}
struct gss_checksum_data {
@@ -149,7 +150,7 @@ struct gss_checksum_data {
#endif
static krb5_error_code KRB5_CALLCONV
make_gss_checksum (krb5_context context, krb5_auth_context auth_context,
- void *cksum_data, krb5_data **out)
+ void *cksum_data, krb5_data **out)
{
krb5_error_code code;
krb5_int32 con_flags;
@@ -163,48 +164,48 @@ make_gss_checksum (krb5_context context, krb5_auth_context auth_context,
/* build the checksum field */
if (data->ctx->gss_flags & GSS_C_DELEG_FLAG) {
- /* first get KRB_CRED message, so we know its length */
+ /* first get KRB_CRED message, so we know its length */
- /* clear the time check flag that was set in krb5_auth_con_init() */
- krb5_auth_con_getflags(context, auth_context, &con_flags);
- krb5_auth_con_setflags(context, auth_context,
- con_flags & ~KRB5_AUTH_CONTEXT_DO_TIME);
+ /* clear the time check flag that was set in krb5_auth_con_init() */
+ krb5_auth_con_getflags(context, auth_context, &con_flags);
+ krb5_auth_con_setflags(context, auth_context,
+ con_flags & ~KRB5_AUTH_CONTEXT_DO_TIME);
- code = krb5_fwd_tgt_creds(context, auth_context, 0,
- data->cred->princ, data->ctx->there,
- data->cred->ccache, 1,
- &credmsg);
+ code = krb5_fwd_tgt_creds(context, auth_context, 0,
+ data->cred->princ, data->ctx->there,
+ data->cred->ccache, 1,
+ &credmsg);
- /* turn KRB5_AUTH_CONTEXT_DO_TIME back on */
- krb5_auth_con_setflags(context, auth_context, con_flags);
+ /* turn KRB5_AUTH_CONTEXT_DO_TIME back on */
+ krb5_auth_con_setflags(context, auth_context, con_flags);
- if (code) {
- /* don't fail here; just don't accept/do the delegation
+ if (code) {
+ /* don't fail here; just don't accept/do the delegation
request */
- data->ctx->gss_flags &= ~GSS_C_DELEG_FLAG;
+ data->ctx->gss_flags &= ~GSS_C_DELEG_FLAG;
- data->checksum_data.length = 24;
- } else {
- if (credmsg.length+28 > KRB5_INT16_MAX) {
- krb5_free_data_contents(context, &credmsg);
- return(KRB5KRB_ERR_FIELD_TOOLONG);
- }
+ data->checksum_data.length = 24;
+ } else {
+ if (credmsg.length+28 > KRB5_INT16_MAX) {
+ krb5_free_data_contents(context, &credmsg);
+ return(KRB5KRB_ERR_FIELD_TOOLONG);
+ }
- data->checksum_data.length = 28+credmsg.length;
- }
+ data->checksum_data.length = 28+credmsg.length;
+ }
} else {
- data->checksum_data.length = 24;
+ data->checksum_data.length = 24;
}
#ifdef CFX_EXERCISE
if (data->ctx->auth_context->keyblock != NULL
- && data->ctx->auth_context->keyblock->enctype == 18) {
- srand(time(0) ^ getpid());
- /* Our ftp client code stupidly assumes a base64-encoded
- version of the token will fit in 10K, so don't make this
- too big. */
- junk = rand() & 0xff;
+ && data->ctx->auth_context->keyblock->enctype == 18) {
+ srand(time(0) ^ getpid());
+ /* Our ftp client code stupidly assumes a base64-encoded
+ version of the token will fit in 10K, so don't make this
+ too big. */
+ junk = rand() & 0xff;
} else
- junk = 0;
+ junk = 0;
#else
junk = 0;
#endif
@@ -215,10 +216,10 @@ make_gss_checksum (krb5_context context, krb5_auth_context auth_context,
(maybe) KRB_CRED msg */
if ((data->checksum_data.data =
- (char *) xmalloc(data->checksum_data.length)) == NULL) {
- if (credmsg.data)
- krb5_free_data_contents(context, &credmsg);
- return(ENOMEM);
+ (char *) xmalloc(data->checksum_data.length)) == NULL) {
+ if (credmsg.data)
+ krb5_free_data_contents(context, &credmsg);
+ return(ENOMEM);
}
ptr = data->checksum_data.data;
@@ -231,19 +232,19 @@ make_gss_checksum (krb5_context context, krb5_auth_context auth_context,
xfree(data->md5.contents);
if (credmsg.data) {
- TWRITE_INT16(ptr, KRB5_GSS_FOR_CREDS_OPTION, 0);
- TWRITE_INT16(ptr, credmsg.length, 0);
- TWRITE_STR(ptr, (unsigned char *) credmsg.data, credmsg.length);
+ TWRITE_INT16(ptr, KRB5_GSS_FOR_CREDS_OPTION, 0);
+ TWRITE_INT16(ptr, credmsg.length, 0);
+ TWRITE_STR(ptr, (unsigned char *) credmsg.data, credmsg.length);
- /* free credmsg data */
- krb5_free_data_contents(context, &credmsg);
+ /* free credmsg data */
+ krb5_free_data_contents(context, &credmsg);
}
if (junk)
- memset(ptr, 'i', junk);
+ memset(ptr, 'i', junk);
*out = &data->checksum_data;
return 0;
}
-
+
static krb5_error_code
make_ap_req_v1(context, ctx, cred, k_cred, chan_bindings, mech_type, token)
krb5_context context;
@@ -273,7 +274,7 @@ make_ap_req_v1(context, ctx, cred, k_cred, chan_bindings, mech_type, token)
return(code);
krb5_auth_con_set_req_cksumtype(context, ctx->auth_context,
- CKSUMTYPE_KG_CB);
+ CKSUMTYPE_KG_CB);
cksum_struct.md5 = md5;
cksum_struct.ctx = ctx;
cksum_struct.cred = cred;
@@ -283,15 +284,15 @@ make_ap_req_v1(context, ctx, cred, k_cred, chan_bindings, mech_type, token)
case ENCTYPE_DES_CBC_MD4:
case ENCTYPE_DES_CBC_MD5:
case ENCTYPE_DES3_CBC_SHA1:
- code = make_gss_checksum(context, ctx->auth_context, &cksum_struct,
- &checksum_data);
- if (code)
- goto cleanup;
- break;
+ code = make_gss_checksum(context, ctx->auth_context, &cksum_struct,
+ &checksum_data);
+ if (code)
+ goto cleanup;
+ break;
default:
- krb5_auth_con_set_checksum_func(context, ctx->auth_context,
- make_gss_checksum, &cksum_struct);
- break;
+ krb5_auth_con_set_checksum_func(context, ctx->auth_context,
+ make_gss_checksum, &cksum_struct);
+ break;
}
@@ -300,51 +301,51 @@ make_ap_req_v1(context, ctx, cred, k_cred, chan_bindings, mech_type, token)
mk_req_flags = AP_OPTS_USE_SUBKEY;
if (ctx->gss_flags & GSS_C_MUTUAL_FLAG)
- mk_req_flags |= AP_OPTS_MUTUAL_REQUIRED;
+ mk_req_flags |= AP_OPTS_MUTUAL_REQUIRED;
code = krb5_mk_req_extended(context, &ctx->auth_context, mk_req_flags,
- checksum_data, k_cred, &ap_req);
+ checksum_data, k_cred, &ap_req);
krb5_free_data_contents(context, &cksum_struct.checksum_data);
if (code)
- goto cleanup;
+ goto cleanup;
+
+ /* store the interesting stuff from creds and authent */
+ ctx->endtime = k_cred->times.endtime;
+ ctx->krb_flags = k_cred->ticket_flags;
- /* store the interesting stuff from creds and authent */
- ctx->endtime = k_cred->times.endtime;
- ctx->krb_flags = k_cred->ticket_flags;
+ /* build up the token */
- /* build up the token */
+ /* allocate space for the token */
+ tlen = g_token_size((gss_OID) mech_type, ap_req.length);
- /* allocate space for the token */
- tlen = g_token_size((gss_OID) mech_type, ap_req.length);
+ if ((t = (unsigned char *) xmalloc(tlen)) == NULL) {
+ code = ENOMEM;
+ goto cleanup;
+ }
- if ((t = (unsigned char *) xmalloc(tlen)) == NULL) {
- code = ENOMEM;
- goto cleanup;
- }
+ /* fill in the buffer */
- /* fill in the buffer */
+ ptr = t;
- ptr = t;
+ g_make_token_header(mech_type, ap_req.length,
+ &ptr, KG_TOK_CTX_AP_REQ);
- g_make_token_header(mech_type, ap_req.length,
- &ptr, KG_TOK_CTX_AP_REQ);
+ TWRITE_STR(ptr, (unsigned char *) ap_req.data, ap_req.length);
- TWRITE_STR(ptr, (unsigned char *) ap_req.data, ap_req.length);
+ /* pass it back */
- /* pass it back */
+ token->length = tlen;
+ token->value = (void *) t;
- token->length = tlen;
- token->value = (void *) t;
+ code = 0;
- code = 0;
-
- cleanup:
- if (checksum_data && checksum_data->data)
- krb5_free_data_contents(context, checksum_data);
- if (ap_req.data)
- krb5_free_data_contents(context, &ap_req);
+cleanup:
+ if (checksum_data && checksum_data->data)
+ krb5_free_data_contents(context, checksum_data);
+ if (ap_req.data)
+ krb5_free_data_contents(context, &ap_req);
- return (code);
+ return (code);
}
/*
@@ -354,87 +355,87 @@ make_ap_req_v1(context, ctx, cred, k_cred, chan_bindings, mech_type, token)
*/
static OM_uint32
setup_enc(
- OM_uint32 *minor_status,
- krb5_gss_ctx_id_rec *ctx,
- krb5_context context)
+ OM_uint32 *minor_status,
+ krb5_gss_ctx_id_rec *ctx,
+ krb5_context context)
{
- krb5_error_code code;
- unsigned int i;
- krb5int_access kaccess;
-
- code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
- if (code)
- goto fail;
-
- ctx->have_acceptor_subkey = 0;
- ctx->proto = 0;
- ctx->cksumtype = 0;
- switch(ctx->subkey->enctype) {
- case ENCTYPE_DES_CBC_MD5:
- case ENCTYPE_DES_CBC_MD4:
- case ENCTYPE_DES_CBC_CRC:
- ctx->subkey->enctype = ENCTYPE_DES_CBC_RAW;
- ctx->signalg = SGN_ALG_DES_MAC_MD5;
- ctx->cksum_size = 8;
- ctx->sealalg = SEAL_ALG_DES;
-
- /* The encryption key is the session key XOR
- 0xf0f0f0f0f0f0f0f0. */
- if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc)))
- goto fail;
-
- for (i=0; i<ctx->enc->length; i++)
- ctx->enc->contents[i] ^= 0xf0;
-
- goto copy_subkey_to_seq;
-
- case ENCTYPE_DES3_CBC_SHA1:
- /* MIT extension */
- ctx->subkey->enctype = ENCTYPE_DES3_CBC_RAW;
- ctx->signalg = SGN_ALG_HMAC_SHA1_DES3_KD;
- ctx->cksum_size = 20;
- ctx->sealalg = SEAL_ALG_DES3KD;
-
- copy_subkey:
- code = krb5_copy_keyblock (context, ctx->subkey, &ctx->enc);
- if (code)
- goto fail;
- copy_subkey_to_seq:
- code = krb5_copy_keyblock (context, ctx->subkey, &ctx->seq);
- if (code) {
- krb5_free_keyblock (context, ctx->enc);
- goto fail;
- }
- break;
-
- case ENCTYPE_ARCFOUR_HMAC:
- /* Microsoft extension */
- ctx->signalg = SGN_ALG_HMAC_MD5 ;
- ctx->cksum_size = 8;
- ctx->sealalg = SEAL_ALG_MICROSOFT_RC4 ;
-
- goto copy_subkey;
-
- default:
- /* Fill some fields we shouldn't be using on this path
- with garbage. */
- ctx->signalg = -10;
- ctx->sealalg = -10;
-
- ctx->proto = 1;
- code = (*kaccess.krb5int_c_mandatory_cksumtype)(context, ctx->subkey->enctype,
- &ctx->cksumtype);
- if (code)
- goto fail;
- code = krb5_c_checksum_length(context, ctx->cksumtype,
- &ctx->cksum_size);
- if (code)
- goto fail;
- goto copy_subkey;
- }
+ krb5_error_code code;
+ unsigned int i;
+ krb5int_access kaccess;
+
+ code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
+ if (code)
+ goto fail;
+
+ ctx->have_acceptor_subkey = 0;
+ ctx->proto = 0;
+ ctx->cksumtype = 0;
+ switch(ctx->subkey->enctype) {
+ case ENCTYPE_DES_CBC_MD5:
+ case ENCTYPE_DES_CBC_MD4:
+ case ENCTYPE_DES_CBC_CRC:
+ ctx->subkey->enctype = ENCTYPE_DES_CBC_RAW;
+ ctx->signalg = SGN_ALG_DES_MAC_MD5;
+ ctx->cksum_size = 8;
+ ctx->sealalg = SEAL_ALG_DES;
+
+ /* The encryption key is the session key XOR
+ 0xf0f0f0f0f0f0f0f0. */
+ if ((code = krb5_copy_keyblock(context, ctx->subkey, &ctx->enc)))
+ goto fail;
+
+ for (i=0; i<ctx->enc->length; i++)
+ ctx->enc->contents[i] ^= 0xf0;
+
+ goto copy_subkey_to_seq;
+
+ case ENCTYPE_DES3_CBC_SHA1:
+ /* MIT extension */
+ ctx->subkey->enctype = ENCTYPE_DES3_CBC_RAW;
+ ctx->signalg = SGN_ALG_HMAC_SHA1_DES3_KD;
+ ctx->cksum_size = 20;
+ ctx->sealalg = SEAL_ALG_DES3KD;
+
+ copy_subkey:
+ code = krb5_copy_keyblock (context, ctx->subkey, &ctx->enc);
+ if (code)
+ goto fail;
+ copy_subkey_to_seq:
+ code = krb5_copy_keyblock (context, ctx->subkey, &ctx->seq);
+ if (code) {
+ krb5_free_keyblock (context, ctx->enc);
+ goto fail;
+ }
+ break;
+
+ case ENCTYPE_ARCFOUR_HMAC:
+ /* Microsoft extension */
+ ctx->signalg = SGN_ALG_HMAC_MD5 ;
+ ctx->cksum_size = 8;
+ ctx->sealalg = SEAL_ALG_MICROSOFT_RC4 ;
+
+ goto copy_subkey;
+
+ default:
+ /* Fill some fields we shouldn't be using on this path
+ with garbage. */
+ ctx->signalg = -10;
+ ctx->sealalg = -10;
+
+ ctx->proto = 1;
+ code = (*kaccess.krb5int_c_mandatory_cksumtype)(context, ctx->subkey->enctype,
+ &ctx->cksumtype);
+ if (code)
+ goto fail;
+ code = krb5_c_checksum_length(context, ctx->cksumtype,
+ &ctx->cksum_size);
+ if (code)
+ goto fail;
+ goto copy_subkey;
+ }
fail:
- *minor_status = code;
- return GSS_S_FAILURE;
+ *minor_status = code;
+ return GSS_S_FAILURE;
}
/*
@@ -444,204 +445,204 @@ fail:
*/
static OM_uint32
new_connection(
- OM_uint32 *minor_status,
- krb5_gss_cred_id_t cred,
- gss_ctx_id_t *context_handle,
- gss_name_t target_name,
- gss_OID mech_type,
- OM_uint32 req_flags,
- OM_uint32 time_req,
- gss_channel_bindings_t input_chan_bindings,
- gss_buffer_t input_token,
- gss_OID *actual_mech_type,
- gss_buffer_t output_token,
- OM_uint32 *ret_flags,
- OM_uint32 *time_rec,
- krb5_context context,
- int default_mech)
+ OM_uint32 *minor_status,
+ krb5_gss_cred_id_t cred,
+ gss_ctx_id_t *context_handle,
+ gss_name_t target_name,
+ gss_OID mech_type,
+ OM_uint32 req_flags,
+ OM_uint32 time_req,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_buffer_t input_token,
+ gss_OID *actual_mech_type,
+ gss_buffer_t output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec,
+ krb5_context context,
+ int default_mech)
{
- OM_uint32 major_status;
- krb5_error_code code;
- krb5_creds *k_cred;
- krb5_gss_ctx_id_rec *ctx, *ctx_free;
- krb5_timestamp now;
- gss_buffer_desc token;
-
- k5_mutex_assert_locked(&cred->lock);
- major_status = GSS_S_FAILURE;
- token.length = 0;
- token.value = NULL;
-
- /* make sure the cred is usable for init */
-
- if ((cred->usage != GSS_C_INITIATE) &&
- (cred->usage != GSS_C_BOTH)) {
- *minor_status = 0;
- return(GSS_S_NO_CRED);
- }
-
- /* complain if the input token is non-null */
-
- if (input_token != GSS_C_NO_BUFFER && input_token->length != 0) {
- *minor_status = 0;
- return(GSS_S_DEFECTIVE_TOKEN);
- }
-
- /* create the ctx */
-
- if ((ctx = (krb5_gss_ctx_id_rec *) xmalloc(sizeof(krb5_gss_ctx_id_rec)))
- == NULL) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
-
- /* fill in the ctx */
- memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
- ctx_free = ctx;
- if ((code = krb5_auth_con_init(context, &ctx->auth_context)))
- goto fail;
- krb5_auth_con_setflags(context, ctx->auth_context,
- KRB5_AUTH_CONTEXT_DO_SEQUENCE);
-
- /* limit the encryption types negotiated (if requested) */
- if (cred->req_enctypes) {
- if ((code = krb5_set_default_tgs_enctypes(context,
- cred->req_enctypes))) {
- goto fail;
- }
- }
-
- ctx->initiate = 1;
- ctx->gss_flags = (GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG |
- GSS_C_TRANS_FLAG |
- ((req_flags) & (GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG |
- GSS_C_SEQUENCE_FLAG | GSS_C_DELEG_FLAG)));
- ctx->seed_init = 0;
- ctx->big_endian = 0; /* all initiators do little-endian, as per spec */
- ctx->seqstate = 0;
-
- if ((code = krb5_timeofday(context, &now)))
- goto fail;
-
- if (time_req == 0 || time_req == GSS_C_INDEFINITE) {
- ctx->endtime = 0;
- } else {
- ctx->endtime = now + time_req;
- }
-
- if ((code = krb5_copy_principal(context, cred->princ, &ctx->here)))
- goto fail;
-
- if ((code = krb5_copy_principal(context, (krb5_principal) target_name,
- &ctx->there)))
- goto fail;
-
- code = get_credentials(context, cred, ctx->there, now,
- ctx->endtime, &k_cred);
- if (code)
- goto fail;
-
- if (default_mech) {
- mech_type = (gss_OID) gss_mech_krb5;
- }
-
- if (generic_gss_copy_oid(minor_status, mech_type, &ctx->mech_used)
- != GSS_S_COMPLETE) {
- code = *minor_status;
- goto fail;
- }
- /*
- * Now try to make it static if at all possible....
- */
- ctx->mech_used = krb5_gss_convert_static_mech_oid(ctx->mech_used);
-
- {
- /* gsskrb5 v1 */
- krb5_ui_4 seq_temp;
- if ((code = make_ap_req_v1(context, ctx,
- cred, k_cred, input_chan_bindings,
- mech_type, &token))) {
- if ((code == KRB5_FCC_NOFILE) || (code == KRB5_CC_NOTFOUND) ||
- (code == KG_EMPTY_CCACHE))
- major_status = GSS_S_NO_CRED;
- if (code == KRB5KRB_AP_ERR_TKT_EXPIRED)
- major_status = GSS_S_CREDENTIALS_EXPIRED;
- goto fail;
- }
-
- krb5_auth_con_getlocalseqnumber(context, ctx->auth_context, &seq_temp);
- ctx->seq_send = seq_temp;
- krb5_auth_con_getsendsubkey(context, ctx->auth_context,
- &ctx->subkey);
- }
-
- major_status = setup_enc(minor_status, ctx, context);
-
- if (k_cred) {
- krb5_free_creds(context, k_cred);
- k_cred = 0;
- }
-
- /* at this point, the context is constructed and valid,
- hence, releaseable */
-
- /* intern the context handle */
-
- if (! kg_save_ctx_id((gss_ctx_id_t) ctx)) {
- code = G_VALIDATE_FAILED;
- goto fail;
- }
- *context_handle = (gss_ctx_id_t) ctx;
- ctx_free = 0;
-
- /* compute time_rec */
- if (time_rec) {
- if ((code = krb5_timeofday(context, &now)))
- goto fail;
- *time_rec = ctx->endtime - now;
- }
-
- /* set the other returns */
- *output_token = token;
-
- if (ret_flags)
- *ret_flags = ctx->gss_flags;
-
- if (actual_mech_type)
- *actual_mech_type = mech_type;
-
- /* return successfully */
-
- *minor_status = 0;
- if (ctx->gss_flags & GSS_C_MUTUAL_FLAG) {
- ctx->established = 0;
- return(GSS_S_CONTINUE_NEEDED);
- } else {
- ctx->seq_recv = ctx->seq_send;
- g_order_init(&(ctx->seqstate), ctx->seq_recv,
- (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
- (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) != 0, ctx->proto);
- ctx->gss_flags |= GSS_C_PROT_READY_FLAG;
- ctx->established = 1;
- return(GSS_S_COMPLETE);
- }
+ OM_uint32 major_status;
+ krb5_error_code code;
+ krb5_creds *k_cred;
+ krb5_gss_ctx_id_rec *ctx, *ctx_free;
+ krb5_timestamp now;
+ gss_buffer_desc token;
+
+ k5_mutex_assert_locked(&cred->lock);
+ major_status = GSS_S_FAILURE;
+ token.length = 0;
+ token.value = NULL;
+
+ /* make sure the cred is usable for init */
+
+ if ((cred->usage != GSS_C_INITIATE) &&
+ (cred->usage != GSS_C_BOTH)) {
+ *minor_status = 0;
+ return(GSS_S_NO_CRED);
+ }
+
+ /* complain if the input token is non-null */
+
+ if (input_token != GSS_C_NO_BUFFER && input_token->length != 0) {
+ *minor_status = 0;
+ return(GSS_S_DEFECTIVE_TOKEN);
+ }
+
+ /* create the ctx */
+
+ if ((ctx = (krb5_gss_ctx_id_rec *) xmalloc(sizeof(krb5_gss_ctx_id_rec)))
+ == NULL) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+
+ /* fill in the ctx */
+ memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
+ ctx_free = ctx;
+ if ((code = krb5_auth_con_init(context, &ctx->auth_context)))
+ goto fail;
+ krb5_auth_con_setflags(context, ctx->auth_context,
+ KRB5_AUTH_CONTEXT_DO_SEQUENCE);
+
+ /* limit the encryption types negotiated (if requested) */
+ if (cred->req_enctypes) {
+ if ((code = krb5_set_default_tgs_enctypes(context,
+ cred->req_enctypes))) {
+ goto fail;
+ }
+ }
+
+ ctx->initiate = 1;
+ ctx->gss_flags = (GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG |
+ GSS_C_TRANS_FLAG |
+ ((req_flags) & (GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG |
+ GSS_C_SEQUENCE_FLAG | GSS_C_DELEG_FLAG)));
+ ctx->seed_init = 0;
+ ctx->big_endian = 0; /* all initiators do little-endian, as per spec */
+ ctx->seqstate = 0;
+
+ if ((code = krb5_timeofday(context, &now)))
+ goto fail;
+
+ if (time_req == 0 || time_req == GSS_C_INDEFINITE) {
+ ctx->endtime = 0;
+ } else {
+ ctx->endtime = now + time_req;
+ }
+
+ if ((code = krb5_copy_principal(context, cred->princ, &ctx->here)))
+ goto fail;
+
+ if ((code = krb5_copy_principal(context, (krb5_principal) target_name,
+ &ctx->there)))
+ goto fail;
+
+ code = get_credentials(context, cred, ctx->there, now,
+ ctx->endtime, &k_cred);
+ if (code)
+ goto fail;
+
+ if (default_mech) {
+ mech_type = (gss_OID) gss_mech_krb5;
+ }
+
+ if (generic_gss_copy_oid(minor_status, mech_type, &ctx->mech_used)
+ != GSS_S_COMPLETE) {
+ code = *minor_status;
+ goto fail;
+ }
+ /*
+ * Now try to make it static if at all possible....
+ */
+ ctx->mech_used = krb5_gss_convert_static_mech_oid(ctx->mech_used);
+
+ {
+ /* gsskrb5 v1 */
+ krb5_ui_4 seq_temp;
+ if ((code = make_ap_req_v1(context, ctx,
+ cred, k_cred, input_chan_bindings,
+ mech_type, &token))) {
+ if ((code == KRB5_FCC_NOFILE) || (code == KRB5_CC_NOTFOUND) ||
+ (code == KG_EMPTY_CCACHE))
+ major_status = GSS_S_NO_CRED;
+ if (code == KRB5KRB_AP_ERR_TKT_EXPIRED)
+ major_status = GSS_S_CREDENTIALS_EXPIRED;
+ goto fail;
+ }
+
+ krb5_auth_con_getlocalseqnumber(context, ctx->auth_context, &seq_temp);
+ ctx->seq_send = seq_temp;
+ krb5_auth_con_getsendsubkey(context, ctx->auth_context,
+ &ctx->subkey);
+ }
+
+ major_status = setup_enc(minor_status, ctx, context);
+
+ if (k_cred) {
+ krb5_free_creds(context, k_cred);
+ k_cred = 0;
+ }
+
+ /* at this point, the context is constructed and valid,
+ hence, releaseable */
+
+ /* intern the context handle */
+
+ if (! kg_save_ctx_id((gss_ctx_id_t) ctx)) {
+ code = G_VALIDATE_FAILED;
+ goto fail;
+ }
+ *context_handle = (gss_ctx_id_t) ctx;
+ ctx_free = 0;
+
+ /* compute time_rec */
+ if (time_rec) {
+ if ((code = krb5_timeofday(context, &now)))
+ goto fail;
+ *time_rec = ctx->endtime - now;
+ }
+
+ /* set the other returns */
+ *output_token = token;
+
+ if (ret_flags)
+ *ret_flags = ctx->gss_flags;
+
+ if (actual_mech_type)
+ *actual_mech_type = mech_type;
+
+ /* return successfully */
+
+ *minor_status = 0;
+ if (ctx->gss_flags & GSS_C_MUTUAL_FLAG) {
+ ctx->established = 0;
+ return(GSS_S_CONTINUE_NEEDED);
+ } else {
+ ctx->seq_recv = ctx->seq_send;
+ g_order_init(&(ctx->seqstate), ctx->seq_recv,
+ (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
+ (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) != 0, ctx->proto);
+ ctx->gss_flags |= GSS_C_PROT_READY_FLAG;
+ ctx->established = 1;
+ return(GSS_S_COMPLETE);
+ }
fail:
- if (ctx_free) {
- if (ctx_free->auth_context)
- krb5_auth_con_free(context, ctx_free->auth_context);
- if (ctx_free->here)
- krb5_free_principal(context, ctx_free->here);
- if (ctx_free->there)
- krb5_free_principal(context, ctx_free->there);
- if (ctx_free->subkey)
- krb5_free_keyblock(context, ctx_free->subkey);
- xfree(ctx_free);
- } else
- (void)krb5_gss_delete_sec_context(minor_status, context_handle, NULL);
-
- *minor_status = code;
- return (major_status);
+ if (ctx_free) {
+ if (ctx_free->auth_context)
+ krb5_auth_con_free(context, ctx_free->auth_context);
+ if (ctx_free->here)
+ krb5_free_principal(context, ctx_free->here);
+ if (ctx_free->there)
+ krb5_free_principal(context, ctx_free->there);
+ if (ctx_free->subkey)
+ krb5_free_keyblock(context, ctx_free->subkey);
+ xfree(ctx_free);
+ } else
+ (void)krb5_gss_delete_sec_context(minor_status, context_handle, NULL);
+
+ *minor_status = code;
+ return (major_status);
}
/*
@@ -651,180 +652,180 @@ fail:
*/
static OM_uint32
mutual_auth(
- OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- gss_name_t target_name,
- gss_OID mech_type,
- OM_uint32 req_flags,
- OM_uint32 time_req,
- gss_channel_bindings_t input_chan_bindings,
- gss_buffer_t input_token,
- gss_OID *actual_mech_type,
- gss_buffer_t output_token,
- OM_uint32 *ret_flags,
- OM_uint32 *time_rec,
- krb5_context context)
+ OM_uint32 *minor_status,
+ gss_ctx_id_t *context_handle,
+ gss_name_t target_name,
+ gss_OID mech_type,
+ OM_uint32 req_flags,
+ OM_uint32 time_req,
+ gss_channel_bindings_t input_chan_bindings,
+ gss_buffer_t input_token,
+ gss_OID *actual_mech_type,
+ gss_buffer_t output_token,
+ OM_uint32 *ret_flags,
+ OM_uint32 *time_rec,
+ krb5_context context)
{
- OM_uint32 major_status;
- unsigned char *ptr;
- char *sptr;
- krb5_data ap_rep;
- krb5_ap_rep_enc_part *ap_rep_data;
- krb5_timestamp now;
- krb5_gss_ctx_id_rec *ctx;
- krb5_error *krb_error;
- krb5_error_code code;
- krb5int_access kaccess;
-
- major_status = GSS_S_FAILURE;
-
- code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
- if (code)
- goto fail;
-
- /* validate the context handle */
- /*SUPPRESS 29*/
- if (! kg_validate_ctx_id(*context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
-
- ctx = (krb5_gss_ctx_id_t) *context_handle;
-
- /* make sure the context is non-established, and that certain
- arguments are unchanged */
-
- if ((ctx->established) ||
- ((ctx->gss_flags & GSS_C_MUTUAL_FLAG) == 0)) {
- code = KG_CONTEXT_ESTABLISHED;
- goto fail;
- }
-
- if (! krb5_principal_compare(context, ctx->there,
- (krb5_principal) target_name)) {
- (void)krb5_gss_delete_sec_context(minor_status,
- context_handle, NULL);
- code = 0;
- major_status = GSS_S_BAD_NAME;
- goto fail;
- }
-
- /* verify the token and leave the AP_REP message in ap_rep */
-
- if (input_token == GSS_C_NO_BUFFER) {
- (void)krb5_gss_delete_sec_context(minor_status,
- context_handle, NULL);
- code = 0;
- major_status = GSS_S_DEFECTIVE_TOKEN;
- goto fail;
- }
-
- ptr = (unsigned char *) input_token->value;
-
- if (g_verify_token_header(ctx->mech_used,
- &(ap_rep.length),
- &ptr, KG_TOK_CTX_AP_REP,
- input_token->length, 1)) {
- if (g_verify_token_header((gss_OID) ctx->mech_used,
- &(ap_rep.length),
- &ptr, KG_TOK_CTX_ERROR,
- input_token->length, 1) == 0) {
-
- /* Handle a KRB_ERROR message from the server */
-
- sptr = (char *) ptr; /* PC compiler bug */
- TREAD_STR(sptr, ap_rep.data, ap_rep.length);
-
- code = krb5_rd_error(context, &ap_rep, &krb_error);
- if (code)
- goto fail;
- if (krb_error->error)
- code = krb_error->error + ERROR_TABLE_BASE_krb5;
- else
- code = 0;
- krb5_free_error(context, krb_error);
- goto fail;
- } else {
- *minor_status = 0;
- return(GSS_S_DEFECTIVE_TOKEN);
- }
- }
-
- sptr = (char *) ptr; /* PC compiler bug */
- TREAD_STR(sptr, ap_rep.data, ap_rep.length);
-
- /* decode the ap_rep */
- if ((code = krb5_rd_rep(context, ctx->auth_context, &ap_rep,
- &ap_rep_data))) {
- /*
- * XXX A hack for backwards compatiblity.
- * To be removed in 1999 -- proven
- */
- krb5_auth_con_setuseruserkey(context, ctx->auth_context,
- ctx->subkey);
- if ((krb5_rd_rep(context, ctx->auth_context, &ap_rep,
- &ap_rep_data)))
- goto fail;
- }
-
- /* store away the sequence number */
- ctx->seq_recv = ap_rep_data->seq_number;
- g_order_init(&(ctx->seqstate), ctx->seq_recv,
- (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
- (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) !=0, ctx->proto);
-
- if (ctx->proto == 1 && ap_rep_data->subkey) {
- /* Keep acceptor's subkey. */
- ctx->have_acceptor_subkey = 1;
- code = krb5_copy_keyblock(context, ap_rep_data->subkey,
- &ctx->acceptor_subkey);
- if (code)
- goto fail;
- code = (*kaccess.krb5int_c_mandatory_cksumtype)(context,
- ctx->acceptor_subkey->enctype,
- &ctx->acceptor_subkey_cksumtype);
- if (code)
- goto fail;
- }
-
- /* free the ap_rep_data */
- krb5_free_ap_rep_enc_part(context, ap_rep_data);
-
- /* set established */
- ctx->established = 1;
-
- /* set returns */
-
- if (time_rec) {
- if ((code = krb5_timeofday(context, &now)))
- goto fail;
- *time_rec = ctx->endtime - now;
- }
-
- if (ret_flags)
- *ret_flags = ctx->gss_flags;
-
- if (actual_mech_type)
- *actual_mech_type = mech_type;
-
- /* success */
-
- *minor_status = 0;
- return GSS_S_COMPLETE;
+ OM_uint32 major_status;
+ unsigned char *ptr;
+ char *sptr;
+ krb5_data ap_rep;
+ krb5_ap_rep_enc_part *ap_rep_data;
+ krb5_timestamp now;
+ krb5_gss_ctx_id_rec *ctx;
+ krb5_error *krb_error;
+ krb5_error_code code;
+ krb5int_access kaccess;
+
+ major_status = GSS_S_FAILURE;
+
+ code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
+ if (code)
+ goto fail;
+
+ /* validate the context handle */
+ /*SUPPRESS 29*/
+ if (! kg_validate_ctx_id(*context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
+
+ ctx = (krb5_gss_ctx_id_t) *context_handle;
+
+ /* make sure the context is non-established, and that certain
+ arguments are unchanged */
+
+ if ((ctx->established) ||
+ ((ctx->gss_flags & GSS_C_MUTUAL_FLAG) == 0)) {
+ code = KG_CONTEXT_ESTABLISHED;
+ goto fail;
+ }
+
+ if (! krb5_principal_compare(context, ctx->there,
+ (krb5_principal) target_name)) {
+ (void)krb5_gss_delete_sec_context(minor_status,
+ context_handle, NULL);
+ code = 0;
+ major_status = GSS_S_BAD_NAME;
+ goto fail;
+ }
+
+ /* verify the token and leave the AP_REP message in ap_rep */
+
+ if (input_token == GSS_C_NO_BUFFER) {
+ (void)krb5_gss_delete_sec_context(minor_status,
+ context_handle, NULL);
+ code = 0;
+ major_status = GSS_S_DEFECTIVE_TOKEN;
+ goto fail;
+ }
+
+ ptr = (unsigned char *) input_token->value;
+
+ if (g_verify_token_header(ctx->mech_used,
+ &(ap_rep.length),
+ &ptr, KG_TOK_CTX_AP_REP,
+ input_token->length, 1)) {
+ if (g_verify_token_header((gss_OID) ctx->mech_used,
+ &(ap_rep.length),
+ &ptr, KG_TOK_CTX_ERROR,
+ input_token->length, 1) == 0) {
+
+ /* Handle a KRB_ERROR message from the server */
+
+ sptr = (char *) ptr; /* PC compiler bug */
+ TREAD_STR(sptr, ap_rep.data, ap_rep.length);
+
+ code = krb5_rd_error(context, &ap_rep, &krb_error);
+ if (code)
+ goto fail;
+ if (krb_error->error)
+ code = krb_error->error + ERROR_TABLE_BASE_krb5;
+ else
+ code = 0;
+ krb5_free_error(context, krb_error);
+ goto fail;
+ } else {
+ *minor_status = 0;
+ return(GSS_S_DEFECTIVE_TOKEN);
+ }
+ }
+
+ sptr = (char *) ptr; /* PC compiler bug */
+ TREAD_STR(sptr, ap_rep.data, ap_rep.length);
+
+ /* decode the ap_rep */
+ if ((code = krb5_rd_rep(context, ctx->auth_context, &ap_rep,
+ &ap_rep_data))) {
+ /*
+ * XXX A hack for backwards compatiblity.
+ * To be removed in 1999 -- proven
+ */
+ krb5_auth_con_setuseruserkey(context, ctx->auth_context,
+ ctx->subkey);
+ if ((krb5_rd_rep(context, ctx->auth_context, &ap_rep,
+ &ap_rep_data)))
+ goto fail;
+ }
+
+ /* store away the sequence number */
+ ctx->seq_recv = ap_rep_data->seq_number;
+ g_order_init(&(ctx->seqstate), ctx->seq_recv,
+ (ctx->gss_flags & GSS_C_REPLAY_FLAG) != 0,
+ (ctx->gss_flags & GSS_C_SEQUENCE_FLAG) !=0, ctx->proto);
+
+ if (ctx->proto == 1 && ap_rep_data->subkey) {
+ /* Keep acceptor's subkey. */
+ ctx->have_acceptor_subkey = 1;
+ code = krb5_copy_keyblock(context, ap_rep_data->subkey,
+ &ctx->acceptor_subkey);
+ if (code)
+ goto fail;
+ code = (*kaccess.krb5int_c_mandatory_cksumtype)(context,
+ ctx->acceptor_subkey->enctype,
+ &ctx->acceptor_subkey_cksumtype);
+ if (code)
+ goto fail;
+ }
+
+ /* free the ap_rep_data */
+ krb5_free_ap_rep_enc_part(context, ap_rep_data);
+
+ /* set established */
+ ctx->established = 1;
+
+ /* set returns */
+
+ if (time_rec) {
+ if ((code = krb5_timeofday(context, &now)))
+ goto fail;
+ *time_rec = ctx->endtime - now;
+ }
+
+ if (ret_flags)
+ *ret_flags = ctx->gss_flags;
+
+ if (actual_mech_type)
+ *actual_mech_type = mech_type;
+
+ /* success */
+
+ *minor_status = 0;
+ return GSS_S_COMPLETE;
fail:
- (void)krb5_gss_delete_sec_context(minor_status, context_handle, NULL);
+ (void)krb5_gss_delete_sec_context(minor_status, context_handle, NULL);
- *minor_status = code;
- return (major_status);
+ *minor_status = code;
+ return (major_status);
}
OM_uint32
krb5_gss_init_sec_context(minor_status, claimant_cred_handle,
- context_handle, target_name, mech_type,
- req_flags, time_req, input_chan_bindings,
- input_token, actual_mech_type, output_token,
- ret_flags, time_rec)
+ context_handle, target_name, mech_type,
+ req_flags, time_req, input_chan_bindings,
+ input_token, actual_mech_type, output_token,
+ ret_flags, time_rec)
OM_uint32 *minor_status;
gss_cred_id_t claimant_cred_handle;
gss_ctx_id_t *context_handle;
@@ -839,142 +840,142 @@ krb5_gss_init_sec_context(minor_status, claimant_cred_handle,
OM_uint32 *ret_flags;
OM_uint32 *time_rec;
{
- krb5_context context;
- krb5_gss_cred_id_t cred;
- int err;
- krb5_error_code kerr;
- int default_mech = 0;
- OM_uint32 major_status;
- OM_uint32 tmp_min_stat;
-
- if (*context_handle == GSS_C_NO_CONTEXT) {
- kerr = krb5_gss_init_context(&context);
- if (kerr) {
- *minor_status = kerr;
- return GSS_S_FAILURE;
- }
- if (GSS_ERROR(kg_sync_ccache_name(context, minor_status))) {
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return GSS_S_FAILURE;
- }
- } else {
- context = ((krb5_gss_ctx_id_rec *)*context_handle)->k5_context;
- }
-
- /* set up return values so they can be "freed" successfully */
-
- major_status = GSS_S_FAILURE; /* Default major code */
- output_token->length = 0;
- output_token->value = NULL;
- if (actual_mech_type)
- *actual_mech_type = NULL;
-
- /* verify that the target_name is valid and usable */
-
- if (! kg_validate_name(target_name)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- save_error_info(*minor_status, context);
- if (*context_handle == GSS_C_NO_CONTEXT)
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
-
- /* verify the credential, or use the default */
- /*SUPPRESS 29*/
- if (claimant_cred_handle == GSS_C_NO_CREDENTIAL) {
- major_status = kg_get_defcred(minor_status, (gss_cred_id_t *)&cred);
- if (major_status && GSS_ERROR(major_status)) {
- if (*context_handle == GSS_C_NO_CONTEXT)
- krb5_free_context(context);
- return(major_status);
- }
- } else {
- major_status = krb5_gss_validate_cred(minor_status, claimant_cred_handle);
- if (GSS_ERROR(major_status)) {
- save_error_info(*minor_status, context);
- if (*context_handle == GSS_C_NO_CONTEXT)
- krb5_free_context(context);
- return(major_status);
- }
- cred = (krb5_gss_cred_id_t) claimant_cred_handle;
- }
- kerr = k5_mutex_lock(&cred->lock);
- if (kerr) {
- krb5_free_context(context);
- *minor_status = kerr;
- return GSS_S_FAILURE;
- }
-
- /* verify the mech_type */
-
- err = 0;
- if (mech_type == GSS_C_NULL_OID) {
- default_mech = 1;
- if (cred->rfc_mech) {
- mech_type = (gss_OID) gss_mech_krb5;
- } else if (cred->prerfc_mech) {
- mech_type = (gss_OID) gss_mech_krb5_old;
- } else {
- err = 1;
- }
- } else if (g_OID_equal(mech_type, gss_mech_krb5)) {
- if (!cred->rfc_mech)
- err = 1;
- } else if (g_OID_equal(mech_type, gss_mech_krb5_old)) {
- if (!cred->prerfc_mech)
- err = 1;
- } else if (g_OID_equal(mech_type, gss_mech_krb5_wrong)) {
- if (!cred->rfc_mech)
- err = 1;
- } else {
- err = 1;
- }
-
- if (err) {
- k5_mutex_unlock(&cred->lock);
- if (claimant_cred_handle == GSS_C_NO_CREDENTIAL)
- krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
- *minor_status = 0;
- if (*context_handle == GSS_C_NO_CONTEXT)
- krb5_free_context(context);
- return(GSS_S_BAD_MECH);
- }
-
- /* is this a new connection or not? */
-
- /*SUPPRESS 29*/
- if (*context_handle == GSS_C_NO_CONTEXT) {
- major_status = new_connection(minor_status, cred, context_handle,
- target_name, mech_type, req_flags,
- time_req, input_chan_bindings,
- input_token, actual_mech_type,
- output_token, ret_flags, time_rec,
- context, default_mech);
- k5_mutex_unlock(&cred->lock);
- if (*context_handle == GSS_C_NO_CONTEXT) {
- save_error_info (*minor_status, context);
- krb5_free_context(context);
- } else
- ((krb5_gss_ctx_id_rec *) *context_handle)->k5_context = context;
- } else {
- /* mutual_auth doesn't care about the credentials */
- k5_mutex_unlock(&cred->lock);
- major_status = mutual_auth(minor_status, context_handle,
- target_name, mech_type, req_flags,
- time_req, input_chan_bindings,
- input_token, actual_mech_type,
- output_token, ret_flags, time_rec,
- context);
- /* If context_handle is now NO_CONTEXT, mutual_auth called
- delete_sec_context, which would've zapped the krb5 context
- too. */
- }
-
- if (claimant_cred_handle == GSS_C_NO_CREDENTIAL)
- krb5_gss_release_cred(&tmp_min_stat, (gss_cred_id_t *)&cred);
-
- return(major_status);
+ krb5_context context;
+ krb5_gss_cred_id_t cred;
+ int err;
+ krb5_error_code kerr;
+ int default_mech = 0;
+ OM_uint32 major_status;
+ OM_uint32 tmp_min_stat;
+
+ if (*context_handle == GSS_C_NO_CONTEXT) {
+ kerr = krb5_gss_init_context(&context);
+ if (kerr) {
+ *minor_status = kerr;
+ return GSS_S_FAILURE;
+ }
+ if (GSS_ERROR(kg_sync_ccache_name(context, minor_status))) {
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return GSS_S_FAILURE;
+ }
+ } else {
+ context = ((krb5_gss_ctx_id_rec *)*context_handle)->k5_context;
+ }
+
+ /* set up return values so they can be "freed" successfully */
+
+ major_status = GSS_S_FAILURE; /* Default major code */
+ output_token->length = 0;
+ output_token->value = NULL;
+ if (actual_mech_type)
+ *actual_mech_type = NULL;
+
+ /* verify that the target_name is valid and usable */
+
+ if (! kg_validate_name(target_name)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ save_error_info(*minor_status, context);
+ if (*context_handle == GSS_C_NO_CONTEXT)
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
+
+ /* verify the credential, or use the default */
+ /*SUPPRESS 29*/
+ if (claimant_cred_handle == GSS_C_NO_CREDENTIAL) {
+ major_status = kg_get_defcred(minor_status, (gss_cred_id_t *)&cred);
+ if (major_status && GSS_ERROR(major_status)) {
+ if (*context_handle == GSS_C_NO_CONTEXT)
+ krb5_free_context(context);
+ return(major_status);
+ }
+ } else {
+ major_status = krb5_gss_validate_cred(minor_status, claimant_cred_handle);
+ if (GSS_ERROR(major_status)) {
+ save_error_info(*minor_status, context);
+ if (*context_handle == GSS_C_NO_CONTEXT)
+ krb5_free_context(context);
+ return(major_status);
+ }
+ cred = (krb5_gss_cred_id_t) claimant_cred_handle;
+ }
+ kerr = k5_mutex_lock(&cred->lock);
+ if (kerr) {
+ krb5_free_context(context);
+ *minor_status = kerr;
+ return GSS_S_FAILURE;
+ }
+
+ /* verify the mech_type */
+
+ err = 0;
+ if (mech_type == GSS_C_NULL_OID) {
+ default_mech = 1;
+ if (cred->rfc_mech) {
+ mech_type = (gss_OID) gss_mech_krb5;
+ } else if (cred->prerfc_mech) {
+ mech_type = (gss_OID) gss_mech_krb5_old;
+ } else {
+ err = 1;
+ }
+ } else if (g_OID_equal(mech_type, gss_mech_krb5)) {
+ if (!cred->rfc_mech)
+ err = 1;
+ } else if (g_OID_equal(mech_type, gss_mech_krb5_old)) {
+ if (!cred->prerfc_mech)
+ err = 1;
+ } else if (g_OID_equal(mech_type, gss_mech_krb5_wrong)) {
+ if (!cred->rfc_mech)
+ err = 1;
+ } else {
+ err = 1;
+ }
+
+ if (err) {
+ k5_mutex_unlock(&cred->lock);
+ if (claimant_cred_handle == GSS_C_NO_CREDENTIAL)
+ krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
+ *minor_status = 0;
+ if (*context_handle == GSS_C_NO_CONTEXT)
+ krb5_free_context(context);
+ return(GSS_S_BAD_MECH);
+ }
+
+ /* is this a new connection or not? */
+
+ /*SUPPRESS 29*/
+ if (*context_handle == GSS_C_NO_CONTEXT) {
+ major_status = new_connection(minor_status, cred, context_handle,
+ target_name, mech_type, req_flags,
+ time_req, input_chan_bindings,
+ input_token, actual_mech_type,
+ output_token, ret_flags, time_rec,
+ context, default_mech);
+ k5_mutex_unlock(&cred->lock);
+ if (*context_handle == GSS_C_NO_CONTEXT) {
+ save_error_info (*minor_status, context);
+ krb5_free_context(context);
+ } else
+ ((krb5_gss_ctx_id_rec *) *context_handle)->k5_context = context;
+ } else {
+ /* mutual_auth doesn't care about the credentials */
+ k5_mutex_unlock(&cred->lock);
+ major_status = mutual_auth(minor_status, context_handle,
+ target_name, mech_type, req_flags,
+ time_req, input_chan_bindings,
+ input_token, actual_mech_type,
+ output_token, ret_flags, time_rec,
+ context);
+ /* If context_handle is now NO_CONTEXT, mutual_auth called
+ delete_sec_context, which would've zapped the krb5 context
+ too. */
+ }
+
+ if (claimant_cred_handle == GSS_C_NO_CREDENTIAL)
+ krb5_gss_release_cred(&tmp_min_stat, (gss_cred_id_t *)&cred);
+
+ return(major_status);
}
#ifndef _WIN32
@@ -992,16 +993,16 @@ krb5_gss_init_context (krb5_context *ctxp)
err = gssint_initialize_library();
if (err)
- return err;
+ return err;
#ifndef _WIN32
err = k5_mutex_lock(&kg_kdc_flag_mutex);
if (err)
- return err;
+ return err;
is_kdc = kdc_flag;
k5_mutex_unlock(&kg_kdc_flag_mutex);
if (is_kdc)
- return krb5int_init_context_kdc(ctxp);
+ return krb5int_init_context_kdc(ctxp);
#endif
return krb5_init_context(ctxp);
@@ -1015,13 +1016,12 @@ krb5_gss_use_kdc_context()
err = gssint_initialize_library();
if (err)
- return err;
+ return err;
err = k5_mutex_lock(&kg_kdc_flag_mutex);
if (err)
- return err;
+ return err;
kdc_flag = 1;
k5_mutex_unlock(&kg_kdc_flag_mutex);
return 0;
}
#endif
-
diff --git a/src/lib/gssapi/krb5/inq_context.c b/src/lib/gssapi/krb5/inq_context.c
index ab9d81a4fc..74ae178d81 100644
--- a/src/lib/gssapi/krb5/inq_context.c
+++ b/src/lib/gssapi/krb5/inq_context.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -23,113 +24,113 @@
#include "gssapiP_krb5.h"
OM_uint32
-krb5_gss_inquire_context(minor_status, context_handle, initiator_name,
- acceptor_name, lifetime_rec, mech_type, ret_flags,
- locally_initiated, opened)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_name_t *initiator_name;
- gss_name_t *acceptor_name;
- OM_uint32 *lifetime_rec;
- gss_OID *mech_type;
- OM_uint32 *ret_flags;
- int *locally_initiated;
- int *opened;
+krb5_gss_inquire_context(minor_status, context_handle, initiator_name,
+ acceptor_name, lifetime_rec, mech_type, ret_flags,
+ locally_initiated, opened)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_name_t *initiator_name;
+ gss_name_t *acceptor_name;
+ OM_uint32 *lifetime_rec;
+ gss_OID *mech_type;
+ OM_uint32 *ret_flags;
+ int *locally_initiated;
+ int *opened;
{
- krb5_context context;
- krb5_error_code code;
- krb5_gss_ctx_id_rec *ctx;
- krb5_principal initiator, acceptor;
- krb5_timestamp now;
- krb5_deltat lifetime;
-
- if (initiator_name)
- *initiator_name = (gss_name_t) NULL;
- if (acceptor_name)
- *acceptor_name = (gss_name_t) NULL;
-
- /* validate the context handle */
- if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
-
- ctx = (krb5_gss_ctx_id_rec *) context_handle;
-
- if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
- }
-
- initiator = NULL;
- acceptor = NULL;
- context = ctx->k5_context;
-
- if ((code = krb5_timeofday(context, &now))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
- }
-
- if ((lifetime = ctx->endtime - now) < 0)
- lifetime = 0;
-
- if (initiator_name) {
- if ((code = krb5_copy_principal(context,
- ctx->initiate?ctx->here:ctx->there,
- &initiator))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
- }
- if (! kg_save_name((gss_name_t) initiator)) {
- krb5_free_principal(context, initiator);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
- }
- }
-
- if (acceptor_name) {
- if ((code = krb5_copy_principal(context,
- ctx->initiate?ctx->there:ctx->here,
- &acceptor))) {
- if (initiator) krb5_free_principal(context, initiator);
- *minor_status = code;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
- }
- if (! kg_save_name((gss_name_t) acceptor)) {
- krb5_free_principal(context, acceptor);
- if (initiator) {
- kg_delete_name((gss_name_t) initiator);
- krb5_free_principal(context, initiator);
- }
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_FAILURE);
- }
- }
-
- if (initiator_name)
- *initiator_name = (gss_name_t) initiator;
-
- if (acceptor_name)
- *acceptor_name = (gss_name_t) acceptor;
-
- if (lifetime_rec)
- *lifetime_rec = lifetime;
-
- if (mech_type)
- *mech_type = (gss_OID) ctx->mech_used;
-
- if (ret_flags)
- *ret_flags = ctx->gss_flags;
-
- if (locally_initiated)
- *locally_initiated = ctx->initiate;
-
- if (opened)
- *opened = ctx->established;
-
- *minor_status = 0;
- return((lifetime == 0)?GSS_S_CONTEXT_EXPIRED:GSS_S_COMPLETE);
+ krb5_context context;
+ krb5_error_code code;
+ krb5_gss_ctx_id_rec *ctx;
+ krb5_principal initiator, acceptor;
+ krb5_timestamp now;
+ krb5_deltat lifetime;
+
+ if (initiator_name)
+ *initiator_name = (gss_name_t) NULL;
+ if (acceptor_name)
+ *acceptor_name = (gss_name_t) NULL;
+
+ /* validate the context handle */
+ if (! kg_validate_ctx_id(context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
+
+ ctx = (krb5_gss_ctx_id_rec *) context_handle;
+
+ if (! ctx->established) {
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
+ }
+
+ initiator = NULL;
+ acceptor = NULL;
+ context = ctx->k5_context;
+
+ if ((code = krb5_timeofday(context, &now))) {
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
+ }
+
+ if ((lifetime = ctx->endtime - now) < 0)
+ lifetime = 0;
+
+ if (initiator_name) {
+ if ((code = krb5_copy_principal(context,
+ ctx->initiate?ctx->here:ctx->there,
+ &initiator))) {
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
+ }
+ if (! kg_save_name((gss_name_t) initiator)) {
+ krb5_free_principal(context, initiator);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
+ }
+ }
+
+ if (acceptor_name) {
+ if ((code = krb5_copy_principal(context,
+ ctx->initiate?ctx->there:ctx->here,
+ &acceptor))) {
+ if (initiator) krb5_free_principal(context, initiator);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
+ }
+ if (! kg_save_name((gss_name_t) acceptor)) {
+ krb5_free_principal(context, acceptor);
+ if (initiator) {
+ kg_delete_name((gss_name_t) initiator);
+ krb5_free_principal(context, initiator);
+ }
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_FAILURE);
+ }
+ }
+
+ if (initiator_name)
+ *initiator_name = (gss_name_t) initiator;
+
+ if (acceptor_name)
+ *acceptor_name = (gss_name_t) acceptor;
+
+ if (lifetime_rec)
+ *lifetime_rec = lifetime;
+
+ if (mech_type)
+ *mech_type = (gss_OID) ctx->mech_used;
+
+ if (ret_flags)
+ *ret_flags = ctx->gss_flags;
+
+ if (locally_initiated)
+ *locally_initiated = ctx->initiate;
+
+ if (opened)
+ *opened = ctx->established;
+
+ *minor_status = 0;
+ return((lifetime == 0)?GSS_S_CONTEXT_EXPIRED:GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/inq_cred.c b/src/lib/gssapi/krb5/inq_cred.c
index aa50d12313..d23d7f9510 100644
--- a/src/lib/gssapi/krb5/inq_cred.c
+++ b/src/lib/gssapi/krb5/inq_cred.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000, 2007 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -46,14 +47,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -64,7 +65,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -74,195 +75,194 @@
OM_uint32
krb5_gss_inquire_cred(minor_status, cred_handle, name, lifetime_ret,
- cred_usage, mechanisms)
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
- gss_name_t *name;
- OM_uint32 *lifetime_ret;
- gss_cred_usage_t *cred_usage;
- gss_OID_set *mechanisms;
+ cred_usage, mechanisms)
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
+ gss_name_t *name;
+ OM_uint32 *lifetime_ret;
+ gss_cred_usage_t *cred_usage;
+ gss_OID_set *mechanisms;
{
- krb5_context context;
- krb5_gss_cred_id_t cred;
- krb5_error_code code;
- krb5_timestamp now;
- krb5_deltat lifetime;
- krb5_principal ret_name;
- gss_OID_set mechs;
- OM_uint32 ret;
+ krb5_context context;
+ krb5_gss_cred_id_t cred;
+ krb5_error_code code;
+ krb5_timestamp now;
+ krb5_deltat lifetime;
+ krb5_principal ret_name;
+ gss_OID_set mechs;
+ OM_uint32 ret;
+
+ ret = GSS_S_FAILURE;
+ ret_name = NULL;
- ret = GSS_S_FAILURE;
- ret_name = NULL;
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ if (name) *name = NULL;
+ if (mechanisms) *mechanisms = NULL;
- if (name) *name = NULL;
- if (mechanisms) *mechanisms = NULL;
+ /* check for default credential */
+ /*SUPPRESS 29*/
+ if (cred_handle == GSS_C_NO_CREDENTIAL) {
+ OM_uint32 major;
- /* check for default credential */
- /*SUPPRESS 29*/
- if (cred_handle == GSS_C_NO_CREDENTIAL) {
- OM_uint32 major;
+ if ((major = kg_get_defcred(minor_status, (gss_cred_id_t *)&cred)) &&
+ GSS_ERROR(major)) {
+ krb5_free_context(context);
+ return(major);
+ }
+ } else {
+ OM_uint32 major;
- if ((major = kg_get_defcred(minor_status, (gss_cred_id_t *)&cred)) &&
- GSS_ERROR(major)) {
- krb5_free_context(context);
- return(major);
- }
- } else {
- OM_uint32 major;
-
- major = krb5_gss_validate_cred(minor_status, cred_handle);
- if (GSS_ERROR(major)) {
- krb5_free_context(context);
- return(major);
- }
- cred = (krb5_gss_cred_id_t) cred_handle;
- }
+ major = krb5_gss_validate_cred(minor_status, cred_handle);
+ if (GSS_ERROR(major)) {
+ krb5_free_context(context);
+ return(major);
+ }
+ cred = (krb5_gss_cred_id_t) cred_handle;
+ }
- if ((code = krb5_timeofday(context, &now))) {
- *minor_status = code;
- ret = GSS_S_FAILURE;
- goto fail;
- }
+ if ((code = krb5_timeofday(context, &now))) {
+ *minor_status = code;
+ ret = GSS_S_FAILURE;
+ goto fail;
+ }
- code = k5_mutex_lock(&cred->lock);
- if (code != 0) {
- *minor_status = code;
- ret = GSS_S_FAILURE;
- goto fail;
- }
- if (cred->tgt_expire > 0) {
- if ((lifetime = cred->tgt_expire - now) < 0)
- lifetime = 0;
- }
- else
- lifetime = GSS_C_INDEFINITE;
+ code = k5_mutex_lock(&cred->lock);
+ if (code != 0) {
+ *minor_status = code;
+ ret = GSS_S_FAILURE;
+ goto fail;
+ }
+ if (cred->tgt_expire > 0) {
+ if ((lifetime = cred->tgt_expire - now) < 0)
+ lifetime = 0;
+ }
+ else
+ lifetime = GSS_C_INDEFINITE;
- if (name) {
- if (cred->princ &&
- (code = krb5_copy_principal(context, cred->princ, &ret_name))) {
- k5_mutex_unlock(&cred->lock);
- *minor_status = code;
- save_error_info(*minor_status, context);
- ret = GSS_S_FAILURE;
- goto fail;
- }
- }
+ if (name) {
+ if (cred->princ &&
+ (code = krb5_copy_principal(context, cred->princ, &ret_name))) {
+ k5_mutex_unlock(&cred->lock);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ ret = GSS_S_FAILURE;
+ goto fail;
+ }
+ }
- if (mechanisms) {
- if (GSS_ERROR(ret = generic_gss_create_empty_oid_set(minor_status,
- &mechs)) ||
- (cred->prerfc_mech &&
- GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
- gss_mech_krb5_old,
- &mechs))) ||
- (cred->rfc_mech &&
- GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
- gss_mech_krb5,
- &mechs)))) {
- k5_mutex_unlock(&cred->lock);
- if (ret_name)
- krb5_free_principal(context, ret_name);
- /* *minor_status set above */
- goto fail;
- }
- }
+ if (mechanisms) {
+ if (GSS_ERROR(ret = generic_gss_create_empty_oid_set(minor_status,
+ &mechs)) ||
+ (cred->prerfc_mech &&
+ GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
+ gss_mech_krb5_old,
+ &mechs))) ||
+ (cred->rfc_mech &&
+ GSS_ERROR(ret = generic_gss_add_oid_set_member(minor_status,
+ gss_mech_krb5,
+ &mechs)))) {
+ k5_mutex_unlock(&cred->lock);
+ if (ret_name)
+ krb5_free_principal(context, ret_name);
+ /* *minor_status set above */
+ goto fail;
+ }
+ }
- if (name) {
- if (ret_name != NULL && ! kg_save_name((gss_name_t) ret_name)) {
- k5_mutex_unlock(&cred->lock);
- if (cred_handle == GSS_C_NO_CREDENTIAL)
- krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
+ if (name) {
+ if (ret_name != NULL && ! kg_save_name((gss_name_t) ret_name)) {
+ k5_mutex_unlock(&cred->lock);
+ if (cred_handle == GSS_C_NO_CREDENTIAL)
+ krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
- (void) gss_release_oid_set(minor_status, &mechs);
- krb5_free_principal(context, ret_name);
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_FAILURE);
- }
- if (ret_name != NULL)
- *name = (gss_name_t) ret_name;
- else
- *name = GSS_C_NO_NAME;
- }
+ (void) gss_release_oid_set(minor_status, &mechs);
+ krb5_free_principal(context, ret_name);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_FAILURE);
+ }
+ if (ret_name != NULL)
+ *name = (gss_name_t) ret_name;
+ else
+ *name = GSS_C_NO_NAME;
+ }
- if (lifetime_ret)
- *lifetime_ret = lifetime;
+ if (lifetime_ret)
+ *lifetime_ret = lifetime;
- if (cred_usage)
- *cred_usage = cred->usage;
- k5_mutex_unlock(&cred->lock);
+ if (cred_usage)
+ *cred_usage = cred->usage;
+ k5_mutex_unlock(&cred->lock);
- if (mechanisms)
- *mechanisms = mechs;
+ if (mechanisms)
+ *mechanisms = mechs;
- if (cred_handle == GSS_C_NO_CREDENTIAL)
- krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
+ if (cred_handle == GSS_C_NO_CREDENTIAL)
+ krb5_gss_release_cred(minor_status, (gss_cred_id_t *)&cred);
- krb5_free_context(context);
- *minor_status = 0;
- return((lifetime == 0)?GSS_S_CREDENTIALS_EXPIRED:GSS_S_COMPLETE);
+ krb5_free_context(context);
+ *minor_status = 0;
+ return((lifetime == 0)?GSS_S_CREDENTIALS_EXPIRED:GSS_S_COMPLETE);
fail:
- if (cred_handle == GSS_C_NO_CREDENTIAL) {
- OM_uint32 tmp_min_stat;
+ if (cred_handle == GSS_C_NO_CREDENTIAL) {
+ OM_uint32 tmp_min_stat;
- krb5_gss_release_cred(&tmp_min_stat, (gss_cred_id_t *)&cred);
- }
- krb5_free_context(context);
- return ret;
+ krb5_gss_release_cred(&tmp_min_stat, (gss_cred_id_t *)&cred);
+ }
+ krb5_free_context(context);
+ return ret;
}
/* V2 interface */
OM_uint32
krb5_gss_inquire_cred_by_mech(minor_status, cred_handle,
- mech_type, name, initiator_lifetime,
- acceptor_lifetime, cred_usage)
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
- gss_OID mech_type;
- gss_name_t *name;
- OM_uint32 *initiator_lifetime;
- OM_uint32 *acceptor_lifetime;
+ mech_type, name, initiator_lifetime,
+ acceptor_lifetime, cred_usage)
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
+ gss_OID mech_type;
+ gss_name_t *name;
+ OM_uint32 *initiator_lifetime;
+ OM_uint32 *acceptor_lifetime;
gss_cred_usage_t *cred_usage;
{
- krb5_gss_cred_id_t cred;
- OM_uint32 lifetime;
- OM_uint32 mstat;
+ krb5_gss_cred_id_t cred;
+ OM_uint32 lifetime;
+ OM_uint32 mstat;
/*
* We only know how to handle our own creds.
*/
if ((mech_type != GSS_C_NULL_OID) &&
- !g_OID_equal(gss_mech_krb5_old, mech_type) &&
- !g_OID_equal(gss_mech_krb5, mech_type)) {
- *minor_status = 0;
- return(GSS_S_NO_CRED);
+ !g_OID_equal(gss_mech_krb5_old, mech_type) &&
+ !g_OID_equal(gss_mech_krb5, mech_type)) {
+ *minor_status = 0;
+ return(GSS_S_NO_CRED);
}
cred = (krb5_gss_cred_id_t) cred_handle;
mstat = krb5_gss_inquire_cred(minor_status,
- cred_handle,
- name,
- &lifetime,
- cred_usage,
- (gss_OID_set *) NULL);
+ cred_handle,
+ name,
+ &lifetime,
+ cred_usage,
+ (gss_OID_set *) NULL);
if (mstat == GSS_S_COMPLETE) {
- if (cred &&
- ((cred->usage == GSS_C_INITIATE) ||
- (cred->usage == GSS_C_BOTH)) &&
- initiator_lifetime)
- *initiator_lifetime = lifetime;
- if (cred &&
- ((cred->usage == GSS_C_ACCEPT) ||
- (cred->usage == GSS_C_BOTH)) &&
- acceptor_lifetime)
- *acceptor_lifetime = lifetime;
+ if (cred &&
+ ((cred->usage == GSS_C_INITIATE) ||
+ (cred->usage == GSS_C_BOTH)) &&
+ initiator_lifetime)
+ *initiator_lifetime = lifetime;
+ if (cred &&
+ ((cred->usage == GSS_C_ACCEPT) ||
+ (cred->usage == GSS_C_BOTH)) &&
+ acceptor_lifetime)
+ *acceptor_lifetime = lifetime;
}
return(mstat);
}
-
diff --git a/src/lib/gssapi/krb5/inq_names.c b/src/lib/gssapi/krb5/inq_names.c
index c9e3dc9ad0..2301b1ff4a 100644
--- a/src/lib/gssapi/krb5/inq_names.c
+++ b/src/lib/gssapi/krb5/inq_names.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/inq_names.c
*
@@ -32,68 +33,68 @@
OM_uint32
krb5_gss_inquire_names_for_mech(minor_status, mechanism, name_types)
- OM_uint32 *minor_status;
- gss_OID mechanism;
- gss_OID_set *name_types;
+ OM_uint32 *minor_status;
+ gss_OID mechanism;
+ gss_OID_set *name_types;
{
- OM_uint32 major, minor;
+ OM_uint32 major, minor;
/*
* We only know how to handle our own mechanism.
*/
if ((mechanism != GSS_C_NULL_OID) &&
- !g_OID_equal(gss_mech_krb5, mechanism) &&
- !g_OID_equal(gss_mech_krb5_old, mechanism)) {
- *minor_status = 0;
- return(GSS_S_BAD_MECH);
+ !g_OID_equal(gss_mech_krb5, mechanism) &&
+ !g_OID_equal(gss_mech_krb5_old, mechanism)) {
+ *minor_status = 0;
+ return(GSS_S_BAD_MECH);
}
/* We're okay. Create an empty OID set */
major = gss_create_empty_oid_set(minor_status, name_types);
if (major == GSS_S_COMPLETE) {
- /* Now add our members. */
- if (
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_user_name,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_machine_uid_name,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_string_uid_name,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_service_name,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_service_name_v2,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_exported_name,
- name_types)
- ) == GSS_S_COMPLETE) &&
- ((major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_krb5_name,
- name_types)
- ) == GSS_S_COMPLETE)
- ) {
- major = generic_gss_add_oid_set_member(minor_status,
- gss_nt_krb5_principal,
- name_types);
- }
+ /* Now add our members. */
+ if (
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_user_name,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_machine_uid_name,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_string_uid_name,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_service_name,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_service_name_v2,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_exported_name,
+ name_types)
+ ) == GSS_S_COMPLETE) &&
+ ((major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_krb5_name,
+ name_types)
+ ) == GSS_S_COMPLETE)
+ ) {
+ major = generic_gss_add_oid_set_member(minor_status,
+ gss_nt_krb5_principal,
+ name_types);
+ }
- /*
- * If we choked, then release the set, but don't overwrite the minor
- * status with the release call.
- */
- if (major != GSS_S_COMPLETE)
- (void) gss_release_oid_set(&minor,
- name_types);
+ /*
+ * If we choked, then release the set, but don't overwrite the minor
+ * status with the release call.
+ */
+ if (major != GSS_S_COMPLETE)
+ (void) gss_release_oid_set(&minor,
+ name_types);
}
return(major);
}
diff --git a/src/lib/gssapi/krb5/k5seal.c b/src/lib/gssapi/krb5/k5seal.c
index e019e1b13f..d51fb7344f 100644
--- a/src/lib/gssapi/krb5/k5seal.c
+++ b/src/lib/gssapi/krb5/k5seal.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
*
@@ -52,19 +53,19 @@
static krb5_error_code
make_seal_token_v1 (krb5_context context,
- krb5_keyblock *enc,
- krb5_keyblock *seq,
- gssint_uint64 *seqnum,
- int direction,
- gss_buffer_t text,
- gss_buffer_t token,
- int signalg,
- size_t cksum_size,
- int sealalg,
- int do_encrypt,
- int toktype,
- int bigend,
- gss_OID oid)
+ krb5_keyblock *enc,
+ krb5_keyblock *seq,
+ gssint_uint64 *seqnum,
+ int direction,
+ gss_buffer_t text,
+ gss_buffer_t token,
+ int signalg,
+ size_t cksum_size,
+ int sealalg,
+ int do_encrypt,
+ int toktype,
+ int bigend,
+ gss_OID oid)
{
krb5_error_code code;
size_t sumlen;
@@ -72,12 +73,12 @@ make_seal_token_v1 (krb5_context context,
krb5_data plaind;
krb5_checksum md5cksum;
krb5_checksum cksum;
- /* msglen contains the message length
- * we are signing/encrypting. tmsglen
- * contains the length of the message
- * we plan to write out to the token.
- * tlen is the length of the token
- * including header. */
+ /* msglen contains the message length
+ * we are signing/encrypting. tmsglen
+ * contains the length of the message
+ * we plan to write out to the token.
+ * tlen is the length of the token
+ * including header. */
unsigned conflen=0, tmsglen, tlen, msglen;
unsigned char *t, *ptr;
unsigned char *plain;
@@ -89,30 +90,30 @@ make_seal_token_v1 (krb5_context context,
/* create the token buffer */
/* Do we need confounder? */
if (do_encrypt || (!bigend && (toktype == KG_TOK_SEAL_MSG)))
- conflen = kg_confounder_size(context, enc);
+ conflen = kg_confounder_size(context, enc);
else conflen = 0;
if (toktype == KG_TOK_SEAL_MSG) {
- switch (sealalg) {
- case SEAL_ALG_MICROSOFT_RC4:
- msglen = conflen + text->length+1;
- pad = 1;
- break;
- default:
- /* XXX knows that des block size is 8 */
- msglen = (conflen+text->length+8)&(~7);
- pad = 8-(text->length%8);
- }
- tmsglen = msglen;
+ switch (sealalg) {
+ case SEAL_ALG_MICROSOFT_RC4:
+ msglen = conflen + text->length+1;
+ pad = 1;
+ break;
+ default:
+ /* XXX knows that des block size is 8 */
+ msglen = (conflen+text->length+8)&(~7);
+ pad = 8-(text->length%8);
+ }
+ tmsglen = msglen;
} else {
- tmsglen = 0;
- msglen = text->length;
- pad = 0;
+ tmsglen = 0;
+ msglen = text->length;
+ pad = 0;
}
tlen = g_token_size((gss_OID) oid, 14+cksum_size+tmsglen);
if ((t = (unsigned char *) xmalloc(tlen)) == NULL)
- return(ENOMEM);
+ return(ENOMEM);
/*** fill in the token */
@@ -125,12 +126,12 @@ make_seal_token_v1 (krb5_context context,
/* 2..3 SEAL_ALG or Filler */
if ((toktype == KG_TOK_SEAL_MSG) && do_encrypt) {
- ptr[2] = sealalg & 0xff;
- ptr[3] = (sealalg >> 8) & 0xff;
+ ptr[2] = sealalg & 0xff;
+ ptr[3] = (sealalg >> 8) & 0xff;
} else {
- /* No seal */
- ptr[2] = 0xff;
- ptr[3] = 0xff;
+ /* No seal */
+ ptr[2] = 0xff;
+ ptr[3] = 0xff;
}
/* 4..5 Filler */
@@ -143,40 +144,40 @@ make_seal_token_v1 (krb5_context context,
switch (signalg) {
case SGN_ALG_DES_MAC_MD5:
case SGN_ALG_MD2_5:
- md5cksum.checksum_type = CKSUMTYPE_RSA_MD5;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_RSA_MD5;
+ break;
case SGN_ALG_HMAC_SHA1_DES3_KD:
- md5cksum.checksum_type = CKSUMTYPE_HMAC_SHA1_DES3;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_HMAC_SHA1_DES3;
+ break;
case SGN_ALG_HMAC_MD5:
- md5cksum.checksum_type = CKSUMTYPE_HMAC_MD5_ARCFOUR;
- if (toktype != KG_TOK_SEAL_MSG)
- sign_usage = 15;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_HMAC_MD5_ARCFOUR;
+ if (toktype != KG_TOK_SEAL_MSG)
+ sign_usage = 15;
+ break;
default:
case SGN_ALG_DES_MAC:
- abort ();
+ abort ();
}
code = krb5_c_checksum_length(context, md5cksum.checksum_type, &sumlen);
if (code) {
- xfree(t);
- return(code);
+ xfree(t);
+ return(code);
}
md5cksum.length = sumlen;
if ((plain = (unsigned char *) xmalloc(msglen ? msglen : 1)) == NULL) {
- xfree(t);
- return(ENOMEM);
+ xfree(t);
+ return(ENOMEM);
}
if (conflen) {
- if ((code = kg_make_confounder(context, enc, plain))) {
- xfree(plain);
- xfree(t);
- return(code);
- }
+ if ((code = kg_make_confounder(context, enc, plain))) {
+ xfree(plain);
+ xfree(t);
+ return(code);
+ }
}
memcpy(plain+conflen, text->value, text->length);
@@ -186,59 +187,59 @@ make_seal_token_v1 (krb5_context context,
/* 8 = head of token body as specified by mech spec */
if (! (data_ptr =
- (char *) xmalloc(8 + (bigend ? text->length : msglen)))) {
- xfree(plain);
- xfree(t);
- return(ENOMEM);
+ (char *) xmalloc(8 + (bigend ? text->length : msglen)))) {
+ xfree(plain);
+ xfree(t);
+ return(ENOMEM);
}
(void) memcpy(data_ptr, ptr-2, 8);
if (bigend)
- (void) memcpy(data_ptr+8, text->value, text->length);
+ (void) memcpy(data_ptr+8, text->value, text->length);
else
- (void) memcpy(data_ptr+8, plain, msglen);
+ (void) memcpy(data_ptr+8, plain, msglen);
plaind.length = 8 + (bigend ? text->length : msglen);
plaind.data = data_ptr;
code = krb5_c_make_checksum(context, md5cksum.checksum_type, seq,
- sign_usage, &plaind, &md5cksum);
+ sign_usage, &plaind, &md5cksum);
xfree(data_ptr);
if (code) {
- xfree(plain);
- xfree(t);
- return(code);
+ xfree(plain);
+ xfree(t);
+ return(code);
}
switch(signalg) {
case SGN_ALG_DES_MAC_MD5:
case 3:
- if ((code = kg_encrypt(context, seq, KG_USAGE_SEAL,
- (g_OID_equal(oid, gss_mech_krb5_old) ?
- seq->contents : NULL),
- md5cksum.contents, md5cksum.contents, 16))) {
- krb5_free_checksum_contents(context, &md5cksum);
- xfree (plain);
- xfree(t);
- return code;
- }
+ if ((code = kg_encrypt(context, seq, KG_USAGE_SEAL,
+ (g_OID_equal(oid, gss_mech_krb5_old) ?
+ seq->contents : NULL),
+ md5cksum.contents, md5cksum.contents, 16))) {
+ krb5_free_checksum_contents(context, &md5cksum);
+ xfree (plain);
+ xfree(t);
+ return code;
+ }
- cksum.length = cksum_size;
- cksum.contents = md5cksum.contents + 16 - cksum.length;
+ cksum.length = cksum_size;
+ cksum.contents = md5cksum.contents + 16 - cksum.length;
- memcpy(ptr+14, cksum.contents, cksum.length);
- break;
+ memcpy(ptr+14, cksum.contents, cksum.length);
+ break;
case SGN_ALG_HMAC_SHA1_DES3_KD:
- /*
- * Using key derivation, the call to krb5_c_make_checksum
- * already dealt with encrypting.
- */
- if (md5cksum.length != cksum_size)
- abort ();
- memcpy (ptr+14, md5cksum.contents, md5cksum.length);
- break;
+ /*
+ * Using key derivation, the call to krb5_c_make_checksum
+ * already dealt with encrypting.
+ */
+ if (md5cksum.length != cksum_size)
+ abort ();
+ memcpy (ptr+14, md5cksum.contents, md5cksum.length);
+ break;
case SGN_ALG_HMAC_MD5:
- memcpy (ptr+14, md5cksum.contents, cksum_size);
- break;
+ memcpy (ptr+14, md5cksum.contents, cksum_size);
+ break;
}
krb5_free_checksum_contents(context, &md5cksum);
@@ -246,61 +247,61 @@ make_seal_token_v1 (krb5_context context,
/* create the seq_num */
if ((code = kg_make_seq_num(context, seq, direction?0:0xff, *seqnum,
- ptr+14, ptr+6))) {
- xfree (plain);
- xfree(t);
- return(code);
+ ptr+14, ptr+6))) {
+ xfree (plain);
+ xfree(t);
+ return(code);
}
if (do_encrypt) {
- switch(sealalg) {
- case SEAL_ALG_MICROSOFT_RC4:
- {
- unsigned char bigend_seqnum[4];
- krb5_keyblock *enc_key;
- int i;
- bigend_seqnum[0] = (*seqnum>>24) & 0xff;
- bigend_seqnum[1] = (*seqnum>>16) & 0xff;
- bigend_seqnum[2] = (*seqnum>>8) & 0xff;
- bigend_seqnum[3] = *seqnum & 0xff;
- code = krb5_copy_keyblock (context, enc, &enc_key);
- if (code)
- {
- xfree(plain);
- xfree(t);
- return(code);
- }
- assert (enc_key->length == 16);
- for (i = 0; i <= 15; i++)
- ((char *) enc_key->contents)[i] ^=0xf0;
- code = kg_arcfour_docrypt (enc_key, 0,
- bigend_seqnum, 4,
- plain, tmsglen,
- ptr+14+cksum_size);
- krb5_free_keyblock (context, enc_key);
- if (code)
- {
- xfree(plain);
- xfree(t);
- return(code);
- }
- }
- break;
- default:
- if ((code = kg_encrypt(context, enc, KG_USAGE_SEAL, NULL,
- (krb5_pointer) plain,
- (krb5_pointer) (ptr+cksum_size+14),
- tmsglen))) {
- xfree(plain);
- xfree(t);
- return(code);
- }
- }
+ switch(sealalg) {
+ case SEAL_ALG_MICROSOFT_RC4:
+ {
+ unsigned char bigend_seqnum[4];
+ krb5_keyblock *enc_key;
+ int i;
+ bigend_seqnum[0] = (*seqnum>>24) & 0xff;
+ bigend_seqnum[1] = (*seqnum>>16) & 0xff;
+ bigend_seqnum[2] = (*seqnum>>8) & 0xff;
+ bigend_seqnum[3] = *seqnum & 0xff;
+ code = krb5_copy_keyblock (context, enc, &enc_key);
+ if (code)
+ {
+ xfree(plain);
+ xfree(t);
+ return(code);
+ }
+ assert (enc_key->length == 16);
+ for (i = 0; i <= 15; i++)
+ ((char *) enc_key->contents)[i] ^=0xf0;
+ code = kg_arcfour_docrypt (enc_key, 0,
+ bigend_seqnum, 4,
+ plain, tmsglen,
+ ptr+14+cksum_size);
+ krb5_free_keyblock (context, enc_key);
+ if (code)
+ {
+ xfree(plain);
+ xfree(t);
+ return(code);
+ }
+ }
+ break;
+ default:
+ if ((code = kg_encrypt(context, enc, KG_USAGE_SEAL, NULL,
+ (krb5_pointer) plain,
+ (krb5_pointer) (ptr+cksum_size+14),
+ tmsglen))) {
+ xfree(plain);
+ xfree(t);
+ return(code);
+ }
+ }
}else {
- if (tmsglen)
- memcpy(ptr+14+cksum_size, plain, tmsglen);
+ if (tmsglen)
+ memcpy(ptr+14+cksum_size, plain, tmsglen);
}
- xfree(plain);
+ xfree(plain);
/* that's it. return the token */
@@ -319,7 +320,7 @@ make_seal_token_v1 (krb5_context context,
OM_uint32
kg_seal(minor_status, context_handle, conf_req_flag, qop_req,
- input_message_buffer, conf_state, output_message_buffer, toktype)
+ input_message_buffer, conf_state, output_message_buffer, toktype)
OM_uint32 *minor_status;
gss_ctx_id_t context_handle;
int conf_req_flag;
@@ -339,64 +340,64 @@ kg_seal(minor_status, context_handle, conf_req_flag, qop_req,
/* Only default qop or matching established cryptosystem is allowed.
- There are NO EXTENSIONS to this set for AES and friends! The
- new spec says "just use 0". The old spec plus extensions would
- actually allow for certain non-zero values. Fix this to handle
- them later. */
+ There are NO EXTENSIONS to this set for AES and friends! The
+ new spec says "just use 0". The old spec plus extensions would
+ actually allow for certain non-zero values. Fix this to handle
+ them later. */
if (qop_req != 0) {
- *minor_status = (OM_uint32) G_UNKNOWN_QOP;
- return GSS_S_FAILURE;
+ *minor_status = (OM_uint32) G_UNKNOWN_QOP;
+ return GSS_S_FAILURE;
}
/* validate the context handle */
if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
}
ctx = (krb5_gss_ctx_id_rec *) context_handle;
if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
}
context = ctx->k5_context;
if ((code = krb5_timeofday(context, &now))) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
}
switch (ctx->proto)
{
case 0:
- code = make_seal_token_v1(context, ctx->enc, ctx->seq,
- &ctx->seq_send, ctx->initiate,
- input_message_buffer, output_message_buffer,
- ctx->signalg, ctx->cksum_size, ctx->sealalg,
- conf_req_flag, toktype, ctx->big_endian,
- ctx->mech_used);
- break;
+ code = make_seal_token_v1(context, ctx->enc, ctx->seq,
+ &ctx->seq_send, ctx->initiate,
+ input_message_buffer, output_message_buffer,
+ ctx->signalg, ctx->cksum_size, ctx->sealalg,
+ conf_req_flag, toktype, ctx->big_endian,
+ ctx->mech_used);
+ break;
case 1:
- code = gss_krb5int_make_seal_token_v3(context, ctx,
- input_message_buffer,
- output_message_buffer,
- conf_req_flag, toktype);
- break;
+ code = gss_krb5int_make_seal_token_v3(context, ctx,
+ input_message_buffer,
+ output_message_buffer,
+ conf_req_flag, toktype);
+ break;
default:
- code = G_UNKNOWN_QOP; /* XXX */
- break;
+ code = G_UNKNOWN_QOP; /* XXX */
+ break;
}
if (code) {
- *minor_status = code;
- save_error_info(*minor_status, context);
- return(GSS_S_FAILURE);
+ *minor_status = code;
+ save_error_info(*minor_status, context);
+ return(GSS_S_FAILURE);
}
if (conf_state)
- *conf_state = conf_req_flag;
+ *conf_state = conf_req_flag;
*minor_status = 0;
return((ctx->endtime < now)?GSS_S_CONTEXT_EXPIRED:GSS_S_COMPLETE);
diff --git a/src/lib/gssapi/krb5/k5sealv3.c b/src/lib/gssapi/krb5/k5sealv3.c
index c8a168a17a..53da04d8d7 100644
--- a/src/lib/gssapi/krb5/k5sealv3.c
+++ b/src/lib/gssapi/krb5/k5sealv3.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/k5sealv3.c
*
@@ -8,7 +9,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -22,14 +23,14 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*
*/
/* draft-ietf-krb-wg-gssapi-cfx-05 */
#include <assert.h>
-#include "k5-platform.h" /* for 64-bit support */
-#include "k5-int.h" /* for zap() */
+#include "k5-platform.h" /* for 64-bit support */
+#include "k5-int.h" /* for zap() */
#include "gssapiP_krb5.h"
#include <stdarg.h>
@@ -44,14 +45,14 @@ rotate_left (void *ptr, size_t bufsiz, size_t rc)
void *tbuf;
if (bufsiz == 0)
- return 1;
+ return 1;
rc = rc % bufsiz;
if (rc == 0)
- return 1;
+ return 1;
tbuf = malloc(rc);
if (tbuf == 0)
- return 0;
+ return 0;
memcpy(tbuf, ptr, rc);
memmove(ptr, (char *)ptr + rc, bufsiz - rc);
memcpy((char *)ptr + bufsiz - rc, tbuf, rc);
@@ -61,16 +62,16 @@ rotate_left (void *ptr, size_t bufsiz, size_t rc)
static const gss_buffer_desc empty_message = { 0, 0 };
-#define FLAG_SENDER_IS_ACCEPTOR 0x01
-#define FLAG_WRAP_CONFIDENTIAL 0x02
-#define FLAG_ACCEPTOR_SUBKEY 0x04
+#define FLAG_SENDER_IS_ACCEPTOR 0x01
+#define FLAG_WRAP_CONFIDENTIAL 0x02
+#define FLAG_ACCEPTOR_SUBKEY 0x04
krb5_error_code
gss_krb5int_make_seal_token_v3 (krb5_context context,
- krb5_gss_ctx_id_rec *ctx,
- const gss_buffer_desc * message,
- gss_buffer_t token,
- int conf_req_flag, int toktype)
+ krb5_gss_ctx_id_rec *ctx,
+ const gss_buffer_desc * message,
+ gss_buffer_t token,
+ int conf_req_flag, int toktype)
{
size_t bufsize = 16;
unsigned char *outbuf = 0;
@@ -91,196 +92,196 @@ gss_krb5int_make_seal_token_v3 (krb5_context context,
acceptor_flag = ctx->initiate ? 0 : FLAG_SENDER_IS_ACCEPTOR;
key_usage = (toktype == KG_TOK_WRAP_MSG
- ? (ctx->initiate
- ? KG_USAGE_INITIATOR_SEAL
- : KG_USAGE_ACCEPTOR_SEAL)
- : (ctx->initiate
- ? KG_USAGE_INITIATOR_SIGN
- : KG_USAGE_ACCEPTOR_SIGN));
+ ? (ctx->initiate
+ ? KG_USAGE_INITIATOR_SEAL
+ : KG_USAGE_ACCEPTOR_SEAL)
+ : (ctx->initiate
+ ? KG_USAGE_INITIATOR_SIGN
+ : KG_USAGE_ACCEPTOR_SIGN));
if (ctx->have_acceptor_subkey) {
- key = ctx->acceptor_subkey;
+ key = ctx->acceptor_subkey;
} else {
- key = ctx->enc;
+ key = ctx->enc;
}
#ifdef CFX_EXERCISE
{
- static int initialized = 0;
- if (!initialized) {
- srand(time(0));
- initialized = 1;
- }
+ static int initialized = 0;
+ if (!initialized) {
+ srand(time(0));
+ initialized = 1;
+ }
}
#endif
if (toktype == KG_TOK_WRAP_MSG && conf_req_flag) {
- krb5_data plain;
- krb5_enc_data cipher;
- size_t ec_max;
-
- /* 300: Adds some slop. */
- if (SIZE_MAX - 300 < message->length)
- return ENOMEM;
- ec_max = SIZE_MAX - message->length - 300;
- if (ec_max > 0xffff)
- ec_max = 0xffff;
+ krb5_data plain;
+ krb5_enc_data cipher;
+ size_t ec_max;
+
+ /* 300: Adds some slop. */
+ if (SIZE_MAX - 300 < message->length)
+ return ENOMEM;
+ ec_max = SIZE_MAX - message->length - 300;
+ if (ec_max > 0xffff)
+ ec_max = 0xffff;
#ifdef CFX_EXERCISE
- /* For testing only. For performance, always set ec = 0. */
- ec = ec_max & rand();
+ /* For testing only. For performance, always set ec = 0. */
+ ec = ec_max & rand();
#else
- ec = 0;
+ ec = 0;
#endif
- plain.length = message->length + 16 + ec;
- plain.data = malloc(message->length + 16 + ec);
- if (plain.data == NULL)
- return ENOMEM;
-
- /* Get size of ciphertext. */
- bufsize = 16 + krb5_encrypt_size (plain.length, ctx->enc->enctype);
- /* Allocate space for header plus encrypted data. */
- outbuf = malloc(bufsize);
- if (outbuf == NULL) {
- free(plain.data);
- return ENOMEM;
- }
-
- /* TOK_ID */
- store_16_be(0x0504, outbuf);
- /* flags */
- outbuf[2] = (acceptor_flag
- | (conf_req_flag ? FLAG_WRAP_CONFIDENTIAL : 0)
- | (ctx->have_acceptor_subkey ? FLAG_ACCEPTOR_SUBKEY : 0));
- /* filler */
- outbuf[3] = 0xff;
- /* EC */
- store_16_be(ec, outbuf+4);
- /* RRC */
- store_16_be(0, outbuf+6);
- store_64_be(ctx->seq_send, outbuf+8);
-
- memcpy(plain.data, message->value, message->length);
- memset(plain.data + message->length, 'x', ec);
- memcpy(plain.data + message->length + ec, outbuf, 16);
-
- cipher.ciphertext.data = outbuf + 16;
- cipher.ciphertext.length = bufsize - 16;
- cipher.enctype = key->enctype;
- err = krb5_c_encrypt(context, key, key_usage, 0, &plain, &cipher);
- zap(plain.data, plain.length);
- free(plain.data);
- plain.data = 0;
- if (err)
- goto error;
-
- /* Now that we know we're returning a valid token.... */
- ctx->seq_send++;
+ plain.length = message->length + 16 + ec;
+ plain.data = malloc(message->length + 16 + ec);
+ if (plain.data == NULL)
+ return ENOMEM;
+
+ /* Get size of ciphertext. */
+ bufsize = 16 + krb5_encrypt_size (plain.length, ctx->enc->enctype);
+ /* Allocate space for header plus encrypted data. */
+ outbuf = malloc(bufsize);
+ if (outbuf == NULL) {
+ free(plain.data);
+ return ENOMEM;
+ }
+
+ /* TOK_ID */
+ store_16_be(0x0504, outbuf);
+ /* flags */
+ outbuf[2] = (acceptor_flag
+ | (conf_req_flag ? FLAG_WRAP_CONFIDENTIAL : 0)
+ | (ctx->have_acceptor_subkey ? FLAG_ACCEPTOR_SUBKEY : 0));
+ /* filler */
+ outbuf[3] = 0xff;
+ /* EC */
+ store_16_be(ec, outbuf+4);
+ /* RRC */
+ store_16_be(0, outbuf+6);
+ store_64_be(ctx->seq_send, outbuf+8);
+
+ memcpy(plain.data, message->value, message->length);
+ memset(plain.data + message->length, 'x', ec);
+ memcpy(plain.data + message->length + ec, outbuf, 16);
+
+ cipher.ciphertext.data = outbuf + 16;
+ cipher.ciphertext.length = bufsize - 16;
+ cipher.enctype = key->enctype;
+ err = krb5_c_encrypt(context, key, key_usage, 0, &plain, &cipher);
+ zap(plain.data, plain.length);
+ free(plain.data);
+ plain.data = 0;
+ if (err)
+ goto error;
+
+ /* Now that we know we're returning a valid token.... */
+ ctx->seq_send++;
#ifdef CFX_EXERCISE
- rrc = rand() & 0xffff;
- if (rotate_left(outbuf+16, bufsize-16,
- (bufsize-16) - (rrc % (bufsize - 16))))
- store_16_be(rrc, outbuf+6);
- /* If the rotate fails, don't worry about it. */
+ rrc = rand() & 0xffff;
+ if (rotate_left(outbuf+16, bufsize-16,
+ (bufsize-16) - (rrc % (bufsize - 16))))
+ store_16_be(rrc, outbuf+6);
+ /* If the rotate fails, don't worry about it. */
#endif
} else if (toktype == KG_TOK_WRAP_MSG && !conf_req_flag) {
- krb5_data plain;
+ krb5_data plain;
- /* Here, message is the application-supplied data; message2 is
- what goes into the output token. They may be the same, or
- message2 may be empty (for MIC). */
+ /* Here, message is the application-supplied data; message2 is
+ what goes into the output token. They may be the same, or
+ message2 may be empty (for MIC). */
- tok_id = 0x0504;
+ tok_id = 0x0504;
wrap_with_checksum:
- plain.length = message->length + 16;
- plain.data = malloc(message->length + 16);
- if (plain.data == NULL)
- return ENOMEM;
-
- if (ctx->cksum_size > 0xffff)
- abort();
-
- bufsize = 16 + message2->length + ctx->cksum_size;
- outbuf = malloc(bufsize);
- if (outbuf == NULL) {
- free(plain.data);
- plain.data = 0;
- err = ENOMEM;
- goto error;
- }
-
- /* TOK_ID */
- store_16_be(tok_id, outbuf);
- /* flags */
- outbuf[2] = (acceptor_flag
- | (ctx->have_acceptor_subkey ? FLAG_ACCEPTOR_SUBKEY : 0));
- /* filler */
- outbuf[3] = 0xff;
- if (toktype == KG_TOK_WRAP_MSG) {
- /* Use 0 for checksum calculation, substitute
- checksum length later. */
- /* EC */
- store_16_be(0, outbuf+4);
- /* RRC */
- store_16_be(0, outbuf+6);
- } else {
- /* MIC and DEL store 0xFF in EC and RRC. */
- store_16_be(0xffff, outbuf+4);
- store_16_be(0xffff, outbuf+6);
- }
- store_64_be(ctx->seq_send, outbuf+8);
-
- memcpy(plain.data, message->value, message->length);
- memcpy(plain.data + message->length, outbuf, 16);
-
- /* Fill in the output token -- data contents, if any, and
- space for the checksum. */
- if (message2->length)
- memcpy(outbuf + 16, message2->value, message2->length);
-
- sum.contents = outbuf + 16 + message2->length;
- sum.length = ctx->cksum_size;
-
- err = krb5_c_make_checksum(context, ctx->cksumtype, key,
- key_usage, &plain, &sum);
- zap(plain.data, plain.length);
- free(plain.data);
- plain.data = 0;
- if (err) {
- zap(outbuf,bufsize);
- goto error;
- }
- if (sum.length != ctx->cksum_size)
- abort();
- memcpy(outbuf + 16 + message2->length, sum.contents, ctx->cksum_size);
- krb5_free_checksum_contents(context, &sum);
- sum.contents = 0;
- /* Now that we know we're actually generating the token... */
- ctx->seq_send++;
-
- if (toktype == KG_TOK_WRAP_MSG) {
+ plain.length = message->length + 16;
+ plain.data = malloc(message->length + 16);
+ if (plain.data == NULL)
+ return ENOMEM;
+
+ if (ctx->cksum_size > 0xffff)
+ abort();
+
+ bufsize = 16 + message2->length + ctx->cksum_size;
+ outbuf = malloc(bufsize);
+ if (outbuf == NULL) {
+ free(plain.data);
+ plain.data = 0;
+ err = ENOMEM;
+ goto error;
+ }
+
+ /* TOK_ID */
+ store_16_be(tok_id, outbuf);
+ /* flags */
+ outbuf[2] = (acceptor_flag
+ | (ctx->have_acceptor_subkey ? FLAG_ACCEPTOR_SUBKEY : 0));
+ /* filler */
+ outbuf[3] = 0xff;
+ if (toktype == KG_TOK_WRAP_MSG) {
+ /* Use 0 for checksum calculation, substitute
+ checksum length later. */
+ /* EC */
+ store_16_be(0, outbuf+4);
+ /* RRC */
+ store_16_be(0, outbuf+6);
+ } else {
+ /* MIC and DEL store 0xFF in EC and RRC. */
+ store_16_be(0xffff, outbuf+4);
+ store_16_be(0xffff, outbuf+6);
+ }
+ store_64_be(ctx->seq_send, outbuf+8);
+
+ memcpy(plain.data, message->value, message->length);
+ memcpy(plain.data + message->length, outbuf, 16);
+
+ /* Fill in the output token -- data contents, if any, and
+ space for the checksum. */
+ if (message2->length)
+ memcpy(outbuf + 16, message2->value, message2->length);
+
+ sum.contents = outbuf + 16 + message2->length;
+ sum.length = ctx->cksum_size;
+
+ err = krb5_c_make_checksum(context, ctx->cksumtype, key,
+ key_usage, &plain, &sum);
+ zap(plain.data, plain.length);
+ free(plain.data);
+ plain.data = 0;
+ if (err) {
+ zap(outbuf,bufsize);
+ goto error;
+ }
+ if (sum.length != ctx->cksum_size)
+ abort();
+ memcpy(outbuf + 16 + message2->length, sum.contents, ctx->cksum_size);
+ krb5_free_checksum_contents(context, &sum);
+ sum.contents = 0;
+ /* Now that we know we're actually generating the token... */
+ ctx->seq_send++;
+
+ if (toktype == KG_TOK_WRAP_MSG) {
#ifdef CFX_EXERCISE
- rrc = rand() & 0xffff;
- /* If the rotate fails, don't worry about it. */
- if (rotate_left(outbuf+16, bufsize-16,
- (bufsize-16) - (rrc % (bufsize - 16))))
- store_16_be(rrc, outbuf+6);
+ rrc = rand() & 0xffff;
+ /* If the rotate fails, don't worry about it. */
+ if (rotate_left(outbuf+16, bufsize-16,
+ (bufsize-16) - (rrc % (bufsize - 16))))
+ store_16_be(rrc, outbuf+6);
#endif
- /* Fix up EC field. */
- store_16_be(ctx->cksum_size, outbuf+4);
- } else {
- store_16_be(0xffff, outbuf+6);
- }
+ /* Fix up EC field. */
+ store_16_be(ctx->cksum_size, outbuf+4);
+ } else {
+ store_16_be(0xffff, outbuf+6);
+ }
} else if (toktype == KG_TOK_MIC_MSG) {
- tok_id = 0x0404;
- message2 = &empty_message;
- goto wrap_with_checksum;
+ tok_id = 0x0404;
+ message2 = &empty_message;
+ goto wrap_with_checksum;
} else if (toktype == KG_TOK_DEL_CTX) {
- tok_id = 0x0405;
- message = message2 = &empty_message;
- goto wrap_with_checksum;
+ tok_id = 0x0405;
+ message = message2 = &empty_message;
+ goto wrap_with_checksum;
} else
- abort();
+ abort();
token->value = outbuf;
token->length = bufsize;
@@ -298,11 +299,11 @@ error:
OM_uint32
gss_krb5int_unseal_token_v3(krb5_context *contextptr,
- OM_uint32 *minor_status,
- krb5_gss_ctx_id_rec *ctx,
- unsigned char *ptr, unsigned int bodysize,
- gss_buffer_t message_buffer,
- int *conf_state, int *qop_state, int toktype)
+ OM_uint32 *minor_status,
+ krb5_gss_ctx_id_rec *ctx,
+ unsigned char *ptr, unsigned int bodysize,
+ gss_buffer_t message_buffer,
+ int *conf_state, int *qop_state, int toktype)
{
krb5_context context = *contextptr;
krb5_data plain;
@@ -320,16 +321,16 @@ gss_krb5int_unseal_token_v3(krb5_context *contextptr,
assert(ctx->proto == 1);
if (qop_state)
- *qop_state = GSS_C_QOP_DEFAULT;
+ *qop_state = GSS_C_QOP_DEFAULT;
acceptor_flag = ctx->initiate ? FLAG_SENDER_IS_ACCEPTOR : 0;
key_usage = (toktype == KG_TOK_WRAP_MSG
- ? (!ctx->initiate
- ? KG_USAGE_INITIATOR_SEAL
- : KG_USAGE_ACCEPTOR_SEAL)
- : (!ctx->initiate
- ? KG_USAGE_INITIATOR_SIGN
- : KG_USAGE_ACCEPTOR_SIGN));
+ ? (!ctx->initiate
+ ? KG_USAGE_INITIATOR_SEAL
+ : KG_USAGE_ACCEPTOR_SEAL)
+ : (!ctx->initiate
+ ? KG_USAGE_INITIATOR_SIGN
+ : KG_USAGE_ACCEPTOR_SIGN));
/* Oops. I wrote this code assuming ptr would be at the start of
the token header. */
@@ -338,174 +339,174 @@ gss_krb5int_unseal_token_v3(krb5_context *contextptr,
if (bodysize < 16) {
defective:
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
if ((ptr[2] & FLAG_SENDER_IS_ACCEPTOR) != acceptor_flag) {
- *minor_status = G_BAD_DIRECTION;
- return GSS_S_BAD_SIG;
+ *minor_status = G_BAD_DIRECTION;
+ return GSS_S_BAD_SIG;
}
/* Two things to note here.
- First, we can't really enforce the use of the acceptor's subkey,
- if we're the acceptor; the initiator may have sent messages
- before getting the subkey. We could probably enforce it if
- we're the initiator.
-
- Second, if someone tweaks the code to not set the flag telling
- the krb5 library to generate a new subkey in the AP-REP
- message, the MIT library may include a subkey anyways --
- namely, a copy of the AP-REQ subkey, if it was provided. So
- the initiator may think we wanted a subkey, and set the flag,
- even though we weren't trying to set the subkey. The "other"
- key, the one not asserted by the acceptor, will have the same
- value in that case, though, so we can just ignore the flag. */
+ First, we can't really enforce the use of the acceptor's subkey,
+ if we're the acceptor; the initiator may have sent messages
+ before getting the subkey. We could probably enforce it if
+ we're the initiator.
+
+ Second, if someone tweaks the code to not set the flag telling
+ the krb5 library to generate a new subkey in the AP-REP
+ message, the MIT library may include a subkey anyways --
+ namely, a copy of the AP-REQ subkey, if it was provided. So
+ the initiator may think we wanted a subkey, and set the flag,
+ even though we weren't trying to set the subkey. The "other"
+ key, the one not asserted by the acceptor, will have the same
+ value in that case, though, so we can just ignore the flag. */
if (ctx->have_acceptor_subkey && (ptr[2] & FLAG_ACCEPTOR_SUBKEY)) {
- key = ctx->acceptor_subkey;
+ key = ctx->acceptor_subkey;
} else {
- key = ctx->enc;
+ key = ctx->enc;
}
if (toktype == KG_TOK_WRAP_MSG) {
- if (load_16_be(ptr) != 0x0504)
- goto defective;
- if (ptr[3] != 0xff)
- goto defective;
- ec = load_16_be(ptr+4);
- rrc = load_16_be(ptr+6);
- seqnum = load_64_be(ptr+8);
- if (!rotate_left(ptr+16, bodysize-16, rrc)) {
- no_mem:
- *minor_status = ENOMEM;
- return GSS_S_FAILURE;
- }
- if (ptr[2] & FLAG_WRAP_CONFIDENTIAL) {
- /* confidentiality */
- krb5_enc_data cipher;
- unsigned char *althdr;
-
- if (conf_state)
- *conf_state = 1;
- /* Do we have no decrypt_size function?
-
- For all current cryptosystems, the ciphertext size will
- be larger than the plaintext size. */
- cipher.enctype = key->enctype;
- cipher.ciphertext.length = bodysize - 16;
- cipher.ciphertext.data = ptr + 16;
- plain.length = bodysize - 16;
- plain.data = malloc(plain.length);
- if (plain.data == NULL)
- goto no_mem;
- err = krb5_c_decrypt(context, key, key_usage, 0,
- &cipher, &plain);
- if (err) {
- free(plain.data);
- goto error;
- }
- /* Don't use bodysize here! Use the fact that
- cipher.ciphertext.length has been adjusted to the
- correct length. */
- althdr = plain.data + plain.length - 16;
- if (load_16_be(althdr) != 0x0504
- || althdr[2] != ptr[2]
- || althdr[3] != ptr[3]
- || memcmp(althdr+8, ptr+8, 8)) {
- free(plain.data);
- goto defective;
- }
- message_buffer->value = plain.data;
- message_buffer->length = plain.length - ec - 16;
- if(message_buffer->length == 0) {
- free(message_buffer->value);
- message_buffer->value = NULL;
- }
- } else {
- /* no confidentiality */
- if (conf_state)
- *conf_state = 0;
- if (ec + 16 < ec)
- /* overflow check */
- goto defective;
- if (ec + 16 > bodysize)
- goto defective;
- /* We have: header | msg | cksum.
- We need cksum(msg | header).
- Rotate the first two. */
- store_16_be(0, ptr+4);
- store_16_be(0, ptr+6);
- plain.length = bodysize-ec;
- plain.data = ptr;
- if (!rotate_left(ptr, bodysize-ec, 16))
- goto no_mem;
- sum.length = ec;
- if (sum.length != ctx->cksum_size) {
- *minor_status = 0;
- return GSS_S_BAD_SIG;
- }
- sum.contents = ptr+bodysize-ec;
- sum.checksum_type = ctx->cksumtype;
- err = krb5_c_verify_checksum(context, key, key_usage,
- &plain, &sum, &valid);
- if (err)
- goto error;
- if (!valid) {
- *minor_status = 0;
- return GSS_S_BAD_SIG;
- }
- message_buffer->length = plain.length - 16;
- message_buffer->value = malloc(message_buffer->length);
- if (message_buffer->value == NULL)
- goto no_mem;
- memcpy(message_buffer->value, plain.data, message_buffer->length);
- }
- err = g_order_check(&ctx->seqstate, seqnum);
- *minor_status = 0;
- return err;
+ if (load_16_be(ptr) != 0x0504)
+ goto defective;
+ if (ptr[3] != 0xff)
+ goto defective;
+ ec = load_16_be(ptr+4);
+ rrc = load_16_be(ptr+6);
+ seqnum = load_64_be(ptr+8);
+ if (!rotate_left(ptr+16, bodysize-16, rrc)) {
+ no_mem:
+ *minor_status = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+ if (ptr[2] & FLAG_WRAP_CONFIDENTIAL) {
+ /* confidentiality */
+ krb5_enc_data cipher;
+ unsigned char *althdr;
+
+ if (conf_state)
+ *conf_state = 1;
+ /* Do we have no decrypt_size function?
+
+ For all current cryptosystems, the ciphertext size will
+ be larger than the plaintext size. */
+ cipher.enctype = key->enctype;
+ cipher.ciphertext.length = bodysize - 16;
+ cipher.ciphertext.data = ptr + 16;
+ plain.length = bodysize - 16;
+ plain.data = malloc(plain.length);
+ if (plain.data == NULL)
+ goto no_mem;
+ err = krb5_c_decrypt(context, key, key_usage, 0,
+ &cipher, &plain);
+ if (err) {
+ free(plain.data);
+ goto error;
+ }
+ /* Don't use bodysize here! Use the fact that
+ cipher.ciphertext.length has been adjusted to the
+ correct length. */
+ althdr = plain.data + plain.length - 16;
+ if (load_16_be(althdr) != 0x0504
+ || althdr[2] != ptr[2]
+ || althdr[3] != ptr[3]
+ || memcmp(althdr+8, ptr+8, 8)) {
+ free(plain.data);
+ goto defective;
+ }
+ message_buffer->value = plain.data;
+ message_buffer->length = plain.length - ec - 16;
+ if(message_buffer->length == 0) {
+ free(message_buffer->value);
+ message_buffer->value = NULL;
+ }
+ } else {
+ /* no confidentiality */
+ if (conf_state)
+ *conf_state = 0;
+ if (ec + 16 < ec)
+ /* overflow check */
+ goto defective;
+ if (ec + 16 > bodysize)
+ goto defective;
+ /* We have: header | msg | cksum.
+ We need cksum(msg | header).
+ Rotate the first two. */
+ store_16_be(0, ptr+4);
+ store_16_be(0, ptr+6);
+ plain.length = bodysize-ec;
+ plain.data = ptr;
+ if (!rotate_left(ptr, bodysize-ec, 16))
+ goto no_mem;
+ sum.length = ec;
+ if (sum.length != ctx->cksum_size) {
+ *minor_status = 0;
+ return GSS_S_BAD_SIG;
+ }
+ sum.contents = ptr+bodysize-ec;
+ sum.checksum_type = ctx->cksumtype;
+ err = krb5_c_verify_checksum(context, key, key_usage,
+ &plain, &sum, &valid);
+ if (err)
+ goto error;
+ if (!valid) {
+ *minor_status = 0;
+ return GSS_S_BAD_SIG;
+ }
+ message_buffer->length = plain.length - 16;
+ message_buffer->value = malloc(message_buffer->length);
+ if (message_buffer->value == NULL)
+ goto no_mem;
+ memcpy(message_buffer->value, plain.data, message_buffer->length);
+ }
+ err = g_order_check(&ctx->seqstate, seqnum);
+ *minor_status = 0;
+ return err;
} else if (toktype == KG_TOK_MIC_MSG) {
- /* wrap token, no confidentiality */
- if (load_16_be(ptr) != 0x0404)
- goto defective;
+ /* wrap token, no confidentiality */
+ if (load_16_be(ptr) != 0x0404)
+ goto defective;
verify_mic_1:
- if (ptr[3] != 0xff)
- goto defective;
- if (load_32_be(ptr+4) != 0xffffffffL)
- goto defective;
- seqnum = load_64_be(ptr+8);
- plain.length = message_buffer->length + 16;
- plain.data = malloc(plain.length);
- if (plain.data == NULL)
- goto no_mem;
- if (message_buffer->length)
- memcpy(plain.data, message_buffer->value, message_buffer->length);
- memcpy(plain.data + message_buffer->length, ptr, 16);
- sum.length = bodysize - 16;
- sum.contents = ptr + 16;
- sum.checksum_type = ctx->cksumtype;
- err = krb5_c_verify_checksum(context, key, key_usage,
- &plain, &sum, &valid);
- free(plain.data);
- plain.data = NULL;
- if (err) {
- error:
- *minor_status = err;
- save_error_info(*minor_status, context);
- return GSS_S_BAD_SIG; /* XXX */
- }
- if (!valid) {
- *minor_status = 0;
- return GSS_S_BAD_SIG;
- }
- err = g_order_check(&ctx->seqstate, seqnum);
- *minor_status = 0;
- return err;
+ if (ptr[3] != 0xff)
+ goto defective;
+ if (load_32_be(ptr+4) != 0xffffffffL)
+ goto defective;
+ seqnum = load_64_be(ptr+8);
+ plain.length = message_buffer->length + 16;
+ plain.data = malloc(plain.length);
+ if (plain.data == NULL)
+ goto no_mem;
+ if (message_buffer->length)
+ memcpy(plain.data, message_buffer->value, message_buffer->length);
+ memcpy(plain.data + message_buffer->length, ptr, 16);
+ sum.length = bodysize - 16;
+ sum.contents = ptr + 16;
+ sum.checksum_type = ctx->cksumtype;
+ err = krb5_c_verify_checksum(context, key, key_usage,
+ &plain, &sum, &valid);
+ free(plain.data);
+ plain.data = NULL;
+ if (err) {
+ error:
+ *minor_status = err;
+ save_error_info(*minor_status, context);
+ return GSS_S_BAD_SIG; /* XXX */
+ }
+ if (!valid) {
+ *minor_status = 0;
+ return GSS_S_BAD_SIG;
+ }
+ err = g_order_check(&ctx->seqstate, seqnum);
+ *minor_status = 0;
+ return err;
} else if (toktype == KG_TOK_DEL_CTX) {
- if (load_16_be(ptr) != 0x0405)
- goto defective;
- message_buffer = &empty_message;
- goto verify_mic_1;
+ if (load_16_be(ptr) != 0x0405)
+ goto defective;
+ message_buffer = &empty_message;
+ goto verify_mic_1;
} else {
- goto defective;
+ goto defective;
}
}
diff --git a/src/lib/gssapi/krb5/k5unseal.c b/src/lib/gssapi/krb5/k5unseal.c
index 72afb45763..f80be3fa27 100644
--- a/src/lib/gssapi/krb5/k5unseal.c
+++ b/src/lib/gssapi/krb5/k5unseal.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2001, 2007 by the Massachusetts Institute of Technology.
* Copyright 1993 by OpenVision Technologies, Inc.
@@ -58,7 +59,7 @@
static OM_uint32
kg_unseal_v1(context, minor_status, ctx, ptr, bodysize, message_buffer,
- conf_state, qop_state, toktype)
+ conf_state, qop_state, toktype)
krb5_context context;
OM_uint32 *minor_status;
krb5_gss_ctx_id_rec *ctx;
@@ -89,8 +90,8 @@ kg_unseal_v1(context, minor_status, ctx, ptr, bodysize, message_buffer,
krb5_keyusage sign_usage = KG_USAGE_SIGN;
if (toktype == KG_TOK_SEAL_MSG) {
- message_buffer->length = 0;
- message_buffer->value = NULL;
+ message_buffer->length = 0;
+ message_buffer->value = NULL;
}
/* get the sign and seal algorithms */
@@ -101,141 +102,141 @@ kg_unseal_v1(context, minor_status, ctx, ptr, bodysize, message_buffer,
/* Sanity checks */
if ((ptr[4] != 0xff) || (ptr[5] != 0xff)) {
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
if ((toktype != KG_TOK_SEAL_MSG) &&
- (sealalg != 0xffff)) {
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ (sealalg != 0xffff)) {
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
/* in the current spec, there is only one valid seal algorithm per
key type, so a simple comparison is ok */
if ((toktype == KG_TOK_SEAL_MSG) &&
- !((sealalg == 0xffff) ||
- (sealalg == ctx->sealalg))) {
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ !((sealalg == 0xffff) ||
+ (sealalg == ctx->sealalg))) {
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
/* there are several mappings of seal algorithms to sign algorithms,
but few enough that we can try them all. */
if ((ctx->sealalg == SEAL_ALG_NONE && signalg > 1) ||
- (ctx->sealalg == SEAL_ALG_1 && signalg != SGN_ALG_3) ||
- (ctx->sealalg == SEAL_ALG_DES3KD &&
- signalg != SGN_ALG_HMAC_SHA1_DES3_KD)||
- (ctx->sealalg == SEAL_ALG_MICROSOFT_RC4 &&
- signalg != SGN_ALG_HMAC_MD5)) {
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ (ctx->sealalg == SEAL_ALG_1 && signalg != SGN_ALG_3) ||
+ (ctx->sealalg == SEAL_ALG_DES3KD &&
+ signalg != SGN_ALG_HMAC_SHA1_DES3_KD)||
+ (ctx->sealalg == SEAL_ALG_MICROSOFT_RC4 &&
+ signalg != SGN_ALG_HMAC_MD5)) {
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
switch (signalg) {
case SGN_ALG_DES_MAC_MD5:
case SGN_ALG_MD2_5:
case SGN_ALG_HMAC_MD5:
- cksum_len = 8;
- if (toktype != KG_TOK_SEAL_MSG)
- sign_usage = 15;
- break;
+ cksum_len = 8;
+ if (toktype != KG_TOK_SEAL_MSG)
+ sign_usage = 15;
+ break;
case SGN_ALG_3:
- cksum_len = 16;
- break;
+ cksum_len = 16;
+ break;
case SGN_ALG_HMAC_SHA1_DES3_KD:
- cksum_len = 20;
- break;
+ cksum_len = 20;
+ break;
default:
- *minor_status = 0;
- return GSS_S_DEFECTIVE_TOKEN;
+ *minor_status = 0;
+ return GSS_S_DEFECTIVE_TOKEN;
}
/* get the token parameters */
if ((code = kg_get_seq_num(context, ctx->seq, ptr+14, ptr+6, &direction,
- &seqnum))) {
- *minor_status = code;
- return(GSS_S_BAD_SIG);
+ &seqnum))) {
+ *minor_status = code;
+ return(GSS_S_BAD_SIG);
}
/* decode the message, if SEAL */
if (toktype == KG_TOK_SEAL_MSG) {
- int tmsglen = bodysize-(14+cksum_len);
- if (sealalg != 0xffff) {
- if ((plain = (unsigned char *) xmalloc(tmsglen)) == NULL) {
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- if (ctx->enc->enctype == ENCTYPE_ARCFOUR_HMAC) {
- unsigned char bigend_seqnum[4];
- krb5_keyblock *enc_key;
- int i;
- bigend_seqnum[0] = (seqnum>>24) & 0xff;
- bigend_seqnum[1] = (seqnum>>16) & 0xff;
- bigend_seqnum[2] = (seqnum>>8) & 0xff;
- bigend_seqnum[3] = seqnum & 0xff;
- code = krb5_copy_keyblock (context, ctx->enc, &enc_key);
- if (code)
- {
- xfree(plain);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- assert (enc_key->length == 16);
- for (i = 0; i <= 15; i++)
- ((char *) enc_key->contents)[i] ^=0xf0;
- code = kg_arcfour_docrypt (enc_key, 0,
- &bigend_seqnum[0], 4,
- ptr+14+cksum_len, tmsglen,
- plain);
- krb5_free_keyblock (context, enc_key);
- } else {
- code = kg_decrypt(context, ctx->enc, KG_USAGE_SEAL, NULL,
- ptr+14+cksum_len, plain, tmsglen);
- }
- if (code) {
- xfree(plain);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
- } else {
- plain = ptr+14+cksum_len;
- }
-
- plainlen = tmsglen;
-
- if ((sealalg == 0xffff) && ctx->big_endian) {
- token.length = tmsglen;
- } else {
- conflen = kg_confounder_size(context, ctx->enc);
- token.length = tmsglen - conflen - plain[tmsglen-1];
- }
-
- if (token.length) {
- if ((token.value = (void *) xmalloc(token.length)) == NULL) {
- if (sealalg != 0xffff)
- xfree(plain);
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- memcpy(token.value, plain+conflen, token.length);
- } else {
- token.value = NULL;
- }
+ int tmsglen = bodysize-(14+cksum_len);
+ if (sealalg != 0xffff) {
+ if ((plain = (unsigned char *) xmalloc(tmsglen)) == NULL) {
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ if (ctx->enc->enctype == ENCTYPE_ARCFOUR_HMAC) {
+ unsigned char bigend_seqnum[4];
+ krb5_keyblock *enc_key;
+ int i;
+ bigend_seqnum[0] = (seqnum>>24) & 0xff;
+ bigend_seqnum[1] = (seqnum>>16) & 0xff;
+ bigend_seqnum[2] = (seqnum>>8) & 0xff;
+ bigend_seqnum[3] = seqnum & 0xff;
+ code = krb5_copy_keyblock (context, ctx->enc, &enc_key);
+ if (code)
+ {
+ xfree(plain);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ assert (enc_key->length == 16);
+ for (i = 0; i <= 15; i++)
+ ((char *) enc_key->contents)[i] ^=0xf0;
+ code = kg_arcfour_docrypt (enc_key, 0,
+ &bigend_seqnum[0], 4,
+ ptr+14+cksum_len, tmsglen,
+ plain);
+ krb5_free_keyblock (context, enc_key);
+ } else {
+ code = kg_decrypt(context, ctx->enc, KG_USAGE_SEAL, NULL,
+ ptr+14+cksum_len, plain, tmsglen);
+ }
+ if (code) {
+ xfree(plain);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+ } else {
+ plain = ptr+14+cksum_len;
+ }
+
+ plainlen = tmsglen;
+
+ if ((sealalg == 0xffff) && ctx->big_endian) {
+ token.length = tmsglen;
+ } else {
+ conflen = kg_confounder_size(context, ctx->enc);
+ token.length = tmsglen - conflen - plain[tmsglen-1];
+ }
+
+ if (token.length) {
+ if ((token.value = (void *) xmalloc(token.length)) == NULL) {
+ if (sealalg != 0xffff)
+ xfree(plain);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ memcpy(token.value, plain+conflen, token.length);
+ } else {
+ token.value = NULL;
+ }
} else if (toktype == KG_TOK_SIGN_MSG) {
- token = *message_buffer;
- plain = token.value;
- plainlen = token.length;
+ token = *message_buffer;
+ plain = token.value;
+ plainlen = token.length;
} else {
- token.length = 0;
- token.value = NULL;
- plain = token.value;
- plainlen = token.length;
+ token.length = 0;
+ token.value = NULL;
+ plain = token.value;
+ plainlen = token.length;
}
/* compute the checksum of the message */
@@ -246,224 +247,224 @@ kg_unseal_v1(context, minor_status, ctx, ptr, bodysize, message_buffer,
case SGN_ALG_MD2_5:
case SGN_ALG_DES_MAC:
case SGN_ALG_3:
- md5cksum.checksum_type = CKSUMTYPE_RSA_MD5;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_RSA_MD5;
+ break;
case SGN_ALG_HMAC_MD5:
- md5cksum.checksum_type = CKSUMTYPE_HMAC_MD5_ARCFOUR;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_HMAC_MD5_ARCFOUR;
+ break;
case SGN_ALG_HMAC_SHA1_DES3_KD:
- md5cksum.checksum_type = CKSUMTYPE_HMAC_SHA1_DES3;
- break;
+ md5cksum.checksum_type = CKSUMTYPE_HMAC_SHA1_DES3;
+ break;
default:
- abort ();
+ abort ();
}
code = krb5_c_checksum_length(context, md5cksum.checksum_type, &sumlen);
if (code)
- return(code);
+ return(code);
md5cksum.length = sumlen;
switch (signalg) {
case SGN_ALG_DES_MAC_MD5:
case SGN_ALG_3:
- /* compute the checksum of the message */
-
- /* 8 = bytes of token body to be checksummed according to spec */
-
- if (! (data_ptr = (void *)
- xmalloc(8 + (ctx->big_endian ? token.length : plainlen)))) {
- if (sealalg != 0xffff)
- xfree(plain);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
-
- (void) memcpy(data_ptr, ptr-2, 8);
-
- if (ctx->big_endian)
- (void) memcpy(data_ptr+8, token.value, token.length);
- else
- (void) memcpy(data_ptr+8, plain, plainlen);
-
- plaind.length = 8 + (ctx->big_endian ? token.length : plainlen);
- plaind.data = data_ptr;
- code = krb5_c_make_checksum(context, md5cksum.checksum_type,
- ctx->seq, sign_usage,
- &plaind, &md5cksum);
- xfree(data_ptr);
-
- if (code) {
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- if ((code = kg_encrypt(context, ctx->seq, KG_USAGE_SEAL,
- (g_OID_equal(ctx->mech_used, gss_mech_krb5_old) ?
- ctx->seq->contents : NULL),
- md5cksum.contents, md5cksum.contents, 16))) {
- krb5_free_checksum_contents(context, &md5cksum);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- if (signalg == 0)
- cksum.length = 8;
- else
- cksum.length = 16;
- cksum.contents = md5cksum.contents + 16 - cksum.length;
-
- code = memcmp(cksum.contents, ptr+14, cksum.length);
- break;
+ /* compute the checksum of the message */
+
+ /* 8 = bytes of token body to be checksummed according to spec */
+
+ if (! (data_ptr = (void *)
+ xmalloc(8 + (ctx->big_endian ? token.length : plainlen)))) {
+ if (sealalg != 0xffff)
+ xfree(plain);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+
+ (void) memcpy(data_ptr, ptr-2, 8);
+
+ if (ctx->big_endian)
+ (void) memcpy(data_ptr+8, token.value, token.length);
+ else
+ (void) memcpy(data_ptr+8, plain, plainlen);
+
+ plaind.length = 8 + (ctx->big_endian ? token.length : plainlen);
+ plaind.data = data_ptr;
+ code = krb5_c_make_checksum(context, md5cksum.checksum_type,
+ ctx->seq, sign_usage,
+ &plaind, &md5cksum);
+ xfree(data_ptr);
+
+ if (code) {
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ if ((code = kg_encrypt(context, ctx->seq, KG_USAGE_SEAL,
+ (g_OID_equal(ctx->mech_used, gss_mech_krb5_old) ?
+ ctx->seq->contents : NULL),
+ md5cksum.contents, md5cksum.contents, 16))) {
+ krb5_free_checksum_contents(context, &md5cksum);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ if (signalg == 0)
+ cksum.length = 8;
+ else
+ cksum.length = 16;
+ cksum.contents = md5cksum.contents + 16 - cksum.length;
+
+ code = memcmp(cksum.contents, ptr+14, cksum.length);
+ break;
case SGN_ALG_MD2_5:
- if (!ctx->seed_init &&
- (code = kg_make_seed(context, ctx->subkey, ctx->seed))) {
- krb5_free_checksum_contents(context, &md5cksum);
- if (sealalg != 0xffff)
- xfree(plain);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = code;
- return GSS_S_FAILURE;
- }
-
- if (! (data_ptr = (void *)
- xmalloc(sizeof(ctx->seed) + 8 +
- (ctx->big_endian ? token.length : plainlen)))) {
- krb5_free_checksum_contents(context, &md5cksum);
- if (sealalg == 0)
- xfree(plain);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
- (void) memcpy(data_ptr, ptr-2, 8);
- (void) memcpy(data_ptr+8, ctx->seed, sizeof(ctx->seed));
- if (ctx->big_endian)
- (void) memcpy(data_ptr+8+sizeof(ctx->seed),
- token.value, token.length);
- else
- (void) memcpy(data_ptr+8+sizeof(ctx->seed),
- plain, plainlen);
- plaind.length = 8 + sizeof(ctx->seed) +
- (ctx->big_endian ? token.length : plainlen);
- plaind.data = data_ptr;
- krb5_free_checksum_contents(context, &md5cksum);
- code = krb5_c_make_checksum(context, md5cksum.checksum_type,
- ctx->seq, sign_usage,
- &plaind, &md5cksum);
- xfree(data_ptr);
-
- if (code) {
- if (sealalg == 0)
- xfree(plain);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- code = memcmp(md5cksum.contents, ptr+14, 8);
- /* Falls through to defective-token?? */
+ if (!ctx->seed_init &&
+ (code = kg_make_seed(context, ctx->subkey, ctx->seed))) {
+ krb5_free_checksum_contents(context, &md5cksum);
+ if (sealalg != 0xffff)
+ xfree(plain);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
+
+ if (! (data_ptr = (void *)
+ xmalloc(sizeof(ctx->seed) + 8 +
+ (ctx->big_endian ? token.length : plainlen)))) {
+ krb5_free_checksum_contents(context, &md5cksum);
+ if (sealalg == 0)
+ xfree(plain);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+ (void) memcpy(data_ptr, ptr-2, 8);
+ (void) memcpy(data_ptr+8, ctx->seed, sizeof(ctx->seed));
+ if (ctx->big_endian)
+ (void) memcpy(data_ptr+8+sizeof(ctx->seed),
+ token.value, token.length);
+ else
+ (void) memcpy(data_ptr+8+sizeof(ctx->seed),
+ plain, plainlen);
+ plaind.length = 8 + sizeof(ctx->seed) +
+ (ctx->big_endian ? token.length : plainlen);
+ plaind.data = data_ptr;
+ krb5_free_checksum_contents(context, &md5cksum);
+ code = krb5_c_make_checksum(context, md5cksum.checksum_type,
+ ctx->seq, sign_usage,
+ &plaind, &md5cksum);
+ xfree(data_ptr);
+
+ if (code) {
+ if (sealalg == 0)
+ xfree(plain);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ code = memcmp(md5cksum.contents, ptr+14, 8);
+ /* Falls through to defective-token?? */
default:
- *minor_status = 0;
- return(GSS_S_DEFECTIVE_TOKEN);
+ *minor_status = 0;
+ return(GSS_S_DEFECTIVE_TOKEN);
case SGN_ALG_HMAC_SHA1_DES3_KD:
case SGN_ALG_HMAC_MD5:
- /* compute the checksum of the message */
-
- /* 8 = bytes of token body to be checksummed according to spec */
-
- if (! (data_ptr = (void *)
- xmalloc(8 + (ctx->big_endian ? token.length : plainlen)))) {
- if (sealalg != 0xffff)
- xfree(plain);
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = ENOMEM;
- return(GSS_S_FAILURE);
- }
-
- (void) memcpy(data_ptr, ptr-2, 8);
-
- if (ctx->big_endian)
- (void) memcpy(data_ptr+8, token.value, token.length);
- else
- (void) memcpy(data_ptr+8, plain, plainlen);
-
- plaind.length = 8 + (ctx->big_endian ? token.length : plainlen);
- plaind.data = data_ptr;
- code = krb5_c_make_checksum(context, md5cksum.checksum_type,
- ctx->seq, sign_usage,
- &plaind, &md5cksum);
- xfree(data_ptr);
-
- if (code) {
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = code;
- return(GSS_S_FAILURE);
- }
-
- code = memcmp(md5cksum.contents, ptr+14, cksum_len);
- break;
+ /* compute the checksum of the message */
+
+ /* 8 = bytes of token body to be checksummed according to spec */
+
+ if (! (data_ptr = (void *)
+ xmalloc(8 + (ctx->big_endian ? token.length : plainlen)))) {
+ if (sealalg != 0xffff)
+ xfree(plain);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = ENOMEM;
+ return(GSS_S_FAILURE);
+ }
+
+ (void) memcpy(data_ptr, ptr-2, 8);
+
+ if (ctx->big_endian)
+ (void) memcpy(data_ptr+8, token.value, token.length);
+ else
+ (void) memcpy(data_ptr+8, plain, plainlen);
+
+ plaind.length = 8 + (ctx->big_endian ? token.length : plainlen);
+ plaind.data = data_ptr;
+ code = krb5_c_make_checksum(context, md5cksum.checksum_type,
+ ctx->seq, sign_usage,
+ &plaind, &md5cksum);
+ xfree(data_ptr);
+
+ if (code) {
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
+ }
+
+ code = memcmp(md5cksum.contents, ptr+14, cksum_len);
+ break;
}
krb5_free_checksum_contents(context, &md5cksum);
if (sealalg != 0xffff)
- xfree(plain);
+ xfree(plain);
/* compare the computed checksum against the transmitted checksum */
if (code) {
- if (toktype == KG_TOK_SEAL_MSG)
- xfree(token.value);
- *minor_status = 0;
- return(GSS_S_BAD_SIG);
+ if (toktype == KG_TOK_SEAL_MSG)
+ xfree(token.value);
+ *minor_status = 0;
+ return(GSS_S_BAD_SIG);
}
/* it got through unscathed. Make sure the context is unexpired */
if (toktype == KG_TOK_SEAL_MSG)
- *message_buffer = token;
+ *message_buffer = token;
if (conf_state)
- *conf_state = (sealalg != 0xffff);
+ *conf_state = (sealalg != 0xffff);
if (qop_state)
- *qop_state = GSS_C_QOP_DEFAULT;
+ *qop_state = GSS_C_QOP_DEFAULT;
if ((code = krb5_timeofday(context, &now))) {
- *minor_status = code;
- return(GSS_S_FAILURE);
+ *minor_status = code;
+ return(GSS_S_FAILURE);
}
if (now > ctx->endtime) {
- *minor_status = 0;
- return(GSS_S_CONTEXT_EXPIRED);
+ *minor_status = 0;
+ return(GSS_S_CONTEXT_EXPIRED);
}
/* do sequencing checks */
if ((ctx->initiate && direction != 0xff) ||
- (!ctx->initiate && direction != 0)) {
- if (toktype == KG_TOK_SEAL_MSG) {
- xfree(token.value);
- message_buffer->value = NULL;
- message_buffer->length = 0;
- }
- *minor_status = G_BAD_DIRECTION;
- return(GSS_S_BAD_SIG);
+ (!ctx->initiate && direction != 0)) {
+ if (toktype == KG_TOK_SEAL_MSG) {
+ xfree(token.value);
+ message_buffer->value = NULL;
+ message_buffer->length = 0;
+ }
+ *minor_status = G_BAD_DIRECTION;
+ return(GSS_S_BAD_SIG);
}
retval = g_order_check(&(ctx->seqstate), seqnum);
@@ -479,7 +480,7 @@ kg_unseal_v1(context, minor_status, ctx, ptr, bodysize, message_buffer,
OM_uint32
kg_unseal(minor_status, context_handle, input_token_buffer,
- message_buffer, conf_state, qop_state, toktype)
+ message_buffer, conf_state, qop_state, toktype)
OM_uint32 *minor_status;
gss_ctx_id_t context_handle;
gss_buffer_t input_token_buffer;
@@ -497,15 +498,15 @@ kg_unseal(minor_status, context_handle, input_token_buffer,
/* validate the context handle */
if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
}
ctx = (krb5_gss_ctx_id_rec *) context_handle;
if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
}
/* parse the token, leave the data in message_buffer, setting conf_state */
@@ -515,40 +516,40 @@ kg_unseal(minor_status, context_handle, input_token_buffer,
ptr = (unsigned char *) input_token_buffer->value;
if (ctx->proto)
- switch (toktype) {
- case KG_TOK_SIGN_MSG:
- toktype2 = 0x0404;
- break;
- case KG_TOK_SEAL_MSG:
- toktype2 = 0x0504;
- break;
- case KG_TOK_DEL_CTX:
- toktype2 = 0x0405;
- break;
- default:
- toktype2 = toktype;
- break;
- }
+ switch (toktype) {
+ case KG_TOK_SIGN_MSG:
+ toktype2 = 0x0404;
+ break;
+ case KG_TOK_SEAL_MSG:
+ toktype2 = 0x0504;
+ break;
+ case KG_TOK_DEL_CTX:
+ toktype2 = 0x0405;
+ break;
+ default:
+ toktype2 = toktype;
+ break;
+ }
else
- toktype2 = toktype;
+ toktype2 = toktype;
err = g_verify_token_header(ctx->mech_used,
- &bodysize, &ptr, toktype2,
- input_token_buffer->length,
- !ctx->proto);
+ &bodysize, &ptr, toktype2,
+ input_token_buffer->length,
+ !ctx->proto);
if (err) {
- *minor_status = err;
- return GSS_S_DEFECTIVE_TOKEN;
+ *minor_status = err;
+ return GSS_S_DEFECTIVE_TOKEN;
}
if (ctx->proto == 0)
- ret = kg_unseal_v1(ctx->k5_context, minor_status, ctx, ptr, bodysize,
- message_buffer, conf_state, qop_state,
- toktype);
+ ret = kg_unseal_v1(ctx->k5_context, minor_status, ctx, ptr, bodysize,
+ message_buffer, conf_state, qop_state,
+ toktype);
else
- ret = gss_krb5int_unseal_token_v3(&ctx->k5_context, minor_status, ctx,
- ptr, bodysize, message_buffer,
- conf_state, qop_state, toktype);
+ ret = gss_krb5int_unseal_token_v3(&ctx->k5_context, minor_status, ctx,
+ ptr, bodysize, message_buffer,
+ conf_state, qop_state, toktype);
if (ret != 0)
- save_error_info (*minor_status, ctx->k5_context);
+ save_error_info (*minor_status, ctx->k5_context);
return ret;
}
diff --git a/src/lib/gssapi/krb5/krb5_gss_glue.c b/src/lib/gssapi/krb5/krb5_gss_glue.c
index 2bdac009f4..62905e421c 100644
--- a/src/lib/gssapi/krb5/krb5_gss_glue.c
+++ b/src/lib/gssapi/krb5/krb5_gss_glue.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -30,312 +31,347 @@
/** mechglue wrappers **/
-static OM_uint32 k5glue_acquire_cred
-(void *, OM_uint32*, /* minor_status */
- gss_name_t, /* desired_name */
- OM_uint32, /* time_req */
- gss_OID_set, /* desired_mechs */
- gss_cred_usage_t, /* cred_usage */
- gss_cred_id_t*, /* output_cred_handle */
- gss_OID_set*, /* actual_mechs */
- OM_uint32* /* time_rec */
- );
-
-static OM_uint32 k5glue_release_cred
-(void *, OM_uint32*, /* minor_status */
- gss_cred_id_t* /* cred_handle */
- );
-
-static OM_uint32 k5glue_init_sec_context
-(void *, OM_uint32*, /* minor_status */
- gss_cred_id_t, /* claimant_cred_handle */
- gss_ctx_id_t*, /* context_handle */
- gss_name_t, /* target_name */
- gss_OID, /* mech_type */
- OM_uint32, /* req_flags */
- OM_uint32, /* time_req */
- gss_channel_bindings_t,
- /* input_chan_bindings */
- gss_buffer_t, /* input_token */
- gss_OID*, /* actual_mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32*, /* ret_flags */
- OM_uint32* /* time_rec */
- );
-
+static OM_uint32 k5glue_acquire_cred(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_name_t, /* desired_name */
+ OM_uint32, /* time_req */
+ gss_OID_set, /* desired_mechs */
+ gss_cred_usage_t, /* cred_usage */
+ gss_cred_id_t*, /* output_cred_handle */
+ gss_OID_set*, /* actual_mechs */
+ OM_uint32* /* time_rec */
+);
+
+static OM_uint32 k5glue_release_cred(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_cred_id_t* /* cred_handle */
+);
+
+static OM_uint32 k5glue_init_sec_context(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_cred_id_t, /* claimant_cred_handle */
+ gss_ctx_id_t*, /* context_handle */
+ gss_name_t, /* target_name */
+ gss_OID, /* mech_type */
+ OM_uint32, /* req_flags */
+ OM_uint32, /* time_req */
+ gss_channel_bindings_t,
+ /* input_chan_bindings */
+ gss_buffer_t, /* input_token */
+ gss_OID*, /* actual_mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32*, /* ret_flags */
+ OM_uint32* /* time_rec */
+);
+
#ifndef LEAN_CLIENT
-static OM_uint32 k5glue_accept_sec_context
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t*, /* context_handle */
- gss_cred_id_t, /* verifier_cred_handle */
- gss_buffer_t, /* input_token_buffer */
- gss_channel_bindings_t,
- /* input_chan_bindings */
- gss_name_t*, /* src_name */
- gss_OID*, /* mech_type */
- gss_buffer_t, /* output_token */
- OM_uint32*, /* ret_flags */
- OM_uint32*, /* time_rec */
- gss_cred_id_t* /* delegated_cred_handle */
- );
+static OM_uint32 k5glue_accept_sec_context(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t*, /* context_handle */
+ gss_cred_id_t, /* verifier_cred_handle */
+ gss_buffer_t, /* input_token_buffer */
+ gss_channel_bindings_t,
+ /* input_chan_bindings */
+ gss_name_t*, /* src_name */
+ gss_OID*, /* mech_type */
+ gss_buffer_t, /* output_token */
+ OM_uint32*, /* ret_flags */
+ OM_uint32*, /* time_rec */
+ gss_cred_id_t* /* delegated_cred_handle */
+);
#endif /* LEAN_CLIENT */
-static OM_uint32 k5glue_process_context_token
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t /* token_buffer */
- );
-
-static OM_uint32 k5glue_delete_sec_context
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t*, /* context_handle */
- gss_buffer_t /* output_token */
- );
-
-static OM_uint32 k5glue_context_time
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- OM_uint32* /* time_rec */
- );
-
-static OM_uint32 k5glue_sign
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
-
-static OM_uint32 k5glue_verify
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* token_buffer */
- int* /* qop_state */
- );
-
-static OM_uint32 k5glue_seal
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- int, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int*, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
-
-static OM_uint32 k5glue_unseal
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int*, /* conf_state */
- int* /* qop_state */
- );
-
-static OM_uint32 k5glue_display_status
-(void *, OM_uint32*, /* minor_status */
- OM_uint32, /* status_value */
- int, /* status_type */
- gss_OID, /* mech_type */
- OM_uint32*, /* message_context */
- gss_buffer_t /* status_string */
- );
-
-static OM_uint32 k5glue_indicate_mechs
-(void *, OM_uint32*, /* minor_status */
- gss_OID_set* /* mech_set */
- );
-
-static OM_uint32 k5glue_compare_name
-(void *, OM_uint32*, /* minor_status */
- gss_name_t, /* name1 */
- gss_name_t, /* name2 */
- int* /* name_equal */
- );
-
-static OM_uint32 k5glue_display_name
-(void *, OM_uint32*, /* minor_status */
- gss_name_t, /* input_name */
- gss_buffer_t, /* output_name_buffer */
- gss_OID* /* output_name_type */
- );
-
-static OM_uint32 k5glue_import_name
-(void *, OM_uint32*, /* minor_status */
- gss_buffer_t, /* input_name_buffer */
- gss_OID, /* input_name_type */
- gss_name_t* /* output_name */
- );
-
-static OM_uint32 k5glue_release_name
-(void *, OM_uint32*, /* minor_status */
- gss_name_t* /* input_name */
- );
-
-static OM_uint32 k5glue_inquire_cred
-(void *, OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_name_t *, /* name */
- OM_uint32 *, /* lifetime */
- gss_cred_usage_t*,/* cred_usage */
- gss_OID_set * /* mechanisms */
- );
-
-static OM_uint32 k5glue_inquire_context
-(void *, OM_uint32*, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_name_t*, /* initiator_name */
- gss_name_t*, /* acceptor_name */
- OM_uint32*, /* lifetime_rec */
- gss_OID*, /* mech_type */
- OM_uint32*, /* ret_flags */
- int*, /* locally_initiated */
- int* /* open */
- );
+static OM_uint32 k5glue_process_context_token(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t /* token_buffer */
+);
+
+static OM_uint32 k5glue_delete_sec_context(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t*, /* context_handle */
+ gss_buffer_t /* output_token */
+);
+
+static OM_uint32 k5glue_context_time(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ OM_uint32* /* time_rec */
+);
+
+static OM_uint32 k5glue_sign(
+ void *, OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t /* message_token */
+);
+
+static OM_uint32 k5glue_verify(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* token_buffer */
+ int* /* qop_state */
+);
+
+static OM_uint32 k5glue_seal(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ int, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int*, /* conf_state */
+ gss_buffer_t /* output_message_buffer */
+);
+
+static OM_uint32 k5glue_unseal(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int*, /* conf_state */
+ int* /* qop_state */
+);
+
+static OM_uint32 k5glue_display_status(
+ void *,
+ OM_uint32*, /* minor_status */
+ OM_uint32, /* status_value */
+ int, /* status_type */
+ gss_OID, /* mech_type */
+ OM_uint32*, /* message_context */
+ gss_buffer_t /* status_string */
+);
+
+static OM_uint32 k5glue_indicate_mechs(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_OID_set* /* mech_set */
+);
+
+static OM_uint32 k5glue_compare_name(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_name_t, /* name1 */
+ gss_name_t, /* name2 */
+ int* /* name_equal */
+);
+
+static OM_uint32 k5glue_display_name(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_name_t, /* input_name */
+ gss_buffer_t, /* output_name_buffer */
+ gss_OID* /* output_name_type */
+);
+
+static OM_uint32 k5glue_import_name(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_buffer_t, /* input_name_buffer */
+ gss_OID, /* input_name_type */
+ gss_name_t* /* output_name */
+);
+
+static OM_uint32 k5glue_release_name(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_name_t* /* input_name */
+);
+
+static OM_uint32 k5glue_inquire_cred(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* cred_handle */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* lifetime */
+ gss_cred_usage_t*,/* cred_usage */
+ gss_OID_set * /* mechanisms */
+);
+
+static OM_uint32 k5glue_inquire_context(
+ void *,
+ OM_uint32*, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_name_t*, /* initiator_name */
+ gss_name_t*, /* acceptor_name */
+ OM_uint32*, /* lifetime_rec */
+ gss_OID*, /* mech_type */
+ OM_uint32*, /* ret_flags */
+ int*, /* locally_initiated */
+ int* /* open */
+);
#if 0
/* New V2 entry points */
-static OM_uint32 k5glue_get_mic
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t /* message_token */
- );
-
-static OM_uint32 k5glue_verify_mic
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* message_buffer */
- gss_buffer_t, /* message_token */
- gss_qop_t * /* qop_state */
- );
-
-static OM_uint32 k5glue_wrap
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- gss_buffer_t, /* input_message_buffer */
- int *, /* conf_state */
- gss_buffer_t /* output_message_buffer */
- );
-
-static OM_uint32 k5glue_unwrap
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- gss_buffer_t, /* input_message_buffer */
- gss_buffer_t, /* output_message_buffer */
- int *, /* conf_state */
- gss_qop_t * /* qop_state */
- );
+static OM_uint32 k5glue_get_mic(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t /* message_token */
+);
+
+static OM_uint32 k5glue_verify_mic(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* message_buffer */
+ gss_buffer_t, /* message_token */
+ gss_qop_t * /* qop_state */
+);
+
+static OM_uint32 k5glue_wrap(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ gss_buffer_t, /* input_message_buffer */
+ int *, /* conf_state */
+ gss_buffer_t /* output_message_buffer */
+);
+
+static OM_uint32 k5glue_unwrap(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ gss_buffer_t, /* input_message_buffer */
+ gss_buffer_t, /* output_message_buffer */
+ int *, /* conf_state */
+ gss_qop_t * /* qop_state */
+);
#endif
-static OM_uint32 k5glue_wrap_size_limit
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t, /* context_handle */
- int, /* conf_req_flag */
- gss_qop_t, /* qop_req */
- OM_uint32, /* req_output_size */
- OM_uint32 * /* max_input_size */
- );
+static OM_uint32 k5glue_wrap_size_limit(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t, /* context_handle */
+ int, /* conf_req_flag */
+ gss_qop_t, /* qop_req */
+ OM_uint32, /* req_output_size */
+ OM_uint32 * /* max_input_size */
+);
#if 0
-static OM_uint32 k5glue_import_name_object
-(void *, OM_uint32 *, /* minor_status */
- void *, /* input_name */
- gss_OID, /* input_name_type */
- gss_name_t * /* output_name */
- );
-
-static OM_uint32 k5glue_export_name_object
-(void *, OM_uint32 *, /* minor_status */
- gss_name_t, /* input_name */
- gss_OID, /* desired_name_type */
- void * * /* output_name */
- );
+static OM_uint32 k5glue_import_name_object(
+ void *,
+ OM_uint32 *, /* minor_status */
+ void *, /* input_name */
+ gss_OID, /* input_name_type */
+ gss_name_t * /* output_name */
+);
+
+static OM_uint32 k5glue_export_name_object(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_name_t, /* input_name */
+ gss_OID, /* desired_name_type */
+ void * * /* output_name */
+);
#endif
-static OM_uint32 k5glue_add_cred
-(void *, OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* input_cred_handle */
- gss_name_t, /* desired_name */
- gss_OID, /* desired_mech */
- gss_cred_usage_t, /* cred_usage */
- OM_uint32, /* initiator_time_req */
- OM_uint32, /* acceptor_time_req */
- gss_cred_id_t *, /* output_cred_handle */
- gss_OID_set *, /* actual_mechs */
- OM_uint32 *, /* initiator_time_rec */
- OM_uint32 * /* acceptor_time_rec */
- );
-
-static OM_uint32 k5glue_inquire_cred_by_mech
-(void *, OM_uint32 *, /* minor_status */
- gss_cred_id_t, /* cred_handle */
- gss_OID, /* mech_type */
- gss_name_t *, /* name */
- OM_uint32 *, /* initiator_lifetime */
- OM_uint32 *, /* acceptor_lifetime */
- gss_cred_usage_t * /* cred_usage */
- );
+static OM_uint32 k5glue_add_cred(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* input_cred_handle */
+ gss_name_t, /* desired_name */
+ gss_OID, /* desired_mech */
+ gss_cred_usage_t, /* cred_usage */
+ OM_uint32, /* initiator_time_req */
+ OM_uint32, /* acceptor_time_req */
+ gss_cred_id_t *, /* output_cred_handle */
+ gss_OID_set *, /* actual_mechs */
+ OM_uint32 *, /* initiator_time_rec */
+ OM_uint32 * /* acceptor_time_rec */
+);
+
+static OM_uint32 k5glue_inquire_cred_by_mech(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t, /* cred_handle */
+ gss_OID, /* mech_type */
+ gss_name_t *, /* name */
+ OM_uint32 *, /* initiator_lifetime */
+ OM_uint32 *, /* acceptor_lifetime */
+ gss_cred_usage_t * /* cred_usage */
+);
#ifndef LEAN_CLIENT
-static OM_uint32 k5glue_export_sec_context
-(void *, OM_uint32 *, /* minor_status */
- gss_ctx_id_t *, /* context_handle */
- gss_buffer_t /* interprocess_token */
- );
-
-static OM_uint32 k5glue_import_sec_context
-(void *, OM_uint32 *, /* minor_status */
- gss_buffer_t, /* interprocess_token */
- gss_ctx_id_t * /* context_handle */
- );
+static OM_uint32 k5glue_export_sec_context(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_ctx_id_t *, /* context_handle */
+ gss_buffer_t /* interprocess_token */
+);
+
+static OM_uint32 k5glue_import_sec_context(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_buffer_t, /* interprocess_token */
+ gss_ctx_id_t * /* context_handle */
+);
#endif /* LEAN_CLIENT */
krb5_error_code k5glue_ser_init(krb5_context);
-static OM_uint32 k5glue_internal_release_oid
-(void *, OM_uint32 *, /* minor_status */
- gss_OID * /* oid */
- );
+static OM_uint32 k5glue_internal_release_oid(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_OID * /* oid */
+);
-static OM_uint32 k5glue_inquire_names_for_mech
-(void *, OM_uint32 *, /* minor_status */
- gss_OID, /* mechanism */
- gss_OID_set * /* name_types */
- );
+static OM_uint32 k5glue_inquire_names_for_mech(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* mechanism */
+ gss_OID_set * /* name_types */
+);
#if 0
-static OM_uint32 k5glue_canonicalize_name
-(void *, OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- const gss_OID, /* mech_type */
- gss_name_t * /* output_name */
- );
+static OM_uint32 k5glue_canonicalize_name(
+ void *,
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ const gss_OID, /* mech_type */
+ gss_name_t * /* output_name */
+);
#endif
-static OM_uint32 k5glue_export_name
-(void *, OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_buffer_t /* exported_name */
- );
+static OM_uint32 k5glue_export_name(
+ void *,
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_buffer_t /* exported_name */
+);
#if 0
-static OM_uint32 k5glue_duplicate_name
-(void *, OM_uint32 *, /* minor_status */
- const gss_name_t, /* input_name */
- gss_name_t * /* dest_name */
- );
+static OM_uint32 k5glue_duplicate_name(
+ void *,
+ OM_uint32 *, /* minor_status */
+ const gss_name_t, /* input_name */
+ gss_name_t * /* dest_name */
+);
#endif
#if 0
-static OM_uint32 k5glue_validate_cred
-(void *, OM_uint32 *, /* minor_status */
- gss_cred_id_t /* cred */
- );
+static OM_uint32 k5glue_validate_cred(
+ void *,
+ OM_uint32 *, /* minor_status */
+ gss_cred_id_t /* cred */
+);
#endif
/*
@@ -343,72 +379,72 @@ static OM_uint32 k5glue_validate_cred
* ensure that both dispatch tables contain identical function
* pointers.
*/
-#ifndef LEAN_CLIENT
-#define KRB5_GSS_CONFIG_INIT \
- NULL, \
- k5glue_acquire_cred, \
- k5glue_release_cred, \
- k5glue_init_sec_context, \
- k5glue_accept_sec_context, \
- k5glue_process_context_token, \
- k5glue_delete_sec_context, \
- k5glue_context_time, \
- k5glue_sign, \
- k5glue_verify, \
- k5glue_seal, \
- k5glue_unseal, \
- k5glue_display_status, \
- k5glue_indicate_mechs, \
- k5glue_compare_name, \
- k5glue_display_name, \
- k5glue_import_name, \
- k5glue_release_name, \
- k5glue_inquire_cred, \
- k5glue_add_cred, \
- k5glue_export_sec_context, \
- k5glue_import_sec_context, \
- k5glue_inquire_cred_by_mech, \
- k5glue_inquire_names_for_mech, \
- k5glue_inquire_context, \
- k5glue_internal_release_oid, \
- k5glue_wrap_size_limit, \
- k5glue_export_name, \
- NULL /* store_cred */
-
-#else /* LEAN_CLIENT */
-
-#define KRB5_GSS_CONFIG_INIT \
- NULL, \
- k5glue_acquire_cred, \
- k5glue_release_cred, \
- k5glue_init_sec_context, \
- NULL, \
- k5glue_process_context_token, \
- k5glue_delete_sec_context, \
- k5glue_context_time, \
- k5glue_sign, \
- k5glue_verify, \
- k5glue_seal, \
- k5glue_unseal, \
- k5glue_display_status, \
- k5glue_indicate_mechs, \
- k5glue_compare_name, \
- k5glue_display_name, \
- k5glue_import_name, \
- k5glue_release_name, \
- k5glue_inquire_cred, \
- k5glue_add_cred, \
- NULL, \
- NULL, \
- k5glue_inquire_cred_by_mech, \
- k5glue_inquire_names_for_mech, \
- k5glue_inquire_context, \
- k5glue_internal_release_oid, \
- k5glue_wrap_size_limit, \
- k5glue_export_name, \
- NULL /* store_cred */
-
-#endif /* LEAN_CLIENT */
+#ifndef LEAN_CLIENT
+#define KRB5_GSS_CONFIG_INIT \
+ NULL, \
+ k5glue_acquire_cred, \
+ k5glue_release_cred, \
+ k5glue_init_sec_context, \
+ k5glue_accept_sec_context, \
+ k5glue_process_context_token, \
+ k5glue_delete_sec_context, \
+ k5glue_context_time, \
+ k5glue_sign, \
+ k5glue_verify, \
+ k5glue_seal, \
+ k5glue_unseal, \
+ k5glue_display_status, \
+ k5glue_indicate_mechs, \
+ k5glue_compare_name, \
+ k5glue_display_name, \
+ k5glue_import_name, \
+ k5glue_release_name, \
+ k5glue_inquire_cred, \
+ k5glue_add_cred, \
+ k5glue_export_sec_context, \
+ k5glue_import_sec_context, \
+ k5glue_inquire_cred_by_mech, \
+ k5glue_inquire_names_for_mech, \
+ k5glue_inquire_context, \
+ k5glue_internal_release_oid, \
+ k5glue_wrap_size_limit, \
+ k5glue_export_name, \
+ NULL /* store_cred */
+
+#else /* LEAN_CLIENT */
+
+#define KRB5_GSS_CONFIG_INIT \
+ NULL, \
+ k5glue_acquire_cred, \
+ k5glue_release_cred, \
+ k5glue_init_sec_context, \
+ NULL, \
+ k5glue_process_context_token, \
+ k5glue_delete_sec_context, \
+ k5glue_context_time, \
+ k5glue_sign, \
+ k5glue_verify, \
+ k5glue_seal, \
+ k5glue_unseal, \
+ k5glue_display_status, \
+ k5glue_indicate_mechs, \
+ k5glue_compare_name, \
+ k5glue_display_name, \
+ k5glue_import_name, \
+ k5glue_release_name, \
+ k5glue_inquire_cred, \
+ k5glue_add_cred, \
+ NULL, \
+ NULL, \
+ k5glue_inquire_cred_by_mech, \
+ k5glue_inquire_names_for_mech, \
+ k5glue_inquire_context, \
+ k5glue_internal_release_oid, \
+ k5glue_wrap_size_limit, \
+ k5glue_export_name, \
+ NULL /* store_cred */
+
+#endif /* LEAN_CLIENT */
static struct gss_config krb5_mechanism = {
@@ -448,7 +484,7 @@ gssint_get_mech_configs(void)
char *envstr = getenv("MS_FORCE_NO_MSOID");
if (envstr != NULL && strcmp(envstr, "1") == 0) {
- return krb5_mech_configs_hack;
+ return krb5_mech_configs_hack;
}
#endif
return krb5_mech_configs;
@@ -457,82 +493,82 @@ gssint_get_mech_configs(void)
#ifndef LEAN_CLIENT
static OM_uint32
k5glue_accept_sec_context(ctx, minor_status, context_handle, verifier_cred_handle,
- input_token, input_chan_bindings, src_name, mech_type,
- output_token, ret_flags, time_rec, delegated_cred_handle)
+ input_token, input_chan_bindings, src_name, mech_type,
+ output_token, ret_flags, time_rec, delegated_cred_handle)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_cred_id_t verifier_cred_handle;
- gss_buffer_t input_token;
- gss_channel_bindings_t input_chan_bindings;
- gss_name_t *src_name;
- gss_OID *mech_type;
- gss_buffer_t output_token;
- OM_uint32 *ret_flags;
- OM_uint32 *time_rec;
- gss_cred_id_t *delegated_cred_handle;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_cred_id_t verifier_cred_handle;
+ gss_buffer_t input_token;
+ gss_channel_bindings_t input_chan_bindings;
+ gss_name_t *src_name;
+ gss_OID *mech_type;
+ gss_buffer_t output_token;
+ OM_uint32 *ret_flags;
+ OM_uint32 *time_rec;
+ gss_cred_id_t *delegated_cred_handle;
{
- return(krb5_gss_accept_sec_context(minor_status,
- context_handle,
- verifier_cred_handle,
- input_token,
- input_chan_bindings,
- src_name,
- mech_type,
- output_token,
- ret_flags,
- time_rec,
- delegated_cred_handle));
+ return(krb5_gss_accept_sec_context(minor_status,
+ context_handle,
+ verifier_cred_handle,
+ input_token,
+ input_chan_bindings,
+ src_name,
+ mech_type,
+ output_token,
+ ret_flags,
+ time_rec,
+ delegated_cred_handle));
}
#endif /* LEAN_CLIENT */
static OM_uint32
k5glue_acquire_cred(ctx, minor_status, desired_name, time_req, desired_mechs,
- cred_usage, output_cred_handle, actual_mechs, time_rec)
+ cred_usage, output_cred_handle, actual_mechs, time_rec)
void *ctx;
- OM_uint32 *minor_status;
- gss_name_t desired_name;
- OM_uint32 time_req;
- gss_OID_set desired_mechs;
- gss_cred_usage_t cred_usage;
- gss_cred_id_t *output_cred_handle;
- gss_OID_set *actual_mechs;
- OM_uint32 *time_rec;
+ OM_uint32 *minor_status;
+ gss_name_t desired_name;
+ OM_uint32 time_req;
+ gss_OID_set desired_mechs;
+ gss_cred_usage_t cred_usage;
+ gss_cred_id_t *output_cred_handle;
+ gss_OID_set *actual_mechs;
+ OM_uint32 *time_rec;
{
- return(krb5_gss_acquire_cred(minor_status,
- desired_name,
- time_req,
- desired_mechs,
- cred_usage,
- output_cred_handle,
- actual_mechs,
- time_rec));
+ return(krb5_gss_acquire_cred(minor_status,
+ desired_name,
+ time_req,
+ desired_mechs,
+ cred_usage,
+ output_cred_handle,
+ actual_mechs,
+ time_rec));
}
/* V2 */
static OM_uint32
k5glue_add_cred(ctx, minor_status, input_cred_handle, desired_name, desired_mech,
- cred_usage, initiator_time_req, acceptor_time_req,
- output_cred_handle, actual_mechs, initiator_time_rec,
- acceptor_time_rec)
+ cred_usage, initiator_time_req, acceptor_time_req,
+ output_cred_handle, actual_mechs, initiator_time_rec,
+ acceptor_time_rec)
void *ctx;
- OM_uint32 *minor_status;
- gss_cred_id_t input_cred_handle;
- gss_name_t desired_name;
- gss_OID desired_mech;
- gss_cred_usage_t cred_usage;
- OM_uint32 initiator_time_req;
- OM_uint32 acceptor_time_req;
- gss_cred_id_t *output_cred_handle;
- gss_OID_set *actual_mechs;
- OM_uint32 *initiator_time_rec;
- OM_uint32 *acceptor_time_rec;
+ OM_uint32 *minor_status;
+ gss_cred_id_t input_cred_handle;
+ gss_name_t desired_name;
+ gss_OID desired_mech;
+ gss_cred_usage_t cred_usage;
+ OM_uint32 initiator_time_req;
+ OM_uint32 acceptor_time_req;
+ gss_cred_id_t *output_cred_handle;
+ gss_OID_set *actual_mechs;
+ OM_uint32 *initiator_time_rec;
+ OM_uint32 *acceptor_time_rec;
{
return(krb5_gss_add_cred(minor_status, input_cred_handle, desired_name,
- desired_mech, cred_usage, initiator_time_req,
- acceptor_time_req, output_cred_handle,
- actual_mechs, initiator_time_rec,
- acceptor_time_rec));
+ desired_mech, cred_usage, initiator_time_req,
+ acceptor_time_req, output_cred_handle,
+ actual_mechs, initiator_time_rec,
+ acceptor_time_rec));
}
#if 0
@@ -540,9 +576,9 @@ k5glue_add_cred(ctx, minor_status, input_cred_handle, desired_name, desired_mech
static OM_uint32
k5glue_add_oid_set_member(ctx, minor_status, member_oid, oid_set)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID member_oid;
- gss_OID_set *oid_set;
+ OM_uint32 *minor_status;
+ gss_OID member_oid;
+ gss_OID_set *oid_set;
{
return(generic_gss_add_oid_set_member(minor_status, member_oid, oid_set));
}
@@ -551,24 +587,24 @@ k5glue_add_oid_set_member(ctx, minor_status, member_oid, oid_set)
static OM_uint32
k5glue_compare_name(ctx, minor_status, name1, name2, name_equal)
void *ctx;
- OM_uint32 *minor_status;
- gss_name_t name1;
- gss_name_t name2;
- int *name_equal;
+ OM_uint32 *minor_status;
+ gss_name_t name1;
+ gss_name_t name2;
+ int *name_equal;
{
- return(krb5_gss_compare_name(minor_status, name1,
- name2, name_equal));
+ return(krb5_gss_compare_name(minor_status, name1,
+ name2, name_equal));
}
static OM_uint32
k5glue_context_time(ctx, minor_status, context_handle, time_rec)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- OM_uint32 *time_rec;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ OM_uint32 *time_rec;
{
- return(krb5_gss_context_time(minor_status, context_handle,
- time_rec));
+ return(krb5_gss_context_time(minor_status, context_handle,
+ time_rec));
}
#if 0
@@ -576,8 +612,8 @@ k5glue_context_time(ctx, minor_status, context_handle, time_rec)
static OM_uint32
k5glue_create_empty_oid_set(ctx, minor_status, oid_set)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID_set *oid_set;
+ OM_uint32 *minor_status;
+ gss_OID_set *oid_set;
{
return(generic_gss_create_empty_oid_set(minor_status, oid_set));
}
@@ -586,90 +622,90 @@ k5glue_create_empty_oid_set(ctx, minor_status, oid_set)
static OM_uint32
k5glue_delete_sec_context(ctx, minor_status, context_handle, output_token)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_buffer_t output_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_buffer_t output_token;
{
- return(krb5_gss_delete_sec_context(minor_status,
- context_handle, output_token));
+ return(krb5_gss_delete_sec_context(minor_status,
+ context_handle, output_token));
}
static OM_uint32
k5glue_display_name(ctx, minor_status, input_name, output_name_buffer, output_name_type)
void *ctx;
- OM_uint32 *minor_status;
- gss_name_t input_name;
- gss_buffer_t output_name_buffer;
- gss_OID *output_name_type;
+ OM_uint32 *minor_status;
+ gss_name_t input_name;
+ gss_buffer_t output_name_buffer;
+ gss_OID *output_name_type;
{
- return(krb5_gss_display_name(minor_status, input_name,
- output_name_buffer, output_name_type));
+ return(krb5_gss_display_name(minor_status, input_name,
+ output_name_buffer, output_name_type));
}
static OM_uint32
k5glue_display_status(ctx, minor_status, status_value, status_type,
- mech_type, message_context, status_string)
+ mech_type, message_context, status_string)
void *ctx;
- OM_uint32 *minor_status;
- OM_uint32 status_value;
- int status_type;
- gss_OID mech_type;
- OM_uint32 *message_context;
- gss_buffer_t status_string;
+ OM_uint32 *minor_status;
+ OM_uint32 status_value;
+ int status_type;
+ gss_OID mech_type;
+ OM_uint32 *message_context;
+ gss_buffer_t status_string;
{
- return(krb5_gss_display_status(minor_status, status_value,
- status_type, mech_type, message_context,
- status_string));
+ return(krb5_gss_display_status(minor_status, status_value,
+ status_type, mech_type, message_context,
+ status_string));
}
#ifndef LEAN_CLIENT
/* V2 */
static OM_uint32
k5glue_export_sec_context(ctx, minor_status, context_handle, interprocess_token)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t *context_handle;
- gss_buffer_t interprocess_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t *context_handle;
+ gss_buffer_t interprocess_token;
{
- return(krb5_gss_export_sec_context(minor_status,
- context_handle,
- interprocess_token));
+ return(krb5_gss_export_sec_context(minor_status,
+ context_handle,
+ interprocess_token));
}
#endif /* LEAN_CLIENT */
#if 0
/* V2 */
static OM_uint32
k5glue_get_mic(ctx, minor_status, context_handle, qop_req,
- message_buffer, message_token)
+ message_buffer, message_token)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_qop_t qop_req;
- gss_buffer_t message_buffer;
- gss_buffer_t message_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_qop_t qop_req;
+ gss_buffer_t message_buffer;
+ gss_buffer_t message_token;
{
return(krb5_gss_get_mic(minor_status, context_handle,
- qop_req, message_buffer, message_token));
+ qop_req, message_buffer, message_token));
}
#endif
static OM_uint32
k5glue_import_name(ctx, minor_status, input_name_buffer, input_name_type, output_name)
void *ctx;
- OM_uint32 *minor_status;
- gss_buffer_t input_name_buffer;
- gss_OID input_name_type;
- gss_name_t *output_name;
+ OM_uint32 *minor_status;
+ gss_buffer_t input_name_buffer;
+ gss_OID input_name_type;
+ gss_name_t *output_name;
{
#if 0
OM_uint32 err;
err = gssint_initialize_library();
if (err) {
- *minor_status = err;
- return GSS_S_FAILURE;
+ *minor_status = err;
+ return GSS_S_FAILURE;
}
#endif
return(krb5_gss_import_name(minor_status, input_name_buffer,
- input_name_type, output_name));
+ input_name_type, output_name));
}
#ifndef LEAN_CLIENT
@@ -677,118 +713,118 @@ k5glue_import_name(ctx, minor_status, input_name_buffer, input_name_type, output
static OM_uint32
k5glue_import_sec_context(ctx, minor_status, interprocess_token, context_handle)
void *ctx;
- OM_uint32 *minor_status;
- gss_buffer_t interprocess_token;
- gss_ctx_id_t *context_handle;
+ OM_uint32 *minor_status;
+ gss_buffer_t interprocess_token;
+ gss_ctx_id_t *context_handle;
{
- return(krb5_gss_import_sec_context(minor_status,
- interprocess_token,
- context_handle));
+ return(krb5_gss_import_sec_context(minor_status,
+ interprocess_token,
+ context_handle));
}
#endif /* LEAN_CLIENT */
static OM_uint32
k5glue_indicate_mechs(ctx, minor_status, mech_set)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID_set *mech_set;
+ OM_uint32 *minor_status;
+ gss_OID_set *mech_set;
{
- return(krb5_gss_indicate_mechs(minor_status, mech_set));
+ return(krb5_gss_indicate_mechs(minor_status, mech_set));
}
static OM_uint32
k5glue_init_sec_context(ctx, minor_status, claimant_cred_handle, context_handle,
- target_name, mech_type, req_flags, time_req,
- input_chan_bindings, input_token, actual_mech_type,
- output_token, ret_flags, time_rec)
+ target_name, mech_type, req_flags, time_req,
+ input_chan_bindings, input_token, actual_mech_type,
+ output_token, ret_flags, time_rec)
void *ctx;
- OM_uint32 *minor_status;
- gss_cred_id_t claimant_cred_handle;
- gss_ctx_id_t *context_handle;
- gss_name_t target_name;
- gss_OID mech_type;
- OM_uint32 req_flags;
- OM_uint32 time_req;
- gss_channel_bindings_t input_chan_bindings;
- gss_buffer_t input_token;
- gss_OID *actual_mech_type;
- gss_buffer_t output_token;
- OM_uint32 *ret_flags;
- OM_uint32 *time_rec;
+ OM_uint32 *minor_status;
+ gss_cred_id_t claimant_cred_handle;
+ gss_ctx_id_t *context_handle;
+ gss_name_t target_name;
+ gss_OID mech_type;
+ OM_uint32 req_flags;
+ OM_uint32 time_req;
+ gss_channel_bindings_t input_chan_bindings;
+ gss_buffer_t input_token;
+ gss_OID *actual_mech_type;
+ gss_buffer_t output_token;
+ OM_uint32 *ret_flags;
+ OM_uint32 *time_rec;
{
- return(krb5_gss_init_sec_context(minor_status,
- claimant_cred_handle, context_handle,
- target_name, mech_type, req_flags,
- time_req, input_chan_bindings, input_token,
- actual_mech_type, output_token, ret_flags,
- time_rec));
+ return(krb5_gss_init_sec_context(minor_status,
+ claimant_cred_handle, context_handle,
+ target_name, mech_type, req_flags,
+ time_req, input_chan_bindings, input_token,
+ actual_mech_type, output_token, ret_flags,
+ time_rec));
}
static OM_uint32
k5glue_inquire_context(ctx, minor_status, context_handle, initiator_name, acceptor_name,
- lifetime_rec, mech_type, ret_flags,
- locally_initiated, opened)
+ lifetime_rec, mech_type, ret_flags,
+ locally_initiated, opened)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_name_t *initiator_name;
- gss_name_t *acceptor_name;
- OM_uint32 *lifetime_rec;
- gss_OID *mech_type;
- OM_uint32 *ret_flags;
- int *locally_initiated;
- int *opened;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_name_t *initiator_name;
+ gss_name_t *acceptor_name;
+ OM_uint32 *lifetime_rec;
+ gss_OID *mech_type;
+ OM_uint32 *ret_flags;
+ int *locally_initiated;
+ int *opened;
{
- return(krb5_gss_inquire_context(minor_status, context_handle,
- initiator_name, acceptor_name, lifetime_rec,
- mech_type, ret_flags, locally_initiated,
- opened));
+ return(krb5_gss_inquire_context(minor_status, context_handle,
+ initiator_name, acceptor_name, lifetime_rec,
+ mech_type, ret_flags, locally_initiated,
+ opened));
}
static OM_uint32
k5glue_inquire_cred(ctx, minor_status, cred_handle, name, lifetime_ret,
- cred_usage, mechanisms)
+ cred_usage, mechanisms)
void *ctx;
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
- gss_name_t *name;
- OM_uint32 *lifetime_ret;
- gss_cred_usage_t *cred_usage;
- gss_OID_set *mechanisms;
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
+ gss_name_t *name;
+ OM_uint32 *lifetime_ret;
+ gss_cred_usage_t *cred_usage;
+ gss_OID_set *mechanisms;
{
- return(krb5_gss_inquire_cred(minor_status, cred_handle,
- name, lifetime_ret, cred_usage, mechanisms));
+ return(krb5_gss_inquire_cred(minor_status, cred_handle,
+ name, lifetime_ret, cred_usage, mechanisms));
}
/* V2 */
static OM_uint32
k5glue_inquire_cred_by_mech(ctx, minor_status, cred_handle, mech_type, name,
- initiator_lifetime, acceptor_lifetime, cred_usage)
+ initiator_lifetime, acceptor_lifetime, cred_usage)
void *ctx;
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
- gss_OID mech_type;
- gss_name_t *name;
- OM_uint32 *initiator_lifetime;
- OM_uint32 *acceptor_lifetime;
- gss_cred_usage_t *cred_usage;
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
+ gss_OID mech_type;
+ gss_name_t *name;
+ OM_uint32 *initiator_lifetime;
+ OM_uint32 *acceptor_lifetime;
+ gss_cred_usage_t *cred_usage;
{
- return(krb5_gss_inquire_cred_by_mech(minor_status, cred_handle,
- mech_type, name, initiator_lifetime,
- acceptor_lifetime, cred_usage));
+ return(krb5_gss_inquire_cred_by_mech(minor_status, cred_handle,
+ mech_type, name, initiator_lifetime,
+ acceptor_lifetime, cred_usage));
}
/* V2 */
static OM_uint32
k5glue_inquire_names_for_mech(ctx, minor_status, mechanism, name_types)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID mechanism;
- gss_OID_set *name_types;
+ OM_uint32 *minor_status;
+ gss_OID mechanism;
+ gss_OID_set *name_types;
{
return(krb5_gss_inquire_names_for_mech(minor_status,
- mechanism,
- name_types));
+ mechanism,
+ name_types));
}
#if 0
@@ -796,9 +832,9 @@ k5glue_inquire_names_for_mech(ctx, minor_status, mechanism, name_types)
static OM_uint32
k5glue_oid_to_str(ctx, minor_status, oid, oid_str)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID oid;
- gss_buffer_t oid_str;
+ OM_uint32 *minor_status;
+ gss_OID oid;
+ gss_buffer_t oid_str;
{
return(generic_gss_oid_to_str(minor_status, oid, oid_str));
}
@@ -807,41 +843,41 @@ k5glue_oid_to_str(ctx, minor_status, oid, oid_str)
static OM_uint32
k5glue_process_context_token(ctx, minor_status, context_handle, token_buffer)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t token_buffer;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t token_buffer;
{
- return(krb5_gss_process_context_token(minor_status,
- context_handle, token_buffer));
+ return(krb5_gss_process_context_token(minor_status,
+ context_handle, token_buffer));
}
static OM_uint32
k5glue_release_cred(ctx, minor_status, cred_handle)
void *ctx;
- OM_uint32 *minor_status;
- gss_cred_id_t *cred_handle;
+ OM_uint32 *minor_status;
+ gss_cred_id_t *cred_handle;
{
- return(krb5_gss_release_cred(minor_status, cred_handle));
+ return(krb5_gss_release_cred(minor_status, cred_handle));
}
static OM_uint32
k5glue_release_name(ctx, minor_status, input_name)
void *ctx;
- OM_uint32 *minor_status;
- gss_name_t *input_name;
+ OM_uint32 *minor_status;
+ gss_name_t *input_name;
{
- return(krb5_gss_release_name(minor_status, input_name));
+ return(krb5_gss_release_name(minor_status, input_name));
}
#if 0
static OM_uint32
k5glue_release_buffer(ctx, minor_status, buffer)
void *ctx;
- OM_uint32 *minor_status;
- gss_buffer_t buffer;
+ OM_uint32 *minor_status;
+ gss_buffer_t buffer;
{
- return(generic_gss_release_buffer(minor_status,
- buffer));
+ return(generic_gss_release_buffer(minor_status,
+ buffer));
}
#endif
@@ -849,8 +885,8 @@ k5glue_release_buffer(ctx, minor_status, buffer)
static OM_uint32
k5glue_internal_release_oid(ctx, minor_status, oid)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID *oid;
+ OM_uint32 *minor_status;
+ gss_OID *oid;
{
return(krb5_gss_internal_release_oid(minor_status, oid));
}
@@ -859,87 +895,87 @@ k5glue_internal_release_oid(ctx, minor_status, oid)
static OM_uint32
k5glue_release_oid_set(ctx, minor_status, set)
void *ctx;
- OM_uint32 * minor_status;
- gss_OID_set *set;
+ OM_uint32 * minor_status;
+ gss_OID_set *set;
{
- return(generic_gss_release_oid_set(minor_status, set));
+ return(generic_gss_release_oid_set(minor_status, set));
}
#endif
/* V1 only */
static OM_uint32
k5glue_seal(ctx, minor_status, context_handle, conf_req_flag, qop_req,
- input_message_buffer, conf_state, output_message_buffer)
+ input_message_buffer, conf_state, output_message_buffer)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- int qop_req;
- gss_buffer_t input_message_buffer;
- int *conf_state;
- gss_buffer_t output_message_buffer;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ int qop_req;
+ gss_buffer_t input_message_buffer;
+ int *conf_state;
+ gss_buffer_t output_message_buffer;
{
- return(krb5_gss_seal(minor_status, context_handle,
- conf_req_flag, qop_req, input_message_buffer,
- conf_state, output_message_buffer));
+ return(krb5_gss_seal(minor_status, context_handle,
+ conf_req_flag, qop_req, input_message_buffer,
+ conf_state, output_message_buffer));
}
static OM_uint32
k5glue_sign(ctx, minor_status, context_handle,
- qop_req, message_buffer,
- message_token)
+ qop_req, message_buffer,
+ message_token)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int qop_req;
- gss_buffer_t message_buffer;
- gss_buffer_t message_token;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int qop_req;
+ gss_buffer_t message_buffer;
+ gss_buffer_t message_token;
{
- return(krb5_gss_sign(minor_status, context_handle,
- qop_req, message_buffer, message_token));
+ return(krb5_gss_sign(minor_status, context_handle,
+ qop_req, message_buffer, message_token));
}
#if 0
/* V2 */
static OM_uint32
k5glue_verify_mic(ctx, minor_status, context_handle,
- message_buffer, token_buffer, qop_state)
+ message_buffer, token_buffer, qop_state)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t message_buffer;
- gss_buffer_t token_buffer;
- gss_qop_t *qop_state;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t message_buffer;
+ gss_buffer_t token_buffer;
+ gss_qop_t *qop_state;
{
return(krb5_gss_verify_mic(minor_status, context_handle,
- message_buffer, token_buffer, qop_state));
+ message_buffer, token_buffer, qop_state));
}
/* V2 */
static OM_uint32
k5glue_wrap(ctx, minor_status, context_handle, conf_req_flag, qop_req,
- input_message_buffer, conf_state, output_message_buffer)
+ input_message_buffer, conf_state, output_message_buffer)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- gss_qop_t qop_req;
- gss_buffer_t input_message_buffer;
- int *conf_state;
- gss_buffer_t output_message_buffer;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ gss_qop_t qop_req;
+ gss_buffer_t input_message_buffer;
+ int *conf_state;
+ gss_buffer_t output_message_buffer;
{
return(krb5_gss_wrap(minor_status, context_handle, conf_req_flag, qop_req,
- input_message_buffer, conf_state,
- output_message_buffer));
+ input_message_buffer, conf_state,
+ output_message_buffer));
}
/* V2 */
static OM_uint32
k5glue_str_to_oid(ctx, minor_status, oid_str, oid)
void *ctx;
- OM_uint32 *minor_status;
- gss_buffer_t oid_str;
- gss_OID *oid;
+ OM_uint32 *minor_status;
+ gss_buffer_t oid_str;
+ gss_OID *oid;
{
return(generic_gss_str_to_oid(minor_status, oid_str, oid));
}
@@ -948,84 +984,84 @@ k5glue_str_to_oid(ctx, minor_status, oid_str, oid)
static OM_uint32
k5glue_test_oid_set_member(ctx, minor_status, member, set, present)
void *ctx;
- OM_uint32 *minor_status;
- gss_OID member;
- gss_OID_set set;
- int *present;
+ OM_uint32 *minor_status;
+ gss_OID member;
+ gss_OID_set set;
+ int *present;
{
return(generic_gss_test_oid_set_member(minor_status, member, set,
- present));
+ present));
}
#endif
/* V1 only */
static OM_uint32
k5glue_unseal(ctx, minor_status, context_handle, input_message_buffer,
- output_message_buffer, conf_state, qop_state)
+ output_message_buffer, conf_state, qop_state)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t input_message_buffer;
- gss_buffer_t output_message_buffer;
- int *conf_state;
- int *qop_state;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t input_message_buffer;
+ gss_buffer_t output_message_buffer;
+ int *conf_state;
+ int *qop_state;
{
- return(krb5_gss_unseal(minor_status, context_handle,
- input_message_buffer, output_message_buffer,
- conf_state, qop_state));
+ return(krb5_gss_unseal(minor_status, context_handle,
+ input_message_buffer, output_message_buffer,
+ conf_state, qop_state));
}
#if 0
/* V2 */
static OM_uint32
-k5glue_unwrap(ctx, minor_status, context_handle, input_message_buffer,
- output_message_buffer, conf_state, qop_state)
+k5glue_unwrap(ctx, minor_status, context_handle, input_message_buffer,
+ output_message_buffer, conf_state, qop_state)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t input_message_buffer;
- gss_buffer_t output_message_buffer;
- int *conf_state;
- gss_qop_t *qop_state;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t input_message_buffer;
+ gss_buffer_t output_message_buffer;
+ int *conf_state;
+ gss_qop_t *qop_state;
{
return(krb5_gss_unwrap(minor_status, context_handle, input_message_buffer,
- output_message_buffer, conf_state, qop_state));
+ output_message_buffer, conf_state, qop_state));
}
#endif
/* V1 only */
static OM_uint32
k5glue_verify(ctx, minor_status, context_handle, message_buffer,
- token_buffer, qop_state)
+ token_buffer, qop_state)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t message_buffer;
- gss_buffer_t token_buffer;
- int *qop_state;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t message_buffer;
+ gss_buffer_t token_buffer;
+ int *qop_state;
{
- return(krb5_gss_verify(minor_status,
- context_handle,
- message_buffer,
- token_buffer,
- qop_state));
+ return(krb5_gss_verify(minor_status,
+ context_handle,
+ message_buffer,
+ token_buffer,
+ qop_state));
}
/* V2 interface */
static OM_uint32
k5glue_wrap_size_limit(ctx, minor_status, context_handle, conf_req_flag,
- qop_req, req_output_size, max_input_size)
+ qop_req, req_output_size, max_input_size)
void *ctx;
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- gss_qop_t qop_req;
- OM_uint32 req_output_size;
- OM_uint32 *max_input_size;
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ gss_qop_t qop_req;
+ OM_uint32 req_output_size;
+ OM_uint32 *max_input_size;
{
- return(krb5_gss_wrap_size_limit(minor_status, context_handle,
- conf_req_flag, qop_req,
- req_output_size, max_input_size));
+ return(krb5_gss_wrap_size_limit(minor_status, context_handle,
+ conf_req_flag, qop_req,
+ req_output_size, max_input_size));
}
#if 0
@@ -1033,13 +1069,13 @@ k5glue_wrap_size_limit(ctx, minor_status, context_handle, conf_req_flag,
static OM_uint32
k5glue_canonicalize_name(ctx, minor_status, input_name, mech_type, output_name)
void *ctx;
- OM_uint32 *minor_status;
- const gss_name_t input_name;
- const gss_OID mech_type;
- gss_name_t *output_name;
+ OM_uint32 *minor_status;
+ const gss_name_t input_name;
+ const gss_OID mech_type;
+ gss_name_t *output_name;
{
- return krb5_gss_canonicalize_name(minor_status, input_name,
- mech_type, output_name);
+ return krb5_gss_canonicalize_name(minor_status, input_name,
+ mech_type, output_name);
}
#endif
@@ -1047,11 +1083,11 @@ k5glue_canonicalize_name(ctx, minor_status, input_name, mech_type, output_name)
static OM_uint32
k5glue_export_name(ctx, minor_status, input_name, exported_name)
void *ctx;
- OM_uint32 *minor_status;
- const gss_name_t input_name;
- gss_buffer_t exported_name;
+ OM_uint32 *minor_status;
+ const gss_name_t input_name;
+ gss_buffer_t exported_name;
{
- return krb5_gss_export_name(minor_status, input_name, exported_name);
+ return krb5_gss_export_name(minor_status, input_name, exported_name);
}
#if 0
@@ -1059,11 +1095,11 @@ k5glue_export_name(ctx, minor_status, input_name, exported_name)
static OM_uint32
k5glue_duplicate_name(ctx, minor_status, input_name, dest_name)
void *ctx;
- OM_uint32 *minor_status;
- const gss_name_t input_name;
- gss_name_t *dest_name;
+ OM_uint32 *minor_status;
+ const gss_name_t input_name;
+ gss_name_t *dest_name;
{
- return krb5_gss_duplicate_name(minor_status, input_name, dest_name);
+ return krb5_gss_duplicate_name(minor_status, input_name, dest_name);
}
#endif
@@ -1077,13 +1113,13 @@ gss_krb5_get_tkt_flags(
uctx = (gss_union_ctx_id_t)context_handle;
if (!g_OID_equal(uctx->mech_type, &krb5_mechanism.mech_type) &&
- !g_OID_equal(uctx->mech_type, &krb5_mechanism_old.mech_type))
- return GSS_S_BAD_MECH;
+ !g_OID_equal(uctx->mech_type, &krb5_mechanism_old.mech_type))
+ return GSS_S_BAD_MECH;
return gss_krb5int_get_tkt_flags(minor_status, uctx->internal_ctx_id,
- ticket_flags);
+ ticket_flags);
}
-OM_uint32 KRB5_CALLCONV
+OM_uint32 KRB5_CALLCONV
gss_krb5_copy_ccache(
OM_uint32 *minor_status,
gss_cred_id_t cred_handle,
@@ -1096,11 +1132,11 @@ gss_krb5_copy_ccache(
mcred = gssint_get_mechanism_cred(ucred, &krb5_mechanism.mech_type);
if (mcred != GSS_C_NO_CREDENTIAL)
- return gss_krb5int_copy_ccache(minor_status, mcred, out_ccache);
+ return gss_krb5int_copy_ccache(minor_status, mcred, out_ccache);
mcred = gssint_get_mechanism_cred(ucred, &krb5_mechanism_old.mech_type);
if (mcred != GSS_C_NO_CREDENTIAL)
- return gss_krb5int_copy_ccache(minor_status, mcred, out_ccache);
+ return gss_krb5int_copy_ccache(minor_status, mcred, out_ccache);
return GSS_S_DEFECTIVE_CREDENTIAL;
}
@@ -1117,16 +1153,16 @@ gss_krb5_export_lucid_sec_context(
uctx = (gss_union_ctx_id_t)*context_handle;
if (!g_OID_equal(uctx->mech_type, &krb5_mechanism.mech_type) &&
- !g_OID_equal(uctx->mech_type, &krb5_mechanism_old.mech_type))
- return GSS_S_BAD_MECH;
+ !g_OID_equal(uctx->mech_type, &krb5_mechanism_old.mech_type))
+ return GSS_S_BAD_MECH;
return gss_krb5int_export_lucid_sec_context(minor_status,
- &uctx->internal_ctx_id,
- version, kctx);
+ &uctx->internal_ctx_id,
+ version, kctx);
}
OM_uint32 KRB5_CALLCONV
gss_krb5_set_allowable_enctypes(
- OM_uint32 *minor_status,
+ OM_uint32 *minor_status,
gss_cred_id_t cred,
OM_uint32 num_ktypes,
krb5_enctype *ktypes)
@@ -1137,13 +1173,13 @@ gss_krb5_set_allowable_enctypes(
ucred = (gss_union_cred_t)cred;
mcred = gssint_get_mechanism_cred(ucred, &krb5_mechanism.mech_type);
if (mcred != GSS_C_NO_CREDENTIAL)
- return gss_krb5int_set_allowable_enctypes(minor_status, mcred,
- num_ktypes, ktypes);
+ return gss_krb5int_set_allowable_enctypes(minor_status, mcred,
+ num_ktypes, ktypes);
mcred = gssint_get_mechanism_cred(ucred, &krb5_mechanism_old.mech_type);
if (mcred != GSS_C_NO_CREDENTIAL)
- return gss_krb5int_set_allowable_enctypes(minor_status, mcred,
- num_ktypes, ktypes);
+ return gss_krb5int_set_allowable_enctypes(minor_status, mcred,
+ num_ktypes, ktypes);
return GSS_S_DEFECTIVE_CREDENTIAL;
}
diff --git a/src/lib/gssapi/krb5/lucid_context.c b/src/lib/gssapi/krb5/lucid_context.c
index 086bea4277..338c38b8c0 100644
--- a/src/lib/gssapi/krb5/lucid_context.c
+++ b/src/lib/gssapi/krb5/lucid_context.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/lucid_context.c
*
@@ -61,31 +62,31 @@ make_external_lucid_ctx_v1(
OM_uint32 KRB5_CALLCONV
gss_krb5int_export_lucid_sec_context(
- OM_uint32 *minor_status,
- gss_ctx_id_t *context_handle,
- OM_uint32 version,
- void **kctx)
+ OM_uint32 *minor_status,
+ gss_ctx_id_t *context_handle,
+ OM_uint32 version,
+ void **kctx)
{
- krb5_error_code kret = 0;
- OM_uint32 retval;
- krb5_gss_ctx_id_t ctx;
- void *lctx = NULL;
+ krb5_error_code kret = 0;
+ OM_uint32 retval;
+ krb5_gss_ctx_id_t ctx;
+ void *lctx = NULL;
/* Assume failure */
retval = GSS_S_FAILURE;
*minor_status = 0;
if (kctx)
- *kctx = NULL;
+ *kctx = NULL;
else {
- kret = EINVAL;
- goto error_out;
+ kret = EINVAL;
+ goto error_out;
}
if (!kg_validate_ctx_id(*context_handle)) {
- kret = (OM_uint32) G_VALIDATE_FAILED;
- retval = GSS_S_NO_CONTEXT;
- goto error_out;
+ kret = (OM_uint32) G_VALIDATE_FAILED;
+ retval = GSS_S_NO_CONTEXT;
+ goto error_out;
}
ctx = (krb5_gss_ctx_id_t) *context_handle;
@@ -93,21 +94,21 @@ gss_krb5int_export_lucid_sec_context(
/* Externalize a structure of the right version */
switch (version) {
case 1:
- kret = make_external_lucid_ctx_v1((krb5_pointer)ctx,
- version, &lctx);
+ kret = make_external_lucid_ctx_v1((krb5_pointer)ctx,
+ version, &lctx);
break;
default:
- kret = (OM_uint32) KG_LUCID_VERSION;
- break;
+ kret = (OM_uint32) KG_LUCID_VERSION;
+ break;
}
if (kret)
- goto error_out;
+ goto error_out;
/* Success! Record the context and return the buffer */
if (! kg_save_lucidctx_id((void *)lctx)) {
- kret = G_VALIDATE_FAILED;
- goto error_out;
+ kret = G_VALIDATE_FAILED;
+ goto error_out;
}
*kctx = lctx;
@@ -123,8 +124,8 @@ gss_krb5int_export_lucid_sec_context(
return (retval);
error_out:
- if (*minor_status == 0)
- *minor_status = (OM_uint32) kret;
+ if (*minor_status == 0)
+ *minor_status = (OM_uint32) kret;
return(retval);
}
@@ -137,39 +138,39 @@ gss_krb5_free_lucid_sec_context(
OM_uint32 *minor_status,
void *kctx)
{
- OM_uint32 retval;
- krb5_error_code kret = 0;
- int version;
+ OM_uint32 retval;
+ krb5_error_code kret = 0;
+ int version;
/* Assume failure */
retval = GSS_S_FAILURE;
*minor_status = 0;
if (!kctx) {
- kret = EINVAL;
- goto error_out;
+ kret = EINVAL;
+ goto error_out;
}
/* Verify pointer is valid lucid context */
if (! kg_validate_lucidctx_id(kctx)) {
- kret = G_VALIDATE_FAILED;
- goto error_out;
+ kret = G_VALIDATE_FAILED;
+ goto error_out;
}
/* Determine version and call correct free routine */
version = ((gss_krb5_lucid_context_version_t *)kctx)->version;
switch (version) {
case 1:
- (void)kg_delete_lucidctx_id(kctx);
- free_external_lucid_ctx_v1((gss_krb5_lucid_context_v1_t*) kctx);
- break;
+ (void)kg_delete_lucidctx_id(kctx);
+ free_external_lucid_ctx_v1((gss_krb5_lucid_context_v1_t*) kctx);
+ break;
default:
- kret = EINVAL;
- break;
+ kret = EINVAL;
+ break;
}
if (kret)
- goto error_out;
+ goto error_out;
/* Success! */
*minor_status = 0;
@@ -178,8 +179,8 @@ gss_krb5_free_lucid_sec_context(
return (retval);
error_out:
- if (*minor_status == 0)
- *minor_status = (OM_uint32) kret;
+ if (*minor_status == 0)
+ *minor_status = (OM_uint32) kret;
return(retval);
}
@@ -199,8 +200,8 @@ make_external_lucid_ctx_v1(
/* Allocate the structure */
if ((lctx = xmalloc(bufsize)) == NULL) {
- retval = ENOMEM;
- goto error_out;
+ retval = ENOMEM;
+ goto error_out;
}
memset(lctx, 0, bufsize);
@@ -214,29 +215,29 @@ make_external_lucid_ctx_v1(
/* gctx->proto == 0 ==> rfc1964-style key information
gctx->proto == 1 ==> cfx-style (draft-ietf-krb-wg-gssapi-cfx-07) keys */
if (gctx->proto == 0) {
- lctx->rfc1964_kd.sign_alg = gctx->signalg;
- lctx->rfc1964_kd.seal_alg = gctx->sealalg;
- /* Copy key */
- if ((retval = copy_keyblock_to_lucid_key(gctx->subkey,
- &lctx->rfc1964_kd.ctx_key)))
- goto error_out;
+ lctx->rfc1964_kd.sign_alg = gctx->signalg;
+ lctx->rfc1964_kd.seal_alg = gctx->sealalg;
+ /* Copy key */
+ if ((retval = copy_keyblock_to_lucid_key(gctx->subkey,
+ &lctx->rfc1964_kd.ctx_key)))
+ goto error_out;
}
else if (gctx->proto == 1) {
- /* Copy keys */
- /* (subkey is always present, either a copy of the kerberos
- session key or a subkey) */
- if ((retval = copy_keyblock_to_lucid_key(gctx->subkey,
- &lctx->cfx_kd.ctx_key)))
- goto error_out;
- if (gctx->have_acceptor_subkey) {
- if ((retval = copy_keyblock_to_lucid_key(gctx->acceptor_subkey,
- &lctx->cfx_kd.acceptor_subkey)))
- goto error_out;
- lctx->cfx_kd.have_acceptor_subkey = 1;
- }
+ /* Copy keys */
+ /* (subkey is always present, either a copy of the kerberos
+ session key or a subkey) */
+ if ((retval = copy_keyblock_to_lucid_key(gctx->subkey,
+ &lctx->cfx_kd.ctx_key)))
+ goto error_out;
+ if (gctx->have_acceptor_subkey) {
+ if ((retval = copy_keyblock_to_lucid_key(gctx->acceptor_subkey,
+ &lctx->cfx_kd.acceptor_subkey)))
+ goto error_out;
+ lctx->cfx_kd.have_acceptor_subkey = 1;
+ }
}
else {
- return EINVAL; /* XXX better error code? */
+ return EINVAL; /* XXX better error code? */
}
/* Success! */
@@ -245,7 +246,7 @@ make_external_lucid_ctx_v1(
error_out:
if (lctx) {
- free_external_lucid_ctx_v1(lctx);
+ free_external_lucid_ctx_v1(lctx);
}
return retval;
@@ -258,13 +259,13 @@ copy_keyblock_to_lucid_key(
gss_krb5_lucid_key_t *lkey)
{
if (!k5key || !k5key->contents || k5key->length == 0)
- return EINVAL;
+ return EINVAL;
memset(lkey, 0, sizeof(gss_krb5_lucid_key_t));
/* Allocate storage for the key data */
if ((lkey->data = xmalloc(k5key->length)) == NULL) {
- return ENOMEM;
+ return ENOMEM;
}
memcpy(lkey->data, k5key->contents, k5key->length);
lkey->length = k5key->length;
@@ -280,11 +281,11 @@ free_lucid_key_data(
gss_krb5_lucid_key_t *key)
{
if (key) {
- if (key->data && key->length) {
- memset(key->data, 0, key->length);
- xfree(key->data);
- memset(key, 0, sizeof(gss_krb5_lucid_key_t));
- }
+ if (key->data && key->length) {
+ memset(key->data, 0, key->length);
+ xfree(key->data);
+ memset(key, 0, sizeof(gss_krb5_lucid_key_t));
+ }
}
}
/* Free any storage associated with a gss_krb5_lucid_context_v1 structure */
@@ -293,15 +294,15 @@ free_external_lucid_ctx_v1(
gss_krb5_lucid_context_v1_t *ctx)
{
if (ctx) {
- if (ctx->protocol == 0) {
- free_lucid_key_data(&ctx->rfc1964_kd.ctx_key);
- }
- if (ctx->protocol == 1) {
- free_lucid_key_data(&ctx->cfx_kd.ctx_key);
- if (ctx->cfx_kd.have_acceptor_subkey)
- free_lucid_key_data(&ctx->cfx_kd.acceptor_subkey);
- }
- xfree(ctx);
- ctx = NULL;
+ if (ctx->protocol == 0) {
+ free_lucid_key_data(&ctx->rfc1964_kd.ctx_key);
+ }
+ if (ctx->protocol == 1) {
+ free_lucid_key_data(&ctx->cfx_kd.ctx_key);
+ if (ctx->cfx_kd.have_acceptor_subkey)
+ free_lucid_key_data(&ctx->cfx_kd.acceptor_subkey);
+ }
+ xfree(ctx);
+ ctx = NULL;
}
}
diff --git a/src/lib/gssapi/krb5/process_context_token.c b/src/lib/gssapi/krb5/process_context_token.c
index 49d8ec3f9f..9a4d282ac8 100644
--- a/src/lib/gssapi/krb5/process_context_token.c
+++ b/src/lib/gssapi/krb5/process_context_token.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -27,38 +28,38 @@
*/
OM_uint32
-krb5_gss_process_context_token(minor_status, context_handle,
- token_buffer)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t token_buffer;
+krb5_gss_process_context_token(minor_status, context_handle,
+ token_buffer)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t token_buffer;
{
- krb5_gss_ctx_id_rec *ctx;
- OM_uint32 majerr;
+ krb5_gss_ctx_id_rec *ctx;
+ OM_uint32 majerr;
- /* validate the context handle */
- if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
- }
+ /* validate the context handle */
+ if (! kg_validate_ctx_id(context_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
+ }
- ctx = (krb5_gss_ctx_id_t) context_handle;
+ ctx = (krb5_gss_ctx_id_t) context_handle;
- if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
- }
+ if (! ctx->established) {
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
+ }
- /* "unseal" the token */
+ /* "unseal" the token */
- if (GSS_ERROR(majerr = kg_unseal(minor_status, context_handle,
- token_buffer,
- GSS_C_NO_BUFFER, NULL, NULL,
- KG_TOK_DEL_CTX)))
- return(majerr);
+ if (GSS_ERROR(majerr = kg_unseal(minor_status, context_handle,
+ token_buffer,
+ GSS_C_NO_BUFFER, NULL, NULL,
+ KG_TOK_DEL_CTX)))
+ return(majerr);
- /* that's it. delete the context */
+ /* that's it. delete the context */
- return(krb5_gss_delete_sec_context(minor_status, &context_handle,
- GSS_C_NO_BUFFER));
+ return(krb5_gss_delete_sec_context(minor_status, &context_handle,
+ GSS_C_NO_BUFFER));
}
diff --git a/src/lib/gssapi/krb5/rel_cred.c b/src/lib/gssapi/krb5/rel_cred.c
index 1b4a6ce55c..8330543268 100644
--- a/src/lib/gssapi/krb5/rel_cred.c
+++ b/src/lib/gssapi/krb5/rel_cred.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -22,74 +23,74 @@
#include "gssapiP_krb5.h"
-OM_uint32
+OM_uint32
krb5_gss_release_cred(minor_status, cred_handle)
- OM_uint32 *minor_status;
- gss_cred_id_t *cred_handle;
+ OM_uint32 *minor_status;
+ gss_cred_id_t *cred_handle;
{
- krb5_context context;
- krb5_gss_cred_id_t cred;
- krb5_error_code code1, code2, code3;
+ krb5_context context;
+ krb5_gss_cred_id_t cred;
+ krb5_error_code code1, code2, code3;
- code1 = krb5_gss_init_context(&context);
- if (code1) {
- *minor_status = code1;
- return GSS_S_FAILURE;
- }
+ code1 = krb5_gss_init_context(&context);
+ if (code1) {
+ *minor_status = code1;
+ return GSS_S_FAILURE;
+ }
- if (*cred_handle == GSS_C_NO_CREDENTIAL) {
- *minor_status = 0;
- krb5_free_context(context);
- return(GSS_S_COMPLETE);
- }
+ if (*cred_handle == GSS_C_NO_CREDENTIAL) {
+ *minor_status = 0;
+ krb5_free_context(context);
+ return(GSS_S_COMPLETE);
+ }
- if (! kg_delete_cred_id(*cred_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_NO_CRED);
- }
+ if (! kg_delete_cred_id(*cred_handle)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_NO_CRED);
+ }
- cred = (krb5_gss_cred_id_t)*cred_handle;
+ cred = (krb5_gss_cred_id_t)*cred_handle;
- k5_mutex_destroy(&cred->lock);
- /* ignore error destroying mutex */
+ k5_mutex_destroy(&cred->lock);
+ /* ignore error destroying mutex */
- if (cred->ccache)
- code1 = krb5_cc_close(context, cred->ccache);
- else
- code1 = 0;
+ if (cred->ccache)
+ code1 = krb5_cc_close(context, cred->ccache);
+ else
+ code1 = 0;
-#ifndef LEAN_CLIENT
- if (cred->keytab)
- code2 = krb5_kt_close(context, cred->keytab);
- else
+#ifndef LEAN_CLIENT
+ if (cred->keytab)
+ code2 = krb5_kt_close(context, cred->keytab);
+ else
#endif /* LEAN_CLIENT */
- code2 = 0;
+ code2 = 0;
- if (cred->rcache)
- code3 = krb5_rc_close(context, cred->rcache);
- else
- code3 = 0;
- if (cred->princ)
- krb5_free_principal(context, cred->princ);
+ if (cred->rcache)
+ code3 = krb5_rc_close(context, cred->rcache);
+ else
+ code3 = 0;
+ if (cred->princ)
+ krb5_free_principal(context, cred->princ);
- if (cred->req_enctypes)
- free(cred->req_enctypes);
+ if (cred->req_enctypes)
+ free(cred->req_enctypes);
- xfree(cred);
+ xfree(cred);
- *cred_handle = NULL;
+ *cred_handle = NULL;
- *minor_status = 0;
- if (code1)
- *minor_status = code1;
- if (code2)
- *minor_status = code2;
- if (code3)
- *minor_status = code3;
+ *minor_status = 0;
+ if (code1)
+ *minor_status = code1;
+ if (code2)
+ *minor_status = code2;
+ if (code3)
+ *minor_status = code3;
- if (*minor_status)
- save_error_info(*minor_status, context);
- krb5_free_context(context);
- return(*minor_status?GSS_S_FAILURE:GSS_S_COMPLETE);
+ if (*minor_status)
+ save_error_info(*minor_status, context);
+ krb5_free_context(context);
+ return(*minor_status?GSS_S_FAILURE:GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/rel_name.c b/src/lib/gssapi/krb5/rel_name.c
index d906a70c0c..49d1944480 100644
--- a/src/lib/gssapi/krb5/rel_name.c
+++ b/src/lib/gssapi/krb5/rel_name.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -24,31 +25,31 @@
OM_uint32
krb5_gss_release_name(minor_status, input_name)
- OM_uint32 *minor_status;
- gss_name_t *input_name;
+ OM_uint32 *minor_status;
+ gss_name_t *input_name;
{
- krb5_context context;
- krb5_error_code code;
+ krb5_context context;
+ krb5_error_code code;
- code = krb5_gss_init_context(&context);
- if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
- }
+ code = krb5_gss_init_context(&context);
+ if (code) {
+ *minor_status = code;
+ return GSS_S_FAILURE;
+ }
- if (! kg_validate_name(*input_name)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- krb5_free_context(context);
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
- }
+ if (! kg_validate_name(*input_name)) {
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ krb5_free_context(context);
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_BAD_NAME);
+ }
- (void)kg_delete_name(*input_name);
+ (void)kg_delete_name(*input_name);
- krb5_free_principal(context, (krb5_principal) *input_name);
- krb5_free_context(context);
+ krb5_free_principal(context, (krb5_principal) *input_name);
+ krb5_free_context(context);
- *input_name = (gss_name_t) NULL;
+ *input_name = (gss_name_t) NULL;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
diff --git a/src/lib/gssapi/krb5/rel_oid.c b/src/lib/gssapi/krb5/rel_oid.c
index 7e45781efb..7a08da2bea 100644
--- a/src/lib/gssapi/krb5/rel_oid.c
+++ b/src/lib/gssapi/krb5/rel_oid.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/rel_oid.c
*
@@ -31,13 +32,13 @@
#include "gssapiP_krb5.h"
OM_uint32 krb5_gss_internal_release_oid (OM_uint32 *, /* minor_status */
- gss_OID * /* oid */
- );
+ gss_OID * /* oid */
+);
OM_uint32
krb5_gss_release_oid(minor_status, oid)
- OM_uint32 *minor_status;
- gss_OID *oid;
+ OM_uint32 *minor_status;
+ gss_OID *oid;
{
/*
* The V2 API says the following!
@@ -49,38 +50,37 @@ krb5_gss_release_oid(minor_status, oid)
* allocated OID values with OIDs returned by GSS-API.
*/
if (krb5_gss_internal_release_oid(minor_status, oid) != GSS_S_COMPLETE) {
- /* Pawn it off on the generic routine */
- return(generic_gss_release_oid(minor_status, oid));
+ /* Pawn it off on the generic routine */
+ return(generic_gss_release_oid(minor_status, oid));
}
else {
- *oid = GSS_C_NO_OID;
- *minor_status = 0;
- return(GSS_S_COMPLETE);
+ *oid = GSS_C_NO_OID;
+ *minor_status = 0;
+ return(GSS_S_COMPLETE);
}
}
OM_uint32
krb5_gss_internal_release_oid(minor_status, oid)
- OM_uint32 *minor_status;
- gss_OID *oid;
+ OM_uint32 *minor_status;
+ gss_OID *oid;
{
/*
* This function only knows how to release internal OIDs. It will
* return GSS_S_CONTINUE_NEEDED for any OIDs it does not recognize.
*/
-
+
*minor_status = 0;
if ((*oid != gss_mech_krb5) &&
- (*oid != gss_mech_krb5_old) &&
- (*oid != gss_mech_krb5_wrong) &&
- (*oid != gss_nt_krb5_name) &&
- (*oid != gss_nt_krb5_principal)) {
- /* We don't know about this OID */
- return(GSS_S_CONTINUE_NEEDED);
+ (*oid != gss_mech_krb5_old) &&
+ (*oid != gss_mech_krb5_wrong) &&
+ (*oid != gss_nt_krb5_name) &&
+ (*oid != gss_nt_krb5_principal)) {
+ /* We don't know about this OID */
+ return(GSS_S_CONTINUE_NEEDED);
}
else {
- *oid = GSS_C_NO_OID;
- return(GSS_S_COMPLETE);
+ *oid = GSS_C_NO_OID;
+ return(GSS_S_COMPLETE);
}
}
-
diff --git a/src/lib/gssapi/krb5/seal.c b/src/lib/gssapi/krb5/seal.c
index 63d3dabe06..9598de7d96 100644
--- a/src/lib/gssapi/krb5/seal.c
+++ b/src/lib/gssapi/krb5/seal.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,36 +29,35 @@
OM_uint32
krb5_gss_seal(minor_status, context_handle, conf_req_flag,
- qop_req, input_message_buffer, conf_state,
- output_message_buffer)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- int qop_req;
- gss_buffer_t input_message_buffer;
- int *conf_state;
- gss_buffer_t output_message_buffer;
+ qop_req, input_message_buffer, conf_state,
+ output_message_buffer)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ int qop_req;
+ gss_buffer_t input_message_buffer;
+ int *conf_state;
+ gss_buffer_t output_message_buffer;
{
- return(kg_seal(minor_status, context_handle, conf_req_flag,
- qop_req, input_message_buffer, conf_state,
- output_message_buffer, KG_TOK_SEAL_MSG));
+ return(kg_seal(minor_status, context_handle, conf_req_flag,
+ qop_req, input_message_buffer, conf_state,
+ output_message_buffer, KG_TOK_SEAL_MSG));
}
/* V2 interface */
OM_uint32
krb5_gss_wrap(minor_status, context_handle, conf_req_flag,
- qop_req, input_message_buffer, conf_state,
- output_message_buffer)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- gss_qop_t qop_req;
- gss_buffer_t input_message_buffer;
- int *conf_state;
- gss_buffer_t output_message_buffer;
+ qop_req, input_message_buffer, conf_state,
+ output_message_buffer)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ gss_qop_t qop_req;
+ gss_buffer_t input_message_buffer;
+ int *conf_state;
+ gss_buffer_t output_message_buffer;
{
return(kg_seal(minor_status, context_handle, conf_req_flag,
- (int) qop_req, input_message_buffer, conf_state,
- output_message_buffer, KG_TOK_WRAP_MSG));
+ (int) qop_req, input_message_buffer, conf_state,
+ output_message_buffer, KG_TOK_WRAP_MSG));
}
-
diff --git a/src/lib/gssapi/krb5/ser_sctx.c b/src/lib/gssapi/krb5/ser_sctx.c
index 92bb302f01..5babd76682 100644
--- a/src/lib/gssapi/krb5/ser_sctx.c
+++ b/src/lib/gssapi/krb5/ser_sctx.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/ser_sctx.c
*
@@ -32,8 +33,8 @@
#include "gssapiP_krb5.h"
/*
- * This module contains routines to [de]serialize
- * krb5_gss_enc_desc and krb5_gss_ctx_id_t.
+ * This module contains routines to [de]serialize
+ * krb5_gss_enc_desc and krb5_gss_ctx_id_t.
* XXX This whole serialization abstraction is unnecessary in a
* non-messaging environment, which krb5 is. Someday, this should
* all get redone without the extra level of indirection. I've done
@@ -45,190 +46,190 @@
static krb5_error_code
kg_oid_externalize(kcontext, arg, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer arg;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
- gss_OID oid = (gss_OID) arg;
- krb5_error_code err;
-
- err = krb5_ser_pack_int32(KV5M_GSS_OID, buffer, lenremain);
- if (err)
- return err;
- err = krb5_ser_pack_int32((krb5_int32) oid->length,
- buffer, lenremain);
- if (err)
- return err;
- err = krb5_ser_pack_bytes((krb5_octet *) oid->elements,
- oid->length, buffer, lenremain);
- if (err)
- return err;
- err = krb5_ser_pack_int32(KV5M_GSS_OID, buffer, lenremain);
- return err;
+ gss_OID oid = (gss_OID) arg;
+ krb5_error_code err;
+
+ err = krb5_ser_pack_int32(KV5M_GSS_OID, buffer, lenremain);
+ if (err)
+ return err;
+ err = krb5_ser_pack_int32((krb5_int32) oid->length,
+ buffer, lenremain);
+ if (err)
+ return err;
+ err = krb5_ser_pack_bytes((krb5_octet *) oid->elements,
+ oid->length, buffer, lenremain);
+ if (err)
+ return err;
+ err = krb5_ser_pack_int32(KV5M_GSS_OID, buffer, lenremain);
+ return err;
}
static krb5_error_code
kg_oid_internalize(kcontext, argp, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer *argp;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer *argp;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
- gss_OID oid;
- krb5_int32 ibuf;
- krb5_octet *bp;
- size_t remain;
-
- bp = *buffer;
- remain = *lenremain;
-
- /* Read in and check our magic number */
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
- return (EINVAL);
-
- if (ibuf != KV5M_GSS_OID)
- return (EINVAL);
-
- oid = (gss_OID) malloc(sizeof(gss_OID_desc));
- if (oid == NULL)
- return ENOMEM;
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
- free(oid);
- return EINVAL;
- }
- oid->length = ibuf;
- oid->elements = malloc(ibuf);
- if (oid->elements == 0) {
- free(oid);
- return ENOMEM;
- }
- if (krb5_ser_unpack_bytes((krb5_octet *) oid->elements,
- oid->length, &bp, &remain)) {
- free(oid->elements);
- free(oid);
- return EINVAL;
- }
-
- /* Read in and check our trailing magic number */
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
- free(oid->elements);
- free(oid);
- return (EINVAL);
- }
-
- if (ibuf != KV5M_GSS_OID) {
- free(oid->elements);
- free(oid);
- return (EINVAL);
- }
-
- *buffer = bp;
- *lenremain = remain;
- *argp = (krb5_pointer) oid;
- return 0;
+ gss_OID oid;
+ krb5_int32 ibuf;
+ krb5_octet *bp;
+ size_t remain;
+
+ bp = *buffer;
+ remain = *lenremain;
+
+ /* Read in and check our magic number */
+ if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
+ return (EINVAL);
+
+ if (ibuf != KV5M_GSS_OID)
+ return (EINVAL);
+
+ oid = (gss_OID) malloc(sizeof(gss_OID_desc));
+ if (oid == NULL)
+ return ENOMEM;
+ if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
+ free(oid);
+ return EINVAL;
+ }
+ oid->length = ibuf;
+ oid->elements = malloc(ibuf);
+ if (oid->elements == 0) {
+ free(oid);
+ return ENOMEM;
+ }
+ if (krb5_ser_unpack_bytes((krb5_octet *) oid->elements,
+ oid->length, &bp, &remain)) {
+ free(oid->elements);
+ free(oid);
+ return EINVAL;
+ }
+
+ /* Read in and check our trailing magic number */
+ if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
+ free(oid->elements);
+ free(oid);
+ return (EINVAL);
+ }
+
+ if (ibuf != KV5M_GSS_OID) {
+ free(oid->elements);
+ free(oid);
+ return (EINVAL);
+ }
+
+ *buffer = bp;
+ *lenremain = remain;
+ *argp = (krb5_pointer) oid;
+ return 0;
}
static krb5_error_code
kg_oid_size(kcontext, arg, sizep)
- krb5_context kcontext;
- krb5_pointer arg;
- size_t *sizep;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ size_t *sizep;
{
- krb5_error_code kret;
- gss_OID oid;
- size_t required;
+ krb5_error_code kret;
+ gss_OID oid;
+ size_t required;
- kret = EINVAL;
- if ((oid = (gss_OID) arg)) {
- required = 2*sizeof(krb5_int32); /* For the header and trailer */
- required += sizeof(krb5_int32);
- required += oid->length;
+ kret = EINVAL;
+ if ((oid = (gss_OID) arg)) {
+ required = 2*sizeof(krb5_int32); /* For the header and trailer */
+ required += sizeof(krb5_int32);
+ required += oid->length;
- kret = 0;
+ kret = 0;
- *sizep += required;
- }
+ *sizep += required;
+ }
- return(kret);
+ return(kret);
}
static krb5_error_code
kg_queue_externalize(kcontext, arg, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer arg;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
krb5_error_code err;
err = krb5_ser_pack_int32(KV5M_GSS_QUEUE, buffer, lenremain);
if (err == 0)
- err = g_queue_externalize(arg, buffer, lenremain);
+ err = g_queue_externalize(arg, buffer, lenremain);
if (err == 0)
- err = krb5_ser_pack_int32(KV5M_GSS_QUEUE, buffer, lenremain);
+ err = krb5_ser_pack_int32(KV5M_GSS_QUEUE, buffer, lenremain);
return err;
}
static krb5_error_code
kg_queue_internalize(kcontext, argp, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer *argp;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer *argp;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
- krb5_int32 ibuf;
- krb5_octet *bp;
- size_t remain;
- krb5_error_code err;
-
- bp = *buffer;
- remain = *lenremain;
-
- /* Read in and check our magic number */
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
- return (EINVAL);
-
- if (ibuf != KV5M_GSS_QUEUE)
- return (EINVAL);
-
- err = g_queue_internalize(argp, &bp, &remain);
- if (err)
- return err;
-
- /* Read in and check our trailing magic number */
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
- g_order_free(argp);
- return (EINVAL);
- }
-
- if (ibuf != KV5M_GSS_QUEUE) {
- g_order_free(argp);
- return (EINVAL);
- }
-
- *buffer = bp;
- *lenremain = remain;
- return 0;
+ krb5_int32 ibuf;
+ krb5_octet *bp;
+ size_t remain;
+ krb5_error_code err;
+
+ bp = *buffer;
+ remain = *lenremain;
+
+ /* Read in and check our magic number */
+ if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
+ return (EINVAL);
+
+ if (ibuf != KV5M_GSS_QUEUE)
+ return (EINVAL);
+
+ err = g_queue_internalize(argp, &bp, &remain);
+ if (err)
+ return err;
+
+ /* Read in and check our trailing magic number */
+ if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
+ g_order_free(argp);
+ return (EINVAL);
+ }
+
+ if (ibuf != KV5M_GSS_QUEUE) {
+ g_order_free(argp);
+ return (EINVAL);
+ }
+
+ *buffer = bp;
+ *lenremain = remain;
+ return 0;
}
static krb5_error_code
kg_queue_size(kcontext, arg, sizep)
- krb5_context kcontext;
- krb5_pointer arg;
- size_t *sizep;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ size_t *sizep;
{
- krb5_error_code kret;
- size_t required;
-
- kret = EINVAL;
- if (arg) {
- required = 2*sizeof(krb5_int32); /* For the header and trailer */
- g_queue_size(arg, &required);
-
- kret = 0;
- *sizep += required;
- }
- return(kret);
+ krb5_error_code kret;
+ size_t required;
+
+ kret = EINVAL;
+ if (arg) {
+ required = 2*sizeof(krb5_int32); /* For the header and trailer */
+ g_queue_size(arg, &required);
+
+ kret = 0;
+ *sizep += required;
+ }
+ return(kret);
}
/*
@@ -236,108 +237,108 @@ kg_queue_size(kcontext, arg, sizep)
*/
krb5_error_code
kg_ctx_size(kcontext, arg, sizep)
- krb5_context kcontext;
- krb5_pointer arg;
- size_t *sizep;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ size_t *sizep;
{
- krb5_error_code kret;
- krb5_gss_ctx_id_rec *ctx;
- size_t required;
+ krb5_error_code kret;
+ krb5_gss_ctx_id_rec *ctx;
+ size_t required;
/*
* krb5_gss_ctx_id_rec requires:
- * krb5_int32 for KG_CONTEXT
- * krb5_int32 for initiate.
- * krb5_int32 for established.
- * krb5_int32 for big_endian.
- * krb5_int32 for have_acceptor_subkey.
- * krb5_int32 for seed_init.
- * krb5_int32 for gss_flags.
- * sizeof(seed) for seed
- * ... for here
- * ... for there
- * ... for subkey
- * krb5_int32 for signalg.
- * krb5_int32 for cksum_size.
- * krb5_int32 for sealalg.
- * ... for enc
- * ... for seq
- * krb5_int32 for endtime.
- * krb5_int32 for flags.
- * krb5_int64 for seq_send.
- * krb5_int64 for seq_recv.
- * ... for seqstate
- * ... for auth_context
- * ... for mech_used
- * krb5_int32 for proto
- * krb5_int32 for cksumtype
- * ... for acceptor_subkey
- * krb5_int32 for acceptor_key_cksumtype
- * krb5_int32 for cred_rcache
- * krb5_int32 for trailer.
+ * krb5_int32 for KG_CONTEXT
+ * krb5_int32 for initiate.
+ * krb5_int32 for established.
+ * krb5_int32 for big_endian.
+ * krb5_int32 for have_acceptor_subkey.
+ * krb5_int32 for seed_init.
+ * krb5_int32 for gss_flags.
+ * sizeof(seed) for seed
+ * ... for here
+ * ... for there
+ * ... for subkey
+ * krb5_int32 for signalg.
+ * krb5_int32 for cksum_size.
+ * krb5_int32 for sealalg.
+ * ... for enc
+ * ... for seq
+ * krb5_int32 for endtime.
+ * krb5_int32 for flags.
+ * krb5_int64 for seq_send.
+ * krb5_int64 for seq_recv.
+ * ... for seqstate
+ * ... for auth_context
+ * ... for mech_used
+ * krb5_int32 for proto
+ * krb5_int32 for cksumtype
+ * ... for acceptor_subkey
+ * krb5_int32 for acceptor_key_cksumtype
+ * krb5_int32 for cred_rcache
+ * krb5_int32 for trailer.
*/
kret = EINVAL;
if ((ctx = (krb5_gss_ctx_id_rec *) arg)) {
- required = 17*sizeof(krb5_int32);
- required += 2*sizeof(krb5_int64);
- required += sizeof(ctx->seed);
-
- kret = 0;
- if (!kret && ctx->here)
- kret = krb5_size_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer) ctx->here,
- &required);
-
- if (!kret && ctx->there)
- kret = krb5_size_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer) ctx->there,
- &required);
-
- if (!kret && ctx->subkey)
- kret = krb5_size_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->subkey,
- &required);
-
- if (!kret && ctx->enc)
- kret = krb5_size_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->enc,
- &required);
-
- if (!kret && ctx->seq)
- kret = krb5_size_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->seq,
- &required);
-
- if (!kret)
- kret = kg_oid_size(kcontext,
- (krb5_pointer) ctx->mech_used,
- &required);
-
- if (!kret && ctx->seqstate)
- kret = kg_queue_size(kcontext, ctx->seqstate, &required);
-
- if (!kret)
- kret = krb5_size_opaque(kcontext,
- KV5M_CONTEXT,
- (krb5_pointer) ctx->k5_context,
- &required);
- if (!kret)
- kret = krb5_size_opaque(kcontext,
- KV5M_AUTH_CONTEXT,
- (krb5_pointer) ctx->auth_context,
- &required);
- if (!kret && ctx->acceptor_subkey)
- kret = krb5_size_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->acceptor_subkey,
- &required);
- if (!kret)
- *sizep += required;
+ required = 17*sizeof(krb5_int32);
+ required += 2*sizeof(krb5_int64);
+ required += sizeof(ctx->seed);
+
+ kret = 0;
+ if (!kret && ctx->here)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer) ctx->here,
+ &required);
+
+ if (!kret && ctx->there)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer) ctx->there,
+ &required);
+
+ if (!kret && ctx->subkey)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->subkey,
+ &required);
+
+ if (!kret && ctx->enc)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->enc,
+ &required);
+
+ if (!kret && ctx->seq)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->seq,
+ &required);
+
+ if (!kret)
+ kret = kg_oid_size(kcontext,
+ (krb5_pointer) ctx->mech_used,
+ &required);
+
+ if (!kret && ctx->seqstate)
+ kret = kg_queue_size(kcontext, ctx->seqstate, &required);
+
+ if (!kret)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_CONTEXT,
+ (krb5_pointer) ctx->k5_context,
+ &required);
+ if (!kret)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_AUTH_CONTEXT,
+ (krb5_pointer) ctx->auth_context,
+ &required);
+ if (!kret && ctx->acceptor_subkey)
+ kret = krb5_size_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->acceptor_subkey,
+ &required);
+ if (!kret)
+ *sizep += required;
}
return(kret);
}
@@ -347,20 +348,20 @@ kg_ctx_size(kcontext, arg, sizep)
*/
krb5_error_code
kg_ctx_externalize(kcontext, arg, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer arg;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer arg;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
- krb5_error_code kret;
- krb5_gss_ctx_id_rec *ctx;
- size_t required;
- krb5_octet *bp;
- size_t remain;
+ krb5_error_code kret;
+ krb5_gss_ctx_id_rec *ctx;
+ size_t required;
+ krb5_octet *bp;
+ size_t remain;
krb5int_access kaccess;
kret = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
- if (kret)
+ if (kret)
return(kret);
required = 0;
@@ -368,122 +369,122 @@ kg_ctx_externalize(kcontext, arg, buffer, lenremain)
remain = *lenremain;
kret = EINVAL;
if ((ctx = (krb5_gss_ctx_id_rec *) arg)) {
- kret = ENOMEM;
- if (!kg_ctx_size(kcontext, arg, &required) &&
- (required <= remain)) {
- /* Our identifier */
- (void) krb5_ser_pack_int32(KG_CONTEXT, &bp, &remain);
-
- /* Now static data */
- (void) krb5_ser_pack_int32((krb5_int32) ctx->initiate,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->established,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->big_endian,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->have_acceptor_subkey,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->seed_init,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->gss_flags,
- &bp, &remain);
- (void) krb5_ser_pack_bytes((krb5_octet *) ctx->seed,
- sizeof(ctx->seed),
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->signalg,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->cksum_size,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->sealalg,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->endtime,
- &bp, &remain);
- (void) krb5_ser_pack_int32((krb5_int32) ctx->krb_flags,
- &bp, &remain);
- (void) (*kaccess.krb5_ser_pack_int64)((krb5_int64) ctx->seq_send,
- &bp, &remain);
- (void) (*kaccess.krb5_ser_pack_int64)((krb5_int64) ctx->seq_recv,
- &bp, &remain);
-
- /* Now dynamic data */
- kret = 0;
-
- if (!kret && ctx->mech_used)
- kret = kg_oid_externalize(kcontext, ctx->mech_used,
- &bp, &remain);
-
- if (!kret && ctx->here)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer) ctx->here,
- &bp, &remain);
-
- if (!kret && ctx->there)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer) ctx->there,
- &bp, &remain);
-
- if (!kret && ctx->subkey)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->subkey,
- &bp, &remain);
-
- if (!kret && ctx->enc)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->enc,
- &bp, &remain);
-
- if (!kret && ctx->seq)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->seq,
- &bp, &remain);
-
- if (!kret && ctx->seqstate)
- kret = kg_queue_externalize(kcontext,
- ctx->seqstate, &bp, &remain);
-
- if (!kret)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_CONTEXT,
- (krb5_pointer) ctx->k5_context,
- &bp, &remain);
-
- if (!kret)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_AUTH_CONTEXT,
- (krb5_pointer) ctx->auth_context,
- &bp, &remain);
-
- if (!kret)
- kret = krb5_ser_pack_int32((krb5_int32) ctx->proto,
- &bp, &remain);
- if (!kret)
- kret = krb5_ser_pack_int32((krb5_int32) ctx->cksumtype,
- &bp, &remain);
- if (!kret && ctx->acceptor_subkey)
- kret = krb5_externalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer) ctx->acceptor_subkey,
- &bp, &remain);
- if (!kret)
- kret = krb5_ser_pack_int32((krb5_int32) ctx->acceptor_subkey_cksumtype,
- &bp, &remain);
-
- if (!kret)
- kret = krb5_ser_pack_int32((krb5_int32) ctx->cred_rcache,
- &bp, &remain);
- /* trailer */
- if (!kret)
- kret = krb5_ser_pack_int32(KG_CONTEXT, &bp, &remain);
- if (!kret) {
- *buffer = bp;
- *lenremain = remain;
- }
- }
+ kret = ENOMEM;
+ if (!kg_ctx_size(kcontext, arg, &required) &&
+ (required <= remain)) {
+ /* Our identifier */
+ (void) krb5_ser_pack_int32(KG_CONTEXT, &bp, &remain);
+
+ /* Now static data */
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->initiate,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->established,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->big_endian,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->have_acceptor_subkey,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->seed_init,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->gss_flags,
+ &bp, &remain);
+ (void) krb5_ser_pack_bytes((krb5_octet *) ctx->seed,
+ sizeof(ctx->seed),
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->signalg,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->cksum_size,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->sealalg,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->endtime,
+ &bp, &remain);
+ (void) krb5_ser_pack_int32((krb5_int32) ctx->krb_flags,
+ &bp, &remain);
+ (void) (*kaccess.krb5_ser_pack_int64)((krb5_int64) ctx->seq_send,
+ &bp, &remain);
+ (void) (*kaccess.krb5_ser_pack_int64)((krb5_int64) ctx->seq_recv,
+ &bp, &remain);
+
+ /* Now dynamic data */
+ kret = 0;
+
+ if (!kret && ctx->mech_used)
+ kret = kg_oid_externalize(kcontext, ctx->mech_used,
+ &bp, &remain);
+
+ if (!kret && ctx->here)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer) ctx->here,
+ &bp, &remain);
+
+ if (!kret && ctx->there)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer) ctx->there,
+ &bp, &remain);
+
+ if (!kret && ctx->subkey)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->subkey,
+ &bp, &remain);
+
+ if (!kret && ctx->enc)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->enc,
+ &bp, &remain);
+
+ if (!kret && ctx->seq)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->seq,
+ &bp, &remain);
+
+ if (!kret && ctx->seqstate)
+ kret = kg_queue_externalize(kcontext,
+ ctx->seqstate, &bp, &remain);
+
+ if (!kret)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_CONTEXT,
+ (krb5_pointer) ctx->k5_context,
+ &bp, &remain);
+
+ if (!kret)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_AUTH_CONTEXT,
+ (krb5_pointer) ctx->auth_context,
+ &bp, &remain);
+
+ if (!kret)
+ kret = krb5_ser_pack_int32((krb5_int32) ctx->proto,
+ &bp, &remain);
+ if (!kret)
+ kret = krb5_ser_pack_int32((krb5_int32) ctx->cksumtype,
+ &bp, &remain);
+ if (!kret && ctx->acceptor_subkey)
+ kret = krb5_externalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer) ctx->acceptor_subkey,
+ &bp, &remain);
+ if (!kret)
+ kret = krb5_ser_pack_int32((krb5_int32) ctx->acceptor_subkey_cksumtype,
+ &bp, &remain);
+
+ if (!kret)
+ kret = krb5_ser_pack_int32((krb5_int32) ctx->cred_rcache,
+ &bp, &remain);
+ /* trailer */
+ if (!kret)
+ kret = krb5_ser_pack_int32(KG_CONTEXT, &bp, &remain);
+ if (!kret) {
+ *buffer = bp;
+ *lenremain = remain;
+ }
+ }
}
return(kret);
}
@@ -493,16 +494,16 @@ kg_ctx_externalize(kcontext, arg, buffer, lenremain)
*/
krb5_error_code
kg_ctx_internalize(kcontext, argp, buffer, lenremain)
- krb5_context kcontext;
- krb5_pointer *argp;
- krb5_octet **buffer;
- size_t *lenremain;
+ krb5_context kcontext;
+ krb5_pointer *argp;
+ krb5_octet **buffer;
+ size_t *lenremain;
{
- krb5_error_code kret;
- krb5_gss_ctx_id_rec *ctx;
- krb5_int32 ibuf;
- krb5_octet *bp;
- size_t remain;
+ krb5_error_code kret;
+ krb5_gss_ctx_id_rec *ctx;
+ krb5_int32 ibuf;
+ krb5_octet *bp;
+ size_t remain;
krb5int_access kaccess;
kret = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
@@ -514,167 +515,167 @@ kg_ctx_internalize(kcontext, argp, buffer, lenremain)
kret = EINVAL;
/* Read our magic number */
if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
- ibuf = 0;
+ ibuf = 0;
if (ibuf == KG_CONTEXT) {
- kret = ENOMEM;
-
- /* Get a context */
- if ((remain >= (17*sizeof(krb5_int32)
- + 2*sizeof(krb5_int64)
- + sizeof(ctx->seed))) &&
- (ctx = (krb5_gss_ctx_id_rec *)
- xmalloc(sizeof(krb5_gss_ctx_id_rec)))) {
- memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
-
- ctx->k5_context = kcontext;
-
- /* Get static data */
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->initiate = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->established = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->big_endian = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->have_acceptor_subkey = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->seed_init = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->gss_flags = (int) ibuf;
- (void) krb5_ser_unpack_bytes((krb5_octet *) ctx->seed,
- sizeof(ctx->seed),
- &bp, &remain);
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->signalg = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->cksum_size = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->sealalg = (int) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->endtime = (krb5_timestamp) ibuf;
- (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->krb_flags = (krb5_flags) ibuf;
- (void) (*kaccess.krb5_ser_unpack_int64)(&ctx->seq_send, &bp, &remain);
- kret = (*kaccess.krb5_ser_unpack_int64)(&ctx->seq_recv, &bp, &remain);
- if (kret) {
- free(ctx);
- return kret;
- }
-
- {
- krb5_pointer tmp;
- kret = kg_oid_internalize(kcontext, &tmp, &bp,
- &remain);
- if (kret == 0)
- ctx->mech_used = tmp;
- else if (kret == EINVAL)
- kret = 0;
- }
- /* Now get substructure data */
- if ((kret = krb5_internalize_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer *) &ctx->here,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
- if (!kret &&
- (kret = krb5_internalize_opaque(kcontext,
- KV5M_PRINCIPAL,
- (krb5_pointer *) &ctx->there,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
- if (!kret &&
- (kret = krb5_internalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer *) &ctx->subkey,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
- if (!kret &&
- (kret = krb5_internalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer *) &ctx->enc,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
- if (!kret &&
- (kret = krb5_internalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer *) &ctx->seq,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
-
- if (!kret) {
- kret = kg_queue_internalize(kcontext, &ctx->seqstate,
- &bp, &remain);
- if (kret == EINVAL)
- kret = 0;
- }
-
- if (!kret)
- kret = krb5_internalize_opaque(kcontext,
- KV5M_CONTEXT,
- (krb5_pointer *) &ctx->k5_context,
- &bp, &remain);
-
- if (!kret)
- kret = krb5_internalize_opaque(kcontext,
- KV5M_AUTH_CONTEXT,
- (krb5_pointer *) &ctx->auth_context,
- &bp, &remain);
-
- if (!kret)
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->proto = ibuf;
- if (!kret)
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->cksumtype = ibuf;
- if (!kret &&
- (kret = krb5_internalize_opaque(kcontext,
- KV5M_KEYBLOCK,
- (krb5_pointer *) &ctx->acceptor_subkey,
- &bp, &remain))) {
- if (kret == EINVAL)
- kret = 0;
- }
- if (!kret)
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->cred_rcache = ibuf;
- if (!kret)
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- ctx->acceptor_subkey_cksumtype = ibuf;
-
- /* Get trailer */
- if (!kret)
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- if (!kret && ibuf != KG_CONTEXT)
- kret = EINVAL;
-
- if (!kret) {
- *buffer = bp;
- *lenremain = remain;
- *argp = (krb5_pointer) ctx;
- } else {
- if (ctx->seq)
- krb5_free_keyblock(kcontext, ctx->seq);
- if (ctx->enc)
- krb5_free_keyblock(kcontext, ctx->enc);
- if (ctx->subkey)
- krb5_free_keyblock(kcontext, ctx->subkey);
- if (ctx->there)
- krb5_free_principal(kcontext, ctx->there);
- if (ctx->here)
- krb5_free_principal(kcontext, ctx->here);
- xfree(ctx);
- }
- }
+ kret = ENOMEM;
+
+ /* Get a context */
+ if ((remain >= (17*sizeof(krb5_int32)
+ + 2*sizeof(krb5_int64)
+ + sizeof(ctx->seed))) &&
+ (ctx = (krb5_gss_ctx_id_rec *)
+ xmalloc(sizeof(krb5_gss_ctx_id_rec)))) {
+ memset(ctx, 0, sizeof(krb5_gss_ctx_id_rec));
+
+ ctx->k5_context = kcontext;
+
+ /* Get static data */
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->initiate = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->established = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->big_endian = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->have_acceptor_subkey = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->seed_init = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->gss_flags = (int) ibuf;
+ (void) krb5_ser_unpack_bytes((krb5_octet *) ctx->seed,
+ sizeof(ctx->seed),
+ &bp, &remain);
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->signalg = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->cksum_size = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->sealalg = (int) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->endtime = (krb5_timestamp) ibuf;
+ (void) krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->krb_flags = (krb5_flags) ibuf;
+ (void) (*kaccess.krb5_ser_unpack_int64)(&ctx->seq_send, &bp, &remain);
+ kret = (*kaccess.krb5_ser_unpack_int64)(&ctx->seq_recv, &bp, &remain);
+ if (kret) {
+ free(ctx);
+ return kret;
+ }
+
+ {
+ krb5_pointer tmp;
+ kret = kg_oid_internalize(kcontext, &tmp, &bp,
+ &remain);
+ if (kret == 0)
+ ctx->mech_used = tmp;
+ else if (kret == EINVAL)
+ kret = 0;
+ }
+ /* Now get substructure data */
+ if ((kret = krb5_internalize_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer *) &ctx->here,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+ if (!kret &&
+ (kret = krb5_internalize_opaque(kcontext,
+ KV5M_PRINCIPAL,
+ (krb5_pointer *) &ctx->there,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+ if (!kret &&
+ (kret = krb5_internalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer *) &ctx->subkey,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+ if (!kret &&
+ (kret = krb5_internalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer *) &ctx->enc,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+ if (!kret &&
+ (kret = krb5_internalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer *) &ctx->seq,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+
+ if (!kret) {
+ kret = kg_queue_internalize(kcontext, &ctx->seqstate,
+ &bp, &remain);
+ if (kret == EINVAL)
+ kret = 0;
+ }
+
+ if (!kret)
+ kret = krb5_internalize_opaque(kcontext,
+ KV5M_CONTEXT,
+ (krb5_pointer *) &ctx->k5_context,
+ &bp, &remain);
+
+ if (!kret)
+ kret = krb5_internalize_opaque(kcontext,
+ KV5M_AUTH_CONTEXT,
+ (krb5_pointer *) &ctx->auth_context,
+ &bp, &remain);
+
+ if (!kret)
+ kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->proto = ibuf;
+ if (!kret)
+ kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->cksumtype = ibuf;
+ if (!kret &&
+ (kret = krb5_internalize_opaque(kcontext,
+ KV5M_KEYBLOCK,
+ (krb5_pointer *) &ctx->acceptor_subkey,
+ &bp, &remain))) {
+ if (kret == EINVAL)
+ kret = 0;
+ }
+ if (!kret)
+ kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->cred_rcache = ibuf;
+ if (!kret)
+ kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ ctx->acceptor_subkey_cksumtype = ibuf;
+
+ /* Get trailer */
+ if (!kret)
+ kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+ if (!kret && ibuf != KG_CONTEXT)
+ kret = EINVAL;
+
+ if (!kret) {
+ *buffer = bp;
+ *lenremain = remain;
+ *argp = (krb5_pointer) ctx;
+ } else {
+ if (ctx->seq)
+ krb5_free_keyblock(kcontext, ctx->seq);
+ if (ctx->enc)
+ krb5_free_keyblock(kcontext, ctx->enc);
+ if (ctx->subkey)
+ krb5_free_keyblock(kcontext, ctx->subkey);
+ if (ctx->there)
+ krb5_free_principal(kcontext, ctx->there);
+ if (ctx->here)
+ krb5_free_principal(kcontext, ctx->here);
+ xfree(ctx);
+ }
+ }
}
return(kret);
}
diff --git a/src/lib/gssapi/krb5/set_allowable_enctypes.c b/src/lib/gssapi/krb5/set_allowable_enctypes.c
index 396a6f6458..e35a153c42 100644
--- a/src/lib/gssapi/krb5/set_allowable_enctypes.c
+++ b/src/lib/gssapi/krb5/set_allowable_enctypes.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/set_allowable_enctypes.c
*
@@ -8,7 +9,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -59,10 +60,10 @@
#include "gssapi_krb5.h"
OM_uint32 KRB5_CALLCONV
-gss_krb5int_set_allowable_enctypes(OM_uint32 *minor_status,
- gss_cred_id_t cred_handle,
- OM_uint32 num_ktypes,
- krb5_enctype *ktypes)
+gss_krb5int_set_allowable_enctypes(OM_uint32 *minor_status,
+ gss_cred_id_t cred_handle,
+ OM_uint32 num_ktypes,
+ krb5_enctype *ktypes)
{
unsigned int i;
krb5_enctype * new_ktypes;
@@ -77,50 +78,50 @@ gss_krb5int_set_allowable_enctypes(OM_uint32 *minor_status,
/* verify and valildate cred handle */
if (cred_handle == GSS_C_NO_CREDENTIAL) {
- kerr = KRB5_NOCREDS_SUPPLIED;
- goto error_out;
+ kerr = KRB5_NOCREDS_SUPPLIED;
+ goto error_out;
}
major_status = krb5_gss_validate_cred(&temp_status, cred_handle);
if (GSS_ERROR(major_status)) {
- kerr = temp_status;
- goto error_out;
+ kerr = temp_status;
+ goto error_out;
}
cred = (krb5_gss_cred_id_t) cred_handle;
if (ktypes) {
- for (i = 0; i < num_ktypes && ktypes[i]; i++) {
- if (!krb5_c_valid_enctype(ktypes[i])) {
- kerr = KRB5_PROG_ETYPE_NOSUPP;
- goto error_out;
- }
- }
+ for (i = 0; i < num_ktypes && ktypes[i]; i++) {
+ if (!krb5_c_valid_enctype(ktypes[i])) {
+ kerr = KRB5_PROG_ETYPE_NOSUPP;
+ goto error_out;
+ }
+ }
} else {
- kerr = k5_mutex_lock(&cred->lock);
- if (kerr)
- goto error_out;
- if (cred->req_enctypes)
- free(cred->req_enctypes);
- cred->req_enctypes = NULL;
- k5_mutex_unlock(&cred->lock);
- return GSS_S_COMPLETE;
+ kerr = k5_mutex_lock(&cred->lock);
+ if (kerr)
+ goto error_out;
+ if (cred->req_enctypes)
+ free(cred->req_enctypes);
+ cred->req_enctypes = NULL;
+ k5_mutex_unlock(&cred->lock);
+ return GSS_S_COMPLETE;
}
/* Copy the requested ktypes into the cred structure */
if ((new_ktypes = (krb5_enctype *)malloc(sizeof(krb5_enctype) * (i + 1)))) {
- memcpy(new_ktypes, ktypes, sizeof(krb5_enctype) * i);
- new_ktypes[i] = 0; /* "null-terminate" the list */
+ memcpy(new_ktypes, ktypes, sizeof(krb5_enctype) * i);
+ new_ktypes[i] = 0; /* "null-terminate" the list */
}
else {
- kerr = ENOMEM;
- goto error_out;
+ kerr = ENOMEM;
+ goto error_out;
}
kerr = k5_mutex_lock(&cred->lock);
if (kerr) {
- free(new_ktypes);
- goto error_out;
+ free(new_ktypes);
+ goto error_out;
}
if (cred->req_enctypes)
- free(cred->req_enctypes);
+ free(cred->req_enctypes);
cred->req_enctypes = new_ktypes;
k5_mutex_unlock(&cred->lock);
diff --git a/src/lib/gssapi/krb5/set_ccache.c b/src/lib/gssapi/krb5/set_ccache.c
index 931058290b..2c82cfdfc3 100644
--- a/src/lib/gssapi/krb5/set_ccache.c
+++ b/src/lib/gssapi/krb5/set_ccache.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* lib/gssapi/krb5/set_ccache.c
*
@@ -8,7 +9,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -31,11 +32,11 @@
#include "gssapiP_krb5.h"
#include "gss_libinit.h"
-OM_uint32 KRB5_CALLCONV
+OM_uint32 KRB5_CALLCONV
gss_krb5_ccache_name(minor_status, name, out_name)
- OM_uint32 *minor_status;
- const char *name;
- const char **out_name;
+ OM_uint32 *minor_status;
+ const char *name;
+ const char **out_name;
{
char *old_name = NULL;
OM_uint32 err = 0;
@@ -44,8 +45,8 @@ gss_krb5_ccache_name(minor_status, name, out_name)
err = gssint_initialize_library();
if (err) {
- *minor_status = err;
- return GSS_S_FAILURE;
+ *minor_status = err;
+ return GSS_S_FAILURE;
}
gss_out_name = k5_getspecific(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME);
@@ -59,7 +60,7 @@ gss_krb5_ccache_name(minor_status, name, out_name)
if (!err) {
old_name = gss_out_name;
gss_out_name = tmp_name;
- }
+ }
}
/* If out_name was NULL, we keep the same gss_out_name value, and
don't free up any storage (leave old_name NULL). */
@@ -69,12 +70,12 @@ gss_krb5_ccache_name(minor_status, name, out_name)
minor = k5_setspecific(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME, gss_out_name);
if (minor) {
- /* Um. Now what? */
- if (err == 0) {
- err = minor;
- }
- free(gss_out_name);
- gss_out_name = NULL;
+ /* Um. Now what? */
+ if (err == 0) {
+ err = minor;
+ }
+ free(gss_out_name);
+ gss_out_name = NULL;
}
if (!err) {
@@ -82,11 +83,11 @@ gss_krb5_ccache_name(minor_status, name, out_name)
*out_name = gss_out_name;
}
}
-
+
if (old_name != NULL) {
free (old_name);
}
-
+
*minor_status = err;
return (*minor_status == 0) ? GSS_S_COMPLETE : GSS_S_FAILURE;
}
diff --git a/src/lib/gssapi/krb5/sign.c b/src/lib/gssapi/krb5/sign.c
index 2d192c9bb1..cc09f32281 100644
--- a/src/lib/gssapi/krb5/sign.c
+++ b/src/lib/gssapi/krb5/sign.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,30 +29,30 @@
OM_uint32
krb5_gss_sign(minor_status, context_handle,
- qop_req, message_buffer,
- message_token)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int qop_req;
- gss_buffer_t message_buffer;
- gss_buffer_t message_token;
+ qop_req, message_buffer,
+ message_token)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int qop_req;
+ gss_buffer_t message_buffer;
+ gss_buffer_t message_token;
{
- return(kg_seal(minor_status, context_handle, 0,
- qop_req, message_buffer, NULL,
- message_token, KG_TOK_SIGN_MSG));
+ return(kg_seal(minor_status, context_handle, 0,
+ qop_req, message_buffer, NULL,
+ message_token, KG_TOK_SIGN_MSG));
}
/* V2 interface */
OM_uint32
krb5_gss_get_mic(minor_status, context_handle, qop_req,
- message_buffer, message_token)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_qop_t qop_req;
- gss_buffer_t message_buffer;
- gss_buffer_t message_token;
+ message_buffer, message_token)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_qop_t qop_req;
+ gss_buffer_t message_buffer;
+ gss_buffer_t message_token;
{
return(kg_seal(minor_status, context_handle, 0,
- (int) qop_req, message_buffer, NULL,
- message_token, KG_TOK_MIC_MSG));
+ (int) qop_req, message_buffer, NULL,
+ message_token, KG_TOK_MIC_MSG));
}
diff --git a/src/lib/gssapi/krb5/unseal.c b/src/lib/gssapi/krb5/unseal.c
index 71dc110486..381df93642 100644
--- a/src/lib/gssapi/krb5/unseal.c
+++ b/src/lib/gssapi/krb5/unseal.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,39 +29,39 @@
OM_uint32
krb5_gss_unseal(minor_status, context_handle,
- input_message_buffer, output_message_buffer,
- conf_state, qop_state)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t input_message_buffer;
- gss_buffer_t output_message_buffer;
- int *conf_state;
- int *qop_state;
+ input_message_buffer, output_message_buffer,
+ conf_state, qop_state)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t input_message_buffer;
+ gss_buffer_t output_message_buffer;
+ int *conf_state;
+ int *qop_state;
{
- return(kg_unseal(minor_status, context_handle,
- input_message_buffer, output_message_buffer,
- conf_state, qop_state, KG_TOK_SEAL_MSG));
+ return(kg_unseal(minor_status, context_handle,
+ input_message_buffer, output_message_buffer,
+ conf_state, qop_state, KG_TOK_SEAL_MSG));
}
/* V2 interface */
OM_uint32
krb5_gss_unwrap(minor_status, context_handle,
- input_message_buffer, output_message_buffer,
- conf_state, qop_state)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t input_message_buffer;
- gss_buffer_t output_message_buffer;
- int *conf_state;
- gss_qop_t *qop_state;
+ input_message_buffer, output_message_buffer,
+ conf_state, qop_state)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t input_message_buffer;
+ gss_buffer_t output_message_buffer;
+ int *conf_state;
+ gss_qop_t *qop_state;
{
- OM_uint32 rstat;
- int qstate;
+ OM_uint32 rstat;
+ int qstate;
rstat = kg_unseal(minor_status, context_handle,
- input_message_buffer, output_message_buffer,
- conf_state, &qstate, KG_TOK_WRAP_MSG);
+ input_message_buffer, output_message_buffer,
+ conf_state, &qstate, KG_TOK_WRAP_MSG);
if (!rstat && qop_state)
- *qop_state = (gss_qop_t) qstate;
+ *qop_state = (gss_qop_t) qstate;
return(rstat);
}
diff --git a/src/lib/gssapi/krb5/util_cksum.c b/src/lib/gssapi/krb5/util_cksum.c
index 235d749473..b863572a78 100644
--- a/src/lib/gssapi/krb5/util_cksum.c
+++ b/src/lib/gssapi/krb5/util_cksum.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,81 +29,81 @@
/* Checksumming the channel bindings always uses plain MD5. */
krb5_error_code
kg_checksum_channel_bindings(context, cb, cksum, bigend)
- krb5_context context;
- gss_channel_bindings_t cb;
- krb5_checksum *cksum;
- int bigend;
+ krb5_context context;
+ gss_channel_bindings_t cb;
+ krb5_checksum *cksum;
+ int bigend;
{
- size_t len;
- char *buf = 0;
- char *ptr;
- size_t sumlen;
- krb5_data plaind;
- krb5_error_code code;
- void *temp;
-
- /* initialize the the cksum */
- code = krb5_c_checksum_length(context, CKSUMTYPE_RSA_MD5, &sumlen);
- if (code)
- return(code);
-
- cksum->checksum_type = CKSUMTYPE_RSA_MD5;
- cksum->length = sumlen;
-
- /* generate a buffer full of zeros if no cb specified */
-
- if (cb == GSS_C_NO_CHANNEL_BINDINGS) {
- if ((cksum->contents = (krb5_octet *) xmalloc(cksum->length)) == NULL) {
- return(ENOMEM);
- }
- memset(cksum->contents, '\0', cksum->length);
- return(0);
- }
-
- /* create the buffer to checksum into */
-
- len = (sizeof(krb5_int32)*5+
- cb->initiator_address.length+
- cb->acceptor_address.length+
- cb->application_data.length);
-
- if ((buf = (char *) xmalloc(len)) == NULL)
- return(ENOMEM);
-
- /* helper macros. This code currently depends on a long being 32
- bits, and htonl dtrt. */
-
- ptr = buf;
-
- TWRITE_INT(ptr, cb->initiator_addrtype, bigend);
- TWRITE_BUF(ptr, cb->initiator_address, bigend);
- TWRITE_INT(ptr, cb->acceptor_addrtype, bigend);
- TWRITE_BUF(ptr, cb->acceptor_address, bigend);
- TWRITE_BUF(ptr, cb->application_data, bigend);
-
- /* checksum the data */
-
- plaind.length = len;
- plaind.data = buf;
-
- code = krb5_c_make_checksum(context, CKSUMTYPE_RSA_MD5, 0, 0,
- &plaind, cksum);
- if (code)
- goto cleanup;
-
- if ((temp = xmalloc(cksum->length)) == NULL) {
- krb5_free_checksum_contents(context, cksum);
- code = ENOMEM;
- goto cleanup;
- }
-
- memcpy(temp, cksum->contents, cksum->length);
- krb5_free_checksum_contents(context, cksum);
- cksum->contents = (krb5_octet *)temp;
-
- /* success */
- cleanup:
- if (buf)
- xfree(buf);
- return code;
+ size_t len;
+ char *buf = 0;
+ char *ptr;
+ size_t sumlen;
+ krb5_data plaind;
+ krb5_error_code code;
+ void *temp;
+
+ /* initialize the the cksum */
+ code = krb5_c_checksum_length(context, CKSUMTYPE_RSA_MD5, &sumlen);
+ if (code)
+ return(code);
+
+ cksum->checksum_type = CKSUMTYPE_RSA_MD5;
+ cksum->length = sumlen;
+
+ /* generate a buffer full of zeros if no cb specified */
+
+ if (cb == GSS_C_NO_CHANNEL_BINDINGS) {
+ if ((cksum->contents = (krb5_octet *) xmalloc(cksum->length)) == NULL) {
+ return(ENOMEM);
+ }
+ memset(cksum->contents, '\0', cksum->length);
+ return(0);
+ }
+
+ /* create the buffer to checksum into */
+
+ len = (sizeof(krb5_int32)*5+
+ cb->initiator_address.length+
+ cb->acceptor_address.length+
+ cb->application_data.length);
+
+ if ((buf = (char *) xmalloc(len)) == NULL)
+ return(ENOMEM);
+
+ /* helper macros. This code currently depends on a long being 32
+ bits, and htonl dtrt. */
+
+ ptr = buf;
+
+ TWRITE_INT(ptr, cb->initiator_addrtype, bigend);
+ TWRITE_BUF(ptr, cb->initiator_address, bigend);
+ TWRITE_INT(ptr, cb->acceptor_addrtype, bigend);
+ TWRITE_BUF(ptr, cb->acceptor_address, bigend);
+ TWRITE_BUF(ptr, cb->application_data, bigend);
+
+ /* checksum the data */
+
+ plaind.length = len;
+ plaind.data = buf;
+
+ code = krb5_c_make_checksum(context, CKSUMTYPE_RSA_MD5, 0, 0,
+ &plaind, cksum);
+ if (code)
+ goto cleanup;
+
+ if ((temp = xmalloc(cksum->length)) == NULL) {
+ krb5_free_checksum_contents(context, cksum);
+ code = ENOMEM;
+ goto cleanup;
+ }
+
+ memcpy(temp, cksum->contents, cksum->length);
+ krb5_free_checksum_contents(context, cksum);
+ cksum->contents = (krb5_octet *)temp;
+
+ /* success */
+cleanup:
+ if (buf)
+ xfree(buf);
+ return code;
}
diff --git a/src/lib/gssapi/krb5/util_crypt.c b/src/lib/gssapi/krb5/util_crypt.c
index dad4b023d2..a0d0747e6b 100644
--- a/src/lib/gssapi/krb5/util_crypt.c
+++ b/src/lib/gssapi/krb5/util_crypt.c
@@ -1,7 +1,8 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
- * Copyright2001 by the Massachusetts Institute of Technology.
+ * Copyright2001 by the Massachusetts Institute of Technology.
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -11,7 +12,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -23,14 +24,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -41,7 +42,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -55,186 +56,185 @@
int
kg_confounder_size(context, key)
- krb5_context context;
- krb5_keyblock *key;
+ krb5_context context;
+ krb5_keyblock *key;
{
- krb5_error_code code;
- size_t blocksize;
- /* We special case rc4*/
- if (key->enctype == ENCTYPE_ARCFOUR_HMAC)
- return 8;
- code = krb5_c_block_size(context, key->enctype, &blocksize);
- if (code)
- return(-1); /* XXX */
-
- return(blocksize);
+ krb5_error_code code;
+ size_t blocksize;
+ /* We special case rc4*/
+ if (key->enctype == ENCTYPE_ARCFOUR_HMAC)
+ return 8;
+ code = krb5_c_block_size(context, key->enctype, &blocksize);
+ if (code)
+ return(-1); /* XXX */
+
+ return(blocksize);
}
krb5_error_code
kg_make_confounder(context, key, buf)
- krb5_context context;
- krb5_keyblock *key;
- unsigned char *buf;
+ krb5_context context;
+ krb5_keyblock *key;
+ unsigned char *buf;
{
- krb5_error_code code;
- size_t blocksize;
- krb5_data lrandom;
+ krb5_error_code code;
+ size_t blocksize;
+ krb5_data lrandom;
- code = krb5_c_block_size(context, key->enctype, &blocksize);
- if (code)
- return(code);
+ code = krb5_c_block_size(context, key->enctype, &blocksize);
+ if (code)
+ return(code);
- lrandom.length = blocksize;
- lrandom.data = buf;
+ lrandom.length = blocksize;
+ lrandom.data = buf;
- return(krb5_c_random_make_octets(context, &lrandom));
+ return(krb5_c_random_make_octets(context, &lrandom));
}
krb5_error_code
kg_encrypt(context, key, usage, iv, in, out, length)
- krb5_context context;
- krb5_keyblock *key;
- int usage;
- krb5_pointer iv;
- krb5_const_pointer in;
- krb5_pointer out;
- unsigned int length;
+ krb5_context context;
+ krb5_keyblock *key;
+ int usage;
+ krb5_pointer iv;
+ krb5_const_pointer in;
+ krb5_pointer out;
+ unsigned int length;
{
- krb5_error_code code;
- size_t blocksize;
- krb5_data ivd, *pivd, inputd;
- krb5_enc_data outputd;
-
- if (iv) {
- code = krb5_c_block_size(context, key->enctype, &blocksize);
- if (code)
- return(code);
-
- ivd.length = blocksize;
- ivd.data = malloc(ivd.length);
- if (ivd.data == NULL)
- return ENOMEM;
- memcpy(ivd.data, iv, ivd.length);
- pivd = &ivd;
- } else {
- pivd = NULL;
- }
-
- inputd.length = length;
- inputd.data = in;
-
- outputd.ciphertext.length = length;
- outputd.ciphertext.data = out;
-
- code = krb5_c_encrypt(context, key, usage, pivd, &inputd, &outputd);
- if (pivd != NULL)
- free(pivd->data);
- return code;
+ krb5_error_code code;
+ size_t blocksize;
+ krb5_data ivd, *pivd, inputd;
+ krb5_enc_data outputd;
+
+ if (iv) {
+ code = krb5_c_block_size(context, key->enctype, &blocksize);
+ if (code)
+ return(code);
+
+ ivd.length = blocksize;
+ ivd.data = malloc(ivd.length);
+ if (ivd.data == NULL)
+ return ENOMEM;
+ memcpy(ivd.data, iv, ivd.length);
+ pivd = &ivd;
+ } else {
+ pivd = NULL;
+ }
+
+ inputd.length = length;
+ inputd.data = in;
+
+ outputd.ciphertext.length = length;
+ outputd.ciphertext.data = out;
+
+ code = krb5_c_encrypt(context, key, usage, pivd, &inputd, &outputd);
+ if (pivd != NULL)
+ free(pivd->data);
+ return code;
}
/* length is the length of the cleartext. */
krb5_error_code
kg_decrypt(context, key, usage, iv, in, out, length)
- krb5_context context;
- krb5_keyblock *key;
- int usage;
- krb5_pointer iv;
- krb5_const_pointer in;
- krb5_pointer out;
- unsigned int length;
+ krb5_context context;
+ krb5_keyblock *key;
+ int usage;
+ krb5_pointer iv;
+ krb5_const_pointer in;
+ krb5_pointer out;
+ unsigned int length;
{
- krb5_error_code code;
- size_t blocksize;
- krb5_data ivd, *pivd, outputd;
- krb5_enc_data inputd;
-
- if (iv) {
- code = krb5_c_block_size(context, key->enctype, &blocksize);
- if (code)
- return(code);
-
- ivd.length = blocksize;
- ivd.data = malloc(ivd.length);
- if (ivd.data == NULL)
- return ENOMEM;
- memcpy(ivd.data, iv, ivd.length);
- pivd = &ivd;
- } else {
- pivd = NULL;
- }
-
- inputd.enctype = ENCTYPE_UNKNOWN;
- inputd.ciphertext.length = length;
- inputd.ciphertext.data = in;
-
- outputd.length = length;
- outputd.data = out;
-
- code = krb5_c_decrypt(context, key, usage, pivd, &inputd, &outputd);
- if (pivd != NULL)
- free(pivd->data);
- return code;
+ krb5_error_code code;
+ size_t blocksize;
+ krb5_data ivd, *pivd, outputd;
+ krb5_enc_data inputd;
+
+ if (iv) {
+ code = krb5_c_block_size(context, key->enctype, &blocksize);
+ if (code)
+ return(code);
+
+ ivd.length = blocksize;
+ ivd.data = malloc(ivd.length);
+ if (ivd.data == NULL)
+ return ENOMEM;
+ memcpy(ivd.data, iv, ivd.length);
+ pivd = &ivd;
+ } else {
+ pivd = NULL;
+ }
+
+ inputd.enctype = ENCTYPE_UNKNOWN;
+ inputd.ciphertext.length = length;
+ inputd.ciphertext.data = in;
+
+ outputd.length = length;
+ outputd.data = out;
+
+ code = krb5_c_decrypt(context, key, usage, pivd, &inputd, &outputd);
+ if (pivd != NULL)
+ free(pivd->data);
+ return code;
}
krb5_error_code
kg_arcfour_docrypt (const krb5_keyblock *longterm_key , int ms_usage,
- const unsigned char *kd_data, size_t kd_data_len,
- const unsigned char *input_buf, size_t input_len,
- unsigned char *output_buf)
+ const unsigned char *kd_data, size_t kd_data_len,
+ const unsigned char *input_buf, size_t input_len,
+ unsigned char *output_buf)
{
- krb5_error_code code;
- krb5_data input, output;
- krb5int_access kaccess;
- krb5_keyblock seq_enc_key, usage_key;
- unsigned char t[4];
-
- usage_key.length = longterm_key->length;
- usage_key.contents = malloc(usage_key.length);
- if (usage_key.contents == NULL)
- return (ENOMEM);
- seq_enc_key.length = longterm_key->length;
- seq_enc_key.contents = malloc(seq_enc_key.length);
- if (seq_enc_key.contents == NULL) {
+ krb5_error_code code;
+ krb5_data input, output;
+ krb5int_access kaccess;
+ krb5_keyblock seq_enc_key, usage_key;
+ unsigned char t[4];
+
+ usage_key.length = longterm_key->length;
+ usage_key.contents = malloc(usage_key.length);
+ if (usage_key.contents == NULL)
+ return (ENOMEM);
+ seq_enc_key.length = longterm_key->length;
+ seq_enc_key.contents = malloc(seq_enc_key.length);
+ if (seq_enc_key.contents == NULL) {
+ free ((void *) usage_key.contents);
+ return (ENOMEM);
+ }
+ code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
+ if (code)
+ goto cleanup_arcfour;
+
+ t[0] = ms_usage &0xff;
+ t[1] = (ms_usage>>8) & 0xff;
+ t[2] = (ms_usage>>16) & 0xff;
+ t[3] = (ms_usage>>24) & 0xff;
+ input.data = (void *) &t;
+ input.length = 4;
+ output.data = (void *) usage_key.contents;
+ output.length = usage_key.length;
+ code = (*kaccess.krb5_hmac) (kaccess.md5_hash_provider,
+ longterm_key, 1, &input, &output);
+ if (code)
+ goto cleanup_arcfour;
+
+ input.data = ( void *) kd_data;
+ input.length = kd_data_len;
+ output.data = (void *) seq_enc_key.contents;
+ code = (*kaccess.krb5_hmac) (kaccess.md5_hash_provider,
+ &usage_key, 1, &input, &output);
+ if (code)
+ goto cleanup_arcfour;
+ input.data = ( void * ) input_buf;
+ input.length = input_len;
+ output.data = (void * ) output_buf;
+ output.length = input_len;
+ code = ((*kaccess.arcfour_enc_provider->encrypt)(
+ &seq_enc_key, 0,
+ &input, &output));
+cleanup_arcfour:
+ memset ((void *) seq_enc_key.contents, 0, seq_enc_key.length);
+ memset ((void *) usage_key.contents, 0, usage_key.length);
free ((void *) usage_key.contents);
- return (ENOMEM);
- }
- code = krb5int_accessor (&kaccess, KRB5INT_ACCESS_VERSION);
- if (code)
- goto cleanup_arcfour;
-
- t[0] = ms_usage &0xff;
- t[1] = (ms_usage>>8) & 0xff;
- t[2] = (ms_usage>>16) & 0xff;
- t[3] = (ms_usage>>24) & 0xff;
- input.data = (void *) &t;
- input.length = 4;
- output.data = (void *) usage_key.contents;
- output.length = usage_key.length;
- code = (*kaccess.krb5_hmac) (kaccess.md5_hash_provider,
- longterm_key, 1, &input, &output);
- if (code)
- goto cleanup_arcfour;
-
- input.data = ( void *) kd_data;
- input.length = kd_data_len;
- output.data = (void *) seq_enc_key.contents;
- code = (*kaccess.krb5_hmac) (kaccess.md5_hash_provider,
- &usage_key, 1, &input, &output);
- if (code)
- goto cleanup_arcfour;
- input.data = ( void * ) input_buf;
- input.length = input_len;
- output.data = (void * ) output_buf;
- output.length = input_len;
- code = ((*kaccess.arcfour_enc_provider->encrypt)(
- &seq_enc_key, 0,
- &input, &output));
- cleanup_arcfour:
- memset ((void *) seq_enc_key.contents, 0, seq_enc_key.length);
- memset ((void *) usage_key.contents, 0, usage_key.length);
- free ((void *) usage_key.contents);
- free ((void *) seq_enc_key.contents);
- return (code);
+ free ((void *) seq_enc_key.contents);
+ return (code);
}
-
diff --git a/src/lib/gssapi/krb5/util_seed.c b/src/lib/gssapi/krb5/util_seed.c
index 06a5c2aa9b..17d49a5872 100644
--- a/src/lib/gssapi/krb5/util_seed.c
+++ b/src/lib/gssapi/krb5/util_seed.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -29,26 +30,26 @@ static const unsigned char zeros[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
krb5_error_code
kg_make_seed(context, key, seed)
- krb5_context context;
- krb5_keyblock *key;
- unsigned char *seed;
+ krb5_context context;
+ krb5_keyblock *key;
+ unsigned char *seed;
{
- krb5_error_code code;
- krb5_keyblock *tmpkey;
- unsigned int i;
+ krb5_error_code code;
+ krb5_keyblock *tmpkey;
+ unsigned int i;
- code = krb5_copy_keyblock(context, key, &tmpkey);
- if (code)
- return(code);
+ code = krb5_copy_keyblock(context, key, &tmpkey);
+ if (code)
+ return(code);
- /* reverse the key bytes, as per spec */
+ /* reverse the key bytes, as per spec */
- for (i=0; i<tmpkey->length; i++)
- tmpkey->contents[i] = key->contents[key->length - 1 - i];
+ for (i=0; i<tmpkey->length; i++)
+ tmpkey->contents[i] = key->contents[key->length - 1 - i];
- code = kg_encrypt(context, tmpkey, KG_USAGE_SEAL, NULL, zeros, seed, 16);
+ code = kg_encrypt(context, tmpkey, KG_USAGE_SEAL, NULL, zeros, seed, 16);
- krb5_free_keyblock(context, tmpkey);
+ krb5_free_keyblock(context, tmpkey);
- return(code);
+ return(code);
}
diff --git a/src/lib/gssapi/krb5/util_seqnum.c b/src/lib/gssapi/krb5/util_seqnum.c
index ec7da55672..3469e63edd 100644
--- a/src/lib/gssapi/krb5/util_seqnum.c
+++ b/src/lib/gssapi/krb5/util_seqnum.c
@@ -1,7 +1,8 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
- * Copyright2001 by the Massachusetts Institute of Technology.
+ * Copyright2001 by the Massachusetts Institute of Technology.
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -11,7 +12,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -30,76 +31,76 @@
krb5_error_code
kg_make_seq_num(context, key, direction, seqnum, cksum, buf)
- krb5_context context;
- krb5_keyblock *key;
- int direction;
- krb5_ui_4 seqnum;
- unsigned char *cksum;
- unsigned char *buf;
+ krb5_context context;
+ krb5_keyblock *key;
+ int direction;
+ krb5_ui_4 seqnum;
+ unsigned char *cksum;
+ unsigned char *buf;
{
- unsigned char plain[8];
+ unsigned char plain[8];
- plain[4] = direction;
- plain[5] = direction;
- plain[6] = direction;
- plain[7] = direction;
- if (key->enctype == ENCTYPE_ARCFOUR_HMAC ) {
- /* Yes, Microsoft used big-endian sequence number.*/
- plain[0] = (seqnum>>24) & 0xff;
- plain[1] = (seqnum>>16) & 0xff;
- plain[2] = (seqnum>>8) & 0xff;
- plain[3] = seqnum & 0xff;
- return kg_arcfour_docrypt (key, 0,
- cksum, 8,
- &plain[0], 8,
- buf);
-
- }
-
- plain[0] = (unsigned char) (seqnum&0xff);
- plain[1] = (unsigned char) ((seqnum>>8)&0xff);
- plain[2] = (unsigned char) ((seqnum>>16)&0xff);
- plain[3] = (unsigned char) ((seqnum>>24)&0xff);
+ plain[4] = direction;
+ plain[5] = direction;
+ plain[6] = direction;
+ plain[7] = direction;
+ if (key->enctype == ENCTYPE_ARCFOUR_HMAC ) {
+ /* Yes, Microsoft used big-endian sequence number.*/
+ plain[0] = (seqnum>>24) & 0xff;
+ plain[1] = (seqnum>>16) & 0xff;
+ plain[2] = (seqnum>>8) & 0xff;
+ plain[3] = seqnum & 0xff;
+ return kg_arcfour_docrypt (key, 0,
+ cksum, 8,
+ &plain[0], 8,
+ buf);
- return(kg_encrypt(context, key, KG_USAGE_SEQ, cksum, plain, buf, 8));
+ }
+
+ plain[0] = (unsigned char) (seqnum&0xff);
+ plain[1] = (unsigned char) ((seqnum>>8)&0xff);
+ plain[2] = (unsigned char) ((seqnum>>16)&0xff);
+ plain[3] = (unsigned char) ((seqnum>>24)&0xff);
+
+ return(kg_encrypt(context, key, KG_USAGE_SEQ, cksum, plain, buf, 8));
}
krb5_error_code kg_get_seq_num(context, key, cksum, buf, direction, seqnum)
- krb5_context context;
- krb5_keyblock *key;
- unsigned char *cksum;
- unsigned char *buf;
- int *direction;
- krb5_ui_4 *seqnum;
+ krb5_context context;
+ krb5_keyblock *key;
+ unsigned char *cksum;
+ unsigned char *buf;
+ int *direction;
+ krb5_ui_4 *seqnum;
{
- krb5_error_code code;
- unsigned char plain[8];
+ krb5_error_code code;
+ unsigned char plain[8];
- if (key->enctype == ENCTYPE_ARCFOUR_HMAC) {
- code = kg_arcfour_docrypt (key, 0,
- cksum, 8,
- buf, 8,
- plain);
- } else {
- code = kg_decrypt(context, key, KG_USAGE_SEQ, cksum, buf, plain, 8);
- }
- if (code)
- return(code);
+ if (key->enctype == ENCTYPE_ARCFOUR_HMAC) {
+ code = kg_arcfour_docrypt (key, 0,
+ cksum, 8,
+ buf, 8,
+ plain);
+ } else {
+ code = kg_decrypt(context, key, KG_USAGE_SEQ, cksum, buf, plain, 8);
+ }
+ if (code)
+ return(code);
- if ((plain[4] != plain[5]) ||
- (plain[4] != plain[6]) ||
- (plain[4] != plain[7]))
- return((krb5_error_code) KG_BAD_SEQ);
+ if ((plain[4] != plain[5]) ||
+ (plain[4] != plain[6]) ||
+ (plain[4] != plain[7]))
+ return((krb5_error_code) KG_BAD_SEQ);
- *direction = plain[4];
- if (key->enctype == ENCTYPE_ARCFOUR_HMAC) {
- *seqnum = (plain[3]|(plain[2]<<8) | (plain[1]<<16)| (plain[0]<<24));
- } else {
- *seqnum = ((plain[0]) |
- (plain[1]<<8) |
- (plain[2]<<16) |
- (plain[3]<<24));
- }
+ *direction = plain[4];
+ if (key->enctype == ENCTYPE_ARCFOUR_HMAC) {
+ *seqnum = (plain[3]|(plain[2]<<8) | (plain[1]<<16)| (plain[0]<<24));
+ } else {
+ *seqnum = ((plain[0]) |
+ (plain[1]<<8) |
+ (plain[2]<<16) |
+ (plain[3]<<24));
+ }
- return(0);
+ return(0);
}
diff --git a/src/lib/gssapi/krb5/val_cred.c b/src/lib/gssapi/krb5/val_cred.c
index fb0f15c9d3..dd82d5341c 100644
--- a/src/lib/gssapi/krb5/val_cred.c
+++ b/src/lib/gssapi/krb5/val_cred.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1997, 2007 by Massachusetts Institute of Technology
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,7 +21,7 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
#include "gssapiP_krb5.h"
@@ -32,37 +33,37 @@
OM_uint32
krb5_gss_validate_cred_1(OM_uint32 *minor_status, gss_cred_id_t cred_handle,
- krb5_context context)
+ krb5_context context)
{
krb5_gss_cred_id_t cred;
krb5_error_code code;
krb5_principal princ;
if (!kg_validate_cred_id(cred_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_DEFECTIVE_CREDENTIAL);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_CALL_BAD_STRUCTURE|GSS_S_DEFECTIVE_CREDENTIAL);
}
cred = (krb5_gss_cred_id_t) cred_handle;
code = k5_mutex_lock(&cred->lock);
if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
+ *minor_status = code;
+ return GSS_S_FAILURE;
}
if (cred->ccache) {
- if ((code = krb5_cc_get_principal(context, cred->ccache, &princ))) {
- k5_mutex_unlock(&cred->lock);
- *minor_status = code;
- return(GSS_S_DEFECTIVE_CREDENTIAL);
- }
- if (!krb5_principal_compare(context, princ, cred->princ)) {
- k5_mutex_unlock(&cred->lock);
- *minor_status = KG_CCACHE_NOMATCH;
- return(GSS_S_DEFECTIVE_CREDENTIAL);
- }
- (void)krb5_free_principal(context, princ);
+ if ((code = krb5_cc_get_principal(context, cred->ccache, &princ))) {
+ k5_mutex_unlock(&cred->lock);
+ *minor_status = code;
+ return(GSS_S_DEFECTIVE_CREDENTIAL);
+ }
+ if (!krb5_principal_compare(context, princ, cred->princ)) {
+ k5_mutex_unlock(&cred->lock);
+ *minor_status = KG_CCACHE_NOMATCH;
+ return(GSS_S_DEFECTIVE_CREDENTIAL);
+ }
+ (void)krb5_free_principal(context, princ);
}
*minor_status = 0;
return GSS_S_COMPLETE;
@@ -70,8 +71,8 @@ krb5_gss_validate_cred_1(OM_uint32 *minor_status, gss_cred_id_t cred_handle,
OM_uint32
krb5_gss_validate_cred(minor_status, cred_handle)
- OM_uint32 *minor_status;
- gss_cred_id_t cred_handle;
+ OM_uint32 *minor_status;
+ gss_cred_id_t cred_handle;
{
krb5_context context;
krb5_error_code code;
@@ -79,21 +80,17 @@ krb5_gss_validate_cred(minor_status, cred_handle)
code = krb5_gss_init_context(&context);
if (code) {
- *minor_status = code;
- return GSS_S_FAILURE;
+ *minor_status = code;
+ return GSS_S_FAILURE;
}
maj = krb5_gss_validate_cred_1(minor_status, cred_handle, context);
if (maj == 0) {
- krb5_gss_cred_id_t cred = (krb5_gss_cred_id_t) cred_handle;
- k5_mutex_assert_locked(&cred->lock);
- k5_mutex_unlock(&cred->lock);
+ krb5_gss_cred_id_t cred = (krb5_gss_cred_id_t) cred_handle;
+ k5_mutex_assert_locked(&cred->lock);
+ k5_mutex_unlock(&cred->lock);
}
save_error_info(*minor_status, context);
krb5_free_context(context);
return maj;
}
-
-
-
-
diff --git a/src/lib/gssapi/krb5/verify.c b/src/lib/gssapi/krb5/verify.c
index 833697b19e..4906ef38a1 100644
--- a/src/lib/gssapi/krb5/verify.c
+++ b/src/lib/gssapi/krb5/verify.c
@@ -1,6 +1,7 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -10,7 +11,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -28,37 +29,37 @@
OM_uint32
krb5_gss_verify(minor_status, context_handle,
- message_buffer, token_buffer,
- qop_state)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t message_buffer;
- gss_buffer_t token_buffer;
- int *qop_state;
+ message_buffer, token_buffer,
+ qop_state)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t message_buffer;
+ gss_buffer_t token_buffer;
+ int *qop_state;
{
- return(kg_unseal(minor_status, context_handle,
- token_buffer, message_buffer,
- NULL, qop_state, KG_TOK_SIGN_MSG));
+ return(kg_unseal(minor_status, context_handle,
+ token_buffer, message_buffer,
+ NULL, qop_state, KG_TOK_SIGN_MSG));
}
/* V2 interface */
OM_uint32
krb5_gss_verify_mic(minor_status, context_handle,
- message_buffer, token_buffer,
- qop_state)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- gss_buffer_t message_buffer;
- gss_buffer_t token_buffer;
- gss_qop_t *qop_state;
+ message_buffer, token_buffer,
+ qop_state)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ gss_buffer_t message_buffer;
+ gss_buffer_t token_buffer;
+ gss_qop_t *qop_state;
{
- OM_uint32 rstat;
- int qstate;
+ OM_uint32 rstat;
+ int qstate;
rstat = kg_unseal(minor_status, context_handle,
- token_buffer, message_buffer,
- NULL, &qstate, KG_TOK_MIC_MSG);
+ token_buffer, message_buffer,
+ NULL, &qstate, KG_TOK_MIC_MSG);
if (!rstat && qop_state)
- *qop_state = (gss_qop_t) qstate;
+ *qop_state = (gss_qop_t) qstate;
return(rstat);
}
diff --git a/src/lib/gssapi/krb5/wrap_size_limit.c b/src/lib/gssapi/krb5/wrap_size_limit.c
index b875a965a0..f240047103 100644
--- a/src/lib/gssapi/krb5/wrap_size_limit.c
+++ b/src/lib/gssapi/krb5/wrap_size_limit.c
@@ -1,3 +1,4 @@
+/* -*- mode: c; indent-tabs-mode: nil -*- */
/*
* Copyright 2000 by the Massachusetts Institute of Technology.
* All Rights Reserved.
@@ -6,7 +7,7 @@
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -20,11 +21,11 @@
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
*/
/*
* Copyright 1993 by OpenVision Technologies, Inc.
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appears in all copies and
@@ -34,7 +35,7 @@
* without specific, written prior permission. OpenVision makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
- *
+ *
* OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -46,14 +47,14 @@
/*
* Copyright (C) 1998 by the FundsXpress, INC.
- *
+ *
* All rights reserved.
- *
+ *
* Export of this software from the United States of America may require
* a specific license from the United States Government. It is the
* responsibility of any person or organization contemplating export to
* obtain such a license before exporting.
- *
+ *
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
@@ -64,7 +65,7 @@
* permission. FundsXpress makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
- *
+ *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -75,69 +76,69 @@
/* V2 interface */
OM_uint32
krb5_gss_wrap_size_limit(minor_status, context_handle, conf_req_flag,
- qop_req, req_output_size, max_input_size)
- OM_uint32 *minor_status;
- gss_ctx_id_t context_handle;
- int conf_req_flag;
- gss_qop_t qop_req;
- OM_uint32 req_output_size;
- OM_uint32 *max_input_size;
+ qop_req, req_output_size, max_input_size)
+ OM_uint32 *minor_status;
+ gss_ctx_id_t context_handle;
+ int conf_req_flag;
+ gss_qop_t qop_req;
+ OM_uint32 req_output_size;
+ OM_uint32 *max_input_size;
{
- krb5_gss_ctx_id_rec *ctx;
- OM_uint32 data_size, conflen;
- OM_uint32 ohlen;
- int overhead;
+ krb5_gss_ctx_id_rec *ctx;
+ OM_uint32 data_size, conflen;
+ OM_uint32 ohlen;
+ int overhead;
/* only default qop is allowed */
if (qop_req != GSS_C_QOP_DEFAULT) {
- *minor_status = (OM_uint32) G_UNKNOWN_QOP;
- return(GSS_S_FAILURE);
+ *minor_status = (OM_uint32) G_UNKNOWN_QOP;
+ return(GSS_S_FAILURE);
}
-
+
/* validate the context handle */
if (! kg_validate_ctx_id(context_handle)) {
- *minor_status = (OM_uint32) G_VALIDATE_FAILED;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = (OM_uint32) G_VALIDATE_FAILED;
+ return(GSS_S_NO_CONTEXT);
}
-
+
ctx = (krb5_gss_ctx_id_rec *) context_handle;
if (! ctx->established) {
- *minor_status = KG_CTX_INCOMPLETE;
- return(GSS_S_NO_CONTEXT);
+ *minor_status = KG_CTX_INCOMPLETE;
+ return(GSS_S_NO_CONTEXT);
}
if (ctx->proto == 1) {
- /* No pseudo-ASN.1 wrapper overhead, so no sequence length and
- OID. */
- OM_uint32 sz = req_output_size;
- /* Token header: 16 octets. */
- if (conf_req_flag) {
- while (sz > 0 && krb5_encrypt_size(sz, ctx->enc->enctype) + 16 > req_output_size)
- sz--;
- /* Allow for encrypted copy of header. */
- if (sz > 16)
- sz -= 16;
- else
- sz = 0;
+ /* No pseudo-ASN.1 wrapper overhead, so no sequence length and
+ OID. */
+ OM_uint32 sz = req_output_size;
+ /* Token header: 16 octets. */
+ if (conf_req_flag) {
+ while (sz > 0 && krb5_encrypt_size(sz, ctx->enc->enctype) + 16 > req_output_size)
+ sz--;
+ /* Allow for encrypted copy of header. */
+ if (sz > 16)
+ sz -= 16;
+ else
+ sz = 0;
#ifdef CFX_EXERCISE
- /* Allow for EC padding. In the MIT implementation, only
- added while testing. */
- if (sz > 65535)
- sz -= 65535;
- else
- sz = 0;
+ /* Allow for EC padding. In the MIT implementation, only
+ added while testing. */
+ if (sz > 65535)
+ sz -= 65535;
+ else
+ sz = 0;
#endif
- } else {
- /* Allow for token header and checksum. */
- if (sz < 16 + ctx->cksum_size)
- sz = 0;
- else
- sz -= (16 + ctx->cksum_size);
- }
+ } else {
+ /* Allow for token header and checksum. */
+ if (sz < 16 + ctx->cksum_size)
+ sz = 0;
+ else
+ sz -= (16 + ctx->cksum_size);
+ }
- *max_input_size = sz;
- *minor_status = 0;
- return GSS_S_COMPLETE;
+ *max_input_size = sz;
+ *minor_status = 0;
+ return GSS_S_COMPLETE;
}
/* Calculate the token size and subtract that from the output size */
@@ -146,17 +147,17 @@ krb5_gss_wrap_size_limit(minor_status, context_handle, conf_req_flag,
conflen = kg_confounder_size(ctx->k5_context, ctx->enc);
data_size = (conflen + data_size + 8) & (~(OM_uint32)7);
ohlen = g_token_size(ctx->mech_used,
- (unsigned int) (data_size + ctx->cksum_size + 14))
- - req_output_size;
+ (unsigned int) (data_size + ctx->cksum_size + 14))
+ - req_output_size;
if (ohlen+overhead < req_output_size)
- /*
- * Cannot have trailer length that will cause us to pad over our
- * length.
- */
- *max_input_size = (req_output_size - ohlen - overhead) & (~(OM_uint32)7);
+ /*
+ * Cannot have trailer length that will cause us to pad over our
+ * length.
+ */
+ *max_input_size = (req_output_size - ohlen - overhead) & (~(OM_uint32)7);
else
- *max_input_size = 0;
+ *max_input_size = 0;
*minor_status = 0;
return(GSS_S_COMPLETE);
 G$xe$ 2B}[ veo" Bzx5y IW{r舜Q]Rl\.s6GUxl 62x + p0/N v%):xg9e9(̐E:ivG]fSЪuW mPJ3Ds!'Т]3gϭsC<ʸ̴@RnAwӾ )Zj(,𜉅/ E9ӛF޵A|[>h*u&5stdұbGpX}D* kr>tQBTKm3=| Ho\N6Ϸp>ܠp!dW-5eCweydПpHQɞ`uuM MWSjϱ65~iKD>;E߃ IEJ/ hk{_E=#`g %oks+ɄӮ^c˳c9ԵFȨH x^1o֊xZdbYk$Oydtr&S`4(^h |[3e"bǿ̪=h%5?9Ӷ{ UoEߔϢ;z]8JT/fCty' 3s%Xox(,Y!֝ѐonK#BrHMA4G3]yD1RSgh> Qka[̰[#H,pVmms 38`:gѿd?C2*B5$ h;/DCTrdqӶ"e O%Jxu00҇ Z>.R ݓank"n=T,aI=c&RoݚǁvS!0toTnZmii/n;#39UtU^JCȻ!_?4\x.ȹw7c9] 5v[&)gڪiR۔SaLP6ȉnJ*N?\nwl`m~8]u T1o4nH!:SnGf_]F>ϽbWﳏT@v yTd"3_e>~.K VS”$ dF?4ÆȗU>d~,:8 Y [z]xt4%6^5܃ңbiq2t[ J_H--$:Ah+L\k| i|qb X7,d d!R3ދ4HJ$<_/˶qhVcw{̀D褠6>"qS'Xd޹‹6hJ @`iAMw a/,J {Nr!zC+.y@ l[둭׳hؔN"'fu"{=;# e$/!j&4wC_\OeM P' ]g28Jvgn=UdS9+j&od_ίE+?N$~}Xy 7q*0 HJ&'wjk-Xf%/8S[DHVLƗ3AJ.&q[lКSo4(3դ\b%q3?o6ЛUJ>/"OyM|L\zw\)ɱM1<g(o,2Q%:F vDEc818iΑ/h}0̓\W~- y{#lȁLj0qxY%^(Cf_J3S}L^L{}SEj[mT`ؽ݊Jl󩬠7#  C[<4 -gMzM{[`q!Y!XyEMLLQyv ? yChIK]Jq&8L*6pIfJs tvqy-n=4}8^$3MXoRՉd|j$/Z7a-K#IF@ʢ)**/v6 r›S:s0磙%Z4^:,h2Bɗ )QWw [U*u{2GM>^gs](9fB/)>3_u48v7]H&er 6ߊYgDdJ+Ŗ<$6WqH$ dѲw%cw P;O vuR=--pt6h}D&RTd DLֽ^<[5hrO>}U=TAd]L?f ttyRqwF`̌;EL`C{[o7-Lsx)? =VS-M7M7qn8=|x߃q#ÊB5bZ{QrM@gz3b;|r4hZFV>i/o&Y O]ZCߌX^%A7{5UNsƃg= quD!|>PʲY7ƋQJ~Ҕ cȔ{" ^(+X:rDV&X߱5W L59iݒyH΋^iht_gh3۱]ؚ][4>49 u7ގ@~cN.]YNBvqIebEW7fYqxD4`j-I>Όni8J փ3SG|cb?[W-JPzS=n-4f)Qhp;q<1ؾv05JIT1B^d)hu(P^biZ1df3~vu/|HK]|V_#5) / D9[ܭeS@='mlVaWSZCzYN$sC'+e\KPr=m/P4~5&uD1ܳ>oP%Y`.a>ިG$H`?x#0`yۭZzN`VwOR?#mz,tmha&lޑf`66:bf${h\cE|!`XZii_%Y%zqK-p*Q2 ē1&};t-'pP9<8|!`"p!KLP7 ެ2]6آEwzFQ.b^lo}=9,(*n?ڛ7K)Ӻ ܧ;>85|BQicu9^5)-+s=Sh;[ZlO H2Yhw>nH9bOGDNYe>^l`gCzLBwӍLY|?"%T"HY]/mr%)Vԁ3xIB_a6@A3ycLA8c(?rn<ȕY C}bH:QsLSVbpRv~.atMG);M H XOs$@p, i{iS|*3 * 7]A[Ak ߽P' [!~Y-' +Rbqa*`t42ik_2̳ x WsyN+^n ,>A\TmIT2̍^[V{ Qu;oR_ F@U[!\Dz^%^ְx7ު.;A ١#9r ŐT:E-8rсAͥI?.m˭z1Ufᩆ\kW BZhqkqJO0լa/!G3ɢ4 Ǿ{,0jvnNbؽA,Dȗ9Ke^kY ݑ?L&i3U P,J_vS/iM?8"-u(M&-VOi8g 96I$8[%0Ŋsc/ + R#nwΘk#fէ#vq^6L7"y9hnbbOY[9awr,^u|=諔26# kNA A5yqA݃nh2A.tk#OYxws x4R.Jj s嘋\Y=O:](HjIwlK"<\g Q"N !?]nqt^lVh.St6'ԚeN$YFDV;4 |r5?o*s|U"goG\e]–$~[]ut_W+LHŸ]oGnD]Wў-u<<1d=&x^YԠh:oV c(ڱ_V*R-lL4$7qgEK DgޗR,J9*V_  ^zws͟ ꍗ>%T6b|,]"Gx u ^sn % {0o @qq!_y|m}bsOOL^Ԧf"+\t :ʜ[F>6mS5L,;ǒ֥,ŵLd$oFRy\AQ8S8)/wܵeRKO+v5O_f%Eg0kF:8?^#-iq-e,6v i2yDt$#?3@^ƙ$nouVȆԘڔpJ׵w2Ho1ENw@c#K3V }8вt$tuJMyoJ]N;B LkЩ{M4%xsQ"2b(ח|KXT1Ǿ`8vD0gv*-/5Q-8.P\~11?smT3y5촳qكHSakJDyHNda.;/_GEsPɩ39qQ@s&Erz:?NAέ`2o>¿G45pL|40z| i%\F895fOZ+#DK40|vT&'ʡ~!F}m BCY\) 7R3h,䂑v⭝B:Rx6p"(*h黁@2- w.KusI g jeTㅀƕ&g0Qi{1=GwnyHZ)j8,o4Do>*5؅7ZTǿ҂"gޡW=>CeҎ;I;YfTl@Uq}Ts(],9c=ʖuC/}9t$@)u/evVBliC0ϬnPc~V,,anchlٍmټ)vsQ^qA{AYT,2=$a•MʹaD8~uP!Q}Dǵy޶_AjZu/t0%4;7n&=HAcf*%GHo*^%P?M[Q&:V]C;B| ,Y`ӛ8(TI|@O|@lPxOݪ8̟0 NS=Jn=}V5"1#1.:P~:Q±[V{Q޻1h ՟2>R"[p/YJٓJV c 6[]AՄ)1笲XR>͝6𫊙M{ ÍT]tu.HVS@paq]QHANOߌGݭq(44^V1`#"v ԋCz#Ztl1yE+Ys Wf+{7]&Mh /6ne'nprD2dh&R߁i\ V\Nf}UJI+ "($/bRY+G&L%Q$]X2}OqV:LVقM@d /\0R|Ix\!cJj0zU3AdH2zDž &REKW67B*d@ 476/$wv*,Vs4_iPN*d=eB@4uS8ګtŘ5&w"KVB-hf7Sx+Mg?RvRpaǩp9` Z9ȳ}%nu] :m#>fx\%}s߿Y:* ƚcs͓+@ö#sxrHG 5qΒ/!sevD@_v:|dX 9$_Aq^OE%Y;?PV;-"Ǧj 1͛=jU8.x!w _MPsDR^L3F)!%)9ϣ}|({r>yuađ ѐeK}1%uU-9qpnpbkJ4L<1$?OO\˦嵂f3a4%X!$3sqw4;ޝ<+P pK] [XbesDW,vɜmc'ti,%R9E+FRJL1CPj'#Qk) jڎ*0rČj-=Y\DuϪ|$!=3#?o 93ɓ9$n~W{ձ: lI7 :.Z/HlX_ (ꕚպ!-J#Qo1ū}zndB*=R*F`)chQ04h$Hک|L3(9ICmɟ7cyXV'hbA=CᵡAU2AU l\ 2S ] J7h*aӜ"^#;mB.ܿE'"{Twjduҭ>}&Եw0{7?L],;EC/]<"jm?zǤ xV $ Ҭ3@ŷM7nWAmL8/d}"5rn aABȍѤRMt?oHdJbԼ$}ۼGq#A|)Nِ 2JiA2x}A88'74:ζb'X{{7+ G4~un# .L0WJHH=i c @c,P3=4taV:3T2ʌ]FT z%3duq&fI6>k#]!pQ~欎aQthdknՁ``9o]VeYz26pe>/*L#X,cLeۋr( wlqOGUMλ;-'k֬撯'MJ D ukC?ࢰWP?=_do<[NTE$7ۏ@MȭIhۙ;lOҀVx5řQBSN7be#!͝τEǬWm*p^0P3MYԖ=|- EG`_IC8}( DEB""ӑ76n}ؤi?K0~B#㭻\,V 9g2#3o-X&Xd do'|+xH|*J-TBP4 Ql_LUji}w.bb ӱsS34YPa<4v0PlG%g>D Z($7tHSRRǦtO-JnʈDbUYH]*:-x &7XbĻ :Gh ͣsL5=gQi$ O= too!BnmQ)";PXyU< ]K[&Rю9AW0rpAv+㢪'. 'n05 @9C,cq-=d%`@V;y ϛ r O|G]ZR<ijC_^YOHB'1. (vEQH(lVb}1L|#H;i! w=|Q\`L }+sc /bȝ݆K+.Q4G]Exβ*4!7Ģ}2y [L>u™*B{f6@jjDEM8ZOeU [5aA^xmuM^,0 QG)}PG>Nf9Qe+H_p]sx@=?73Iԯg`F& q7-Dƶީ@R'L TEώzdw"k&Bb^()BJ1Rgwb/ZQpQ)IEqj2rq@ }J'8J$:OFJr7e8ZӺp Yzz"tM+YVi<;dHlb#0jq y 59}גZ&0Q/m.MѾgԕY?-|բʂ|,榐kRDi{OV A@bظ@ufip&Q[JB)G⍷vF  } !z!C92$wk$6~+닓DG(`Qռ W;!N̹ wvpi HMUZTG:estxgT3"hÙ#)sh7])lFmkSv,А~i nIg4{_@SƳ|R?XRNL#-/]C@$ wXdFBqxuq1(nIDBmϧXl^GdLX5jD&{ P9P:C䍐)f&~oj4ωO6 1cW7>;):;8#"%(rt.,-as>#|DK-f[mYwzkU9^&;VvQ(Un;^m-y&O/Q + 5M>نDRJdqHRrEddBmJ6[nxѣnLg} `q(23:C%3`ȤI:|O=e3HCh9c/i(.nK:&- ߠfmMQgl Ո' vˑd lp2& 6Y7 c٬xกgMzy) 6Ao.7WG:YI_'qcM:iq5˽<]~74 xnd}W+d[%+V_64&xG !#TapwoГhrYVl'.+_Z%j.o:PEqi/kCN7D!ETd9@Q3ۯo쌛e.d%/$ fV\GO^p%HEI^fK]m,&nuglw&(4oF )d=|V6:0kA퓿sx(hp*hUv霯Df/U'nbmx2֝n~0`Lԣ]GZu0\YճXnsW9saT[ì=/>*#fT;ER_TqMɌgNǨݰX#č*25ǷOVKzHgp.[W^ | Ml&vv#vuN^:3ZF,"˷e:)AE9osobfZT1Kpw4En=siZC)YpqeNJgs T,]{8M0 =AYLy lt`#]gRa*)t*9vL?#6-ŅpQgA/M~iQ3;ng J#E(L_d.SW@­pK׫E3c?jc`arœp7d=+|My]K6'UkKDP+·<Z?h;3X )TƧ1"bEpEw5tyBp:$Rp=̱ ^"=N3K.gۨԥWh !O7#kƟ¾HEoyN6eps3%.OxKagJaN)e0T&4Gϱ)89:vӨ+ddSҜQ#\pǢ'0Z*߱t iG .W y_S+\U{ś=:d|P>~i g\p7F=Ɛs9/6?5mg(%9V>/pAh 5{/9EWr~NjTh۠LGDr`jY'MdB~Y9 oNwsR9Aփ@duΕif ^++YrU\TW%9f(%Y#ɹhsXD=igz PtGNMiʝ z]6eq^ O^+]6rX}ڻ" )ڷow#W5ab dt713ڳՆ:'3_* yF_9Icʯ/LP8i PBn)M8/,W/*ꆗwɫ7CV>ky?qeVH [v)h&..gJm%-oQUH]3ݹ@Ge1*]ŅQ,uVJ?66GL7H( 3{w<ӉsRݔdA9`.c$ohr֠bj4&*z^V_ bd @?WXz(YenA6[#z>Q`\ S c v@z2p|Q4{2.o< Y)u='62E+D#/42R@+ _׏7] 0C$w +㋻Ot̟-jhj<[ZH6Z$#bf$KP=ahAw/Lң7WBx8pzk&ۮ XG`ū˸lJVP?.7ļՏ{cKl)~OߗS A){Vxj.@9ť%g3WLj^sYsP;\?_֗F!7ͿHۈ{>} VgqD _fr[-bkJm$fO:EΫZ|cIK;zLq5*.8'TTEųD}  4yܱ B,ӼTwSEj0w $X͹.S"J1 GlKT!UWe^`h5G9: s 魳+JT lve`B+CaI+Jhe}G4Jp%(t"6 Dby\H;rs` on0`cwaG d8!%!e޿m9 9l|ZcRF; ; ƀ!<ȟIH([=Eg.+o40\[v>l.lcȟ-'[M@0\q*b*oy2prA֠X9߇rmFEy:?B _V2@0 ;L[|ڷM`Ќl 4OkqPd`faw}5o n! :1PU`n;sSwa6]q"2uokI}Eh}jH>%xF>We⹐sۤO˔{)a\f?Ѳ?-&GVlAs ,ܪ+NonO {l=bMu ¥x$>2"icqvUb}{%𘥢ƿo(pp.vݏ6LjO@?Aeڛh_ C1]qS@ع$ fҴMHKյ~<]>fd/+zЛ$˔ 8yq@tb¥݈4fxy'ggZDBhwu-LeIO+i-P%_4}?u2_ޕ8(j5G\??B$6 Kmn})sCnxׯ:o=Kk$>\17k,!NSgFIv/nvb 馴0V%D]goܜ-(8΍Ks+R M3\)6Xgnrro >=Hq/]Z/Jt+ B 棅T3 /38cˡ>V" 3q=~c$Dv0D]O6>(嶈9"AZє5wB|2[PU1DbHB39uI)#&¨{alM>&O&"a6`U˾yy.!O*{Xr&lRm4i'e ?T^t u6JWհR93XYv76_vܑښ}_̭w}» gEF'D>o_H|/qf;s`!H M_wr[?PStEKXSד%]椹1]` $$訹̳Q5OO7ksZ.ئؘu|8 c:0&̠n썣nk]cst'!>yVC[-j+?&{mtK/}uyb(rw)[@q9} `h0ͨ$2\%!Bu7%<K!ft!7;M)lE(:uFd~ j`1+U@/MΠeR&AWV`Fꖭ3v-j^^zIzi9$!, Vc/׺p Dž@Gf5hNb*gۆ-&Z9Ί,%/dS"%se%hcF˹|/3\πm2QDҶn ×4K I0N/'>H0A7H g]N`)S7g?1>3|F~/YJȔ,lbW@:u-aJG>0Iˌ5:4=C}ɟZi6Q FjUmR[ P5%=  9g3& e[p&Z yۏZyzlM$n,iLbYCDL^tƾy!SCٔ0$5[oFrCu,Iw Yug)haƋ߲ɋm(Gzh_G!<텵ru*p)ff6(=6P-b f1#湺~#.6E=6C?ăM@)#k4˱z}Hy#~(XY$KzM=,!O:Z`VsC2 ؓvOHAbJM#2ZKwR8߃uHTSbX$p!h!n@c]ETz?fAϿ)8g;Τ&Pi Sic,ݿm±doϢ,K *]ؕ|GC=Jb iJSWOo`{VD~<6T^6:))܏㿼? ХAq?<+ػ\,sM_:t1 XnfwS.GNbz1fp^|2h"1sZVzw4\ʺ_ߦx%@vm=z_ fIw \K7jG/'=sh>֤Rt"/U7t(n'fuW5y%v onVI3vǖ A:\^*[([{KUو2BC灐/+}J_l$b&6+(p)_=sƾM(9FRIU6dKhB,6}4~:"RuXC-YzNpO6*ֵ^Հrܘ89'&b#ڢRFa 6J Hnp-s!W?G]Cw;MpCE@R'Vǟݮi2N7U̼5~ q$޼-_.2CȭVwVOŵA}
F?C'j~SwRa׋:MÌ5%4.yW#hWZ 89rx"ር( d P55 +_ 4|XbG\pkGR4 j$w*1|gnDžxK.\_{9JU^$÷Gj)2B5QG+,6uәyޗ+7)꿎!2k#W ی8&F=2σC n{{%޳=dCW?B{ۊ 6|R C/\uGFl1`)>qPfu6(BU]oQuyoc{D÷ڱG&JZ?}$(GCqkEb+dI EFEn.wT"(3 @2bNβxPxf3| pX I1C-PK~tv>zؙT\#] Xbէ B1 rgZ:$wmR)+}ʀ_ ~~ޓ>8  ^A㫯)==4;^ $@Rl.`M;>Rpi\P͗޶uP:y*b-@ bR1(>(w8!YqɆQtX?/3쿰@VY HpI9mm]$#e|M4'5ܜ0G*X>]ʪ_U%&"7rޣ~2]s> V\` 4n[I%􍨍GxS`Mzc&hhlrDt- '}Tc=£_VXyL_4گvFCJk (JEM iHaMchvp9:4T ʓ4I~EGɦQ`4^"H6Ao{_4u:QJOutn Ŵ.ݩ7~}|oswpЮzP[X{<'-NxlPI@%X&_C?m|!l]72o-\\'fIFJMO.uaOݦ9!x6s|Ǎq:R=12h8M7)a@s ҧyQC֨IJ1`0blP NwJ}tZb%COmo+߯GQ2zڮoDhx Y^eƐz9Y }aV&Z0Ʊc5s\R Ծ9==~aNv|eB!g}@>a!н] *?6`ODyӳկy^ޯ8~ MBHztYdNxx+Scx?Yב}!҈bdfسۋƮߨݣ8eID,WaZ4"6Q5zzmogj?'ԩqrχ 4:7ڃ&ݻ`LEtl1Y |I]X[EO7~4`^WRI|`k({lr8Mj6>4YnT"7qc*[wC,f˷fc8ϩjW$cVlÖdwl=d2/HƭmЩ͐f&N=Fƺ/gMZW)yxOw>5#l%#y<;h (we-IzJ  o|L!˲_g&RﰻE'|-435/y1`S+rIfPnv1uƾd2.K}h N]yrc5X4 Bgtr_7)?:mg[lH( yBYRQb<兝nRH {sGϓܖ=O<25DedY[ "1Ƨ6^ԽEXH"6@mGfPV5 !+kL GFpw[S?{QV[T/؉Uri*Vᙴ`{¦ͨA$?,@:p &U|<;LyG*~_JlQKg/N:bPoJbs`⹀⛸5u̩X.[n>\aDuhOJatIXV!FQ7JWjDZhEA`Z/۹bBJ~8 ,9dvl4-R,%*p ku5ԩxdd 0=E˻Aٸ'њ`25ì([nEd4˥UTFl~5&L�[/ :@`:;ptИ]ܮ.")8pCu3j\[}-QCQ|eR,OKXڢޚ YH %8ȺK 'u*D\z&^gK@[,1bڒ--UE/mͼAs_d@w<~xOKXsQ8Ac6Nb* nKB*Yn+fP]{)ϷN _;>ZuB:|%uN׉]QSDA揯cn(}r}]o2Sw커q▬mN>,5B2!S c2 #@|೷_miF{+O Z|[~j1V'#\1]Fq .^Jn݃fy2tmq%b+WZƀs.U4;4uq|Tu0+ "CصfJV/*0I9D2}[uk"`DZT8-Jv @z33sxʛZ3h腉J"К͠\BYŸ>XS8aNF=(7Uo7n3&pK3+-~9YHn;Z2'AqGXLz"A6=i> ?49iGT z>j mT9JĶ M]$Yֈe.铬>eAs'{F`Y4~e3N.ٜF,s>/85:xT> VXn雑~| ŅAdgV(liel|H\ 74Ή@Ot9 [3{ AmAIME]{Y^.aEPH~/#|! Gzw̖26e>+1+3](PAS:jx3IXM$E CĚRI7}ctK({E"a&?Vjn9aFM!gn +:Q>ABP\*u2c q U!L\Zf wyO$I _PG0.=sy*Ia(w8~ڄvf- etRFF- ?z)Q.S&1E-<ٮ05Pn!;(ᓭ’S` ajk 'PUL"7>G;Gi /&v0qm!g50KX"6;䇺8^42_cKqe)L˕?Ŵw?>o|/N^B#݆*]jI9\sWoNq@DxP>|WmRP@KnuIH}gXy֌ǔR`C%*Ӝ"V1[+v%WȻ?3? 'j\?Ygnliq% bҟH'rSȹ_SN9^<рtTӁ+C8[ӏbe %> 0h4ɤF%I=~Z mda3gEUߊGإ [+ɦ(Qf,a})f=+B<*<,Ο˂'|Xv9'7?=0%]dDK=n~YroFA%6Om;'ٯ챤DhcY2,W^,ư+(ᦑRFeWꊭn#v od~R@lxEZOȰ sA$<"ߪdC"b#pkÛ&c}!4]nO S?%FZd\Mt"]*]hF#^6GB.^ w7#P'f /2Ezq]Ŗl,|]܄p/}!Z,~Aɞ!Qd,De 5LfKZ0% q/:BµO/ϣ:߸-;KstƆb qlrTc N̻K"/aW<>ObQmslfZd yRy(ʉ#_cfu*bi04-W1+`#읝# LIe#%6ԉ'CJDl?^.T7^;@@ᔘ$VAK;Su0,lܗحE@PA\ׄ镁>TpqWRn9"ߓux*T)^zdY#|Mv6&tC"Urf':o??vyXAst8 ptG1Se r;bNÔ /$]}C9dY쓣$\)SL*`V:> Q [:!g@Mըk~7-60\: ˡ _¿Y c};o7b*ױ;&/P? f |BRt޳#=oF[g?v-^G MR58T*j:V(ńBpQgl/8cXفDl/~ O*fAe3FĝC}%jP8i'A/'h638oC?vZEDJi[3PQvA>s:3$1~2h#؀4EkPf}AHbQ.X3
37 0=ЋDČVǮx[ PNOY udJbDFpP46}QzcɿA5|7ϴT(DK[q~W{~ܞh|eW#ep%x{+ߐ.XGd)gx\Mw3ـ5)X~6u'D*XPT=u Mu N~?C\1'"рZ]. % xO G:^Nؑ)Nߪ`+ ڎ%^[AX= ֈ,,Y lTLzӰs`m8jP&k?V ӭ.~~PY}JX5jd >fPi^6Sh@^Q3[j OkRg) ϤEZ:#44 y"u.xUA@:Dbf\&5Wt yzK!\QԮ6X*WLcs?/;yL-5IԸ#AuԲN;4w׊*lLi(2o!kxLQ;AℲZz+h.QmC|FLSѻ-+ +^g VzD4.su^Cq "6\35$VRy-NYŗ-wX1LG+%3DGxgyoxfA!VrT"$\Et ]sԻzg{a<_?W#/D)h0SZ2Έ#aLdjŌ7eM["# 5nG6/KiKa/, Uk3r; Mrk !4ETvZQ N?d쿩Ш:ԮFT}=d^hD"cKk@o*< 6Lmı$]Q( WO=9}lbSb^`9lm}i*O uD=uHlzCچ]Tb30H|ΕڡsK> HEp(٘-zx,%֏t!X c`5E#gQ[yX.~#;,Z|]աUF&ɗj WO!W+4her=N(Ҽ FGDɈv9Wk~v@#}FRfb jl^B%:;JcKX1#oeiw 4%ᅫQǧ栒4cDuGj0|  dPTѴFC&e `s+-^DKFM_&d(wG2LxZ{QeUNlZy0U# }$4M9rY$T4 OL+okjc| ڐ;i0X'n 2f rs j.Fp-ӿg,߹wS̑3g= e jHK9K=}T%L:W$E GyuuΫ710x|Phbj0o^k&~/&9Xﵭf]vdW]ZRq,B+'!kc5* -Y{Kk>xU)qS䫰p5; AJ p5 mm܈R2?#AK(_GUjN 2X)x, Q-LP(r{-)j@ }_xýK$f0M(ݑ?1b\!Ef% v;YՌ/*{OɸխJPf0~fҮn<&M,78p~2f7[mU%}ւ8fѿXM7J&Obڦ5ePٱn;[Vӵ/t{JWp sc]DGV8GRPWExb̡S.!~k*ܯ/ }7/ϼ^L{-3jsBL 6ē'93i=Sziāü,X GqN6wȮN:hќ'QD6<VgQáE]'#4/P<2 G9ZջPlES.byKxn;J-tmR]a7@D^MgQGt ⲫsԴѨG+*{Ji>O+GncoFH`xh , KF$Z% |rl^ ݌YKѧg""k|: #%/ ۬hqxJMD" -& 9;tcë w.wA4>hu iۄyw - )xj=j"h7V3@xw(1ӝ%,8J'Y#|KJ/p}:j,r Ī;:̇[umz2>-|>n鮷(kx]a"r"=HV5Ê{C= tc*ʰ$"SY((JeBP!3c]!7Ri!nn- n.Ka"ON._u!.j0N&1ؘYCC]BbE=Я:,tr`{m+qqY,Ӷnpyt vcdzK1tuj3Mɖ%NJ{mڵom[9haN7隷BL: c:Zݍ/c ,#֮6[71G0T3ԞM˵A٫ E_}Dy96goRMP'7`-q ڕRQsFY*u4ȁdZ7`qUN'/5MLox!Md~6GfT{/@{aMMVx;buF0 f (N;3y۷;Uی _^vb=i'",1g U523({Lo-pJC$ A8}`D^e;=$"DCsFd4Ax5|5m߂DKzp{=@D9},^ k%6ӕ|a>Pb?yСVD:$2-:C įc^+EssGh^ԁAc~{yP3KjAWAWEр[1>j >| Hʄ-5Yu\ 糨<|+cN1`uӿ!&#~$􇴬^`.nJBݶݑ8:eNP}_|R`vRnn 7تJ^yIhAT1+5Gf tX/q-FۉϹ?L y+1R2<76O?]=prNLhxz#lպɪH%O!y1)xOյ/ P%q7 !GՎﶠ9i#SڃpI"޳p(1}y ?AVA\>Wv˪NJآנDsT&~Yςh8žWG}ʸ}K ŻPs} s$v<~p^0**,NڵiKUx 2hs!0կ y4>S38Z_AXFϗʥa9{u{WLA"㼼pI&)dvGaF\E#a p]sgs>Zőg.t&y,^r|3w&3"[ZcQ}lɬvG`C9qM-v 21"^Jx3 Ё _"!Ɵ횀ۂm$Pp-.-A|_+-a0ٶ_ $9kA4-C>Z'X`{TrẠ8E]u[,y8 L> gh?ZAM#p~|!:U87I3 C"Ky Tzqw?+\{9&fdT#8N/Y*tÑe]AbIrGɉ24<(F6Ґx$w$Y?bPV6&’w.4T.Yk% |lgV^,=Lb֩&.Gqe-|HlSv$=Bw:U22.#}ݻ$C,siU{]{f1>!bdg!+ f+ $f`nd5xڎw ¯4/R*(E&ƺweM1 Ez$MqCԝb.F@rP$ⳋv׹"y2Hv׻㯹;1* Wm;0/,{Zou:&uh9fMnOU~*vNfmO!9U31̀mi)24tT3ĵ@\/j.MsW6Mfޥ0,w}غ0c9mmKߜO*-CV]FS[̓(;o=뾛DVnzWr<W)d.5Lmq zdjJqçI ^濗;ZN#xv'lv+):oqÝ XPRׁBUdA͵X{hեt6@_fl>8{Dv+6:*bx{>!aADIm/CE{,VdsI=-h p7iQ+sPp&>pD[=[+-v5? /T~ >w5~ikL}qmN[ˆuwy֠5߈ rZ Ĺg\M{F@I$ﯛ?ɒ-ai2 Q(W/q‰aRT ;uTIhH-djY!cgRbg0 c2B,() d;e ) $P\:w=Wr ^՛{J_¤͕ G䆦wvӊ5)pZ=Z{Eͼ{t [VȧbSy- urMY )Kji6̟(%%nd FiG80Rjʒ"}%Ch)ʹC@G}^P%dV!&T6kr4dvZb-(< c.6_43*C(rrj楞㴲WcC<Wu/H?#V"hce\q\u ŌI(XGY*= K,ǩ8Y䟍dϷ('zS5̜%P'FfQ]P4#hh {>yt~ T=yuY @jntٍ51m6AnBiLO1zoϘ`9sg;+Y ϗ J#RUvW!7,\%YG@d+bsIB!XNvQG>g/=CK'I)%D`39 NqX*f g+8}N)"x$zCF:wKJ"p *f~/D(=o'iD 嘪%QN(draU`{vZ ѐ{kÿ@3$1pV"4(7Ќʇ^aX-C]߬aKꮶ.VWc"^DktVJ圞3iـt2o|6am7v&$e6bri+\'$ЛαSKTn{8<~G #$F? ;z_Ⱦ#rTpPfێEߵYvh{9gjS@)nh$뉆d#'j ][PHTYHz<Օ( A(%e QI q؉ uH-IgbJ n43]3~C+lČMmڬȽUxKlm(W"b:s1cD3cP:K5'x3b=׺*Rĸpé^'@@.oN3U /;5bC#`jY}y9.|V3$٣V@_U?Od`kI/(;&(a ޻c;WJѷt?aЁc?ƎIa7vjDk] GJe![.7K"#:go41wÃx!ZKd0%=T7-yy~4S™;mD˂KXt4;L= ]Ssnr#FQ}B]50I(X3Jg[7 z޶];&AYQT6NeK|2f'mb4+mtĔd~U+3X ywUP @"-0B.s2X3y=dpA&qR_Po-ͼl3DD OpgIwm&L7׸"k񼳔pMlړ`,(-ۋX/zךF/K}&85 vJ];^f -0RLy.y0WbԯSaIrpxQ$f 9X%V-\@$xff'o$LE0tR`=R'LYg%#;+%-o R|vsA8Q&ПtkV]%>c: 8 W8@c Q׋RwXI" m&QR{*ԩ*AL:O-NA*X]%!?U_iӪ:gH䦌mR G p\X5LjqSDqau6]C< eѠ m⪝#e4w$vB]tu :Y3d-T0h-GiLӽLQ@ P}Кih9(x9ꂂ9JnCҭ q-w/6pDD]wIY64U}ґq$ ڴDL{ڂ*!hDYȪòTkS{Q E0DV\, F모$!g//> X|`FVVmX2 [?$@@9-z{F}%Z1{J$n h _d-/yG&yXPdIs8;:$rVvMF2+-3IVdAY5y٪okiׯ(D{ۦ,rVc i*OEk#8bE$y#Az/u"߽p_9iG~0h?)Kh7)@ _$p~ >j%$~._}FdKAnNV=ZVCPqݧ% svWڕSj*ÆA~`Z]b@O~E==<6ٲTJLGc55ezԳոPQvLnw"7 4k*2oB#\\GQG!CT=$r*&8rϋ+Ahwʂ{CV݄¹8xY93WL0A0|^;E,Z`w$AbQŬf^w]DBe7ߚKL4&6. n,ie%twXgy FY-jwu_,@p!!ˁiıNd>BeF7?&v㕛+^ßC+lUxy?]m룶|z=tg֟Kڗ֘%"S-5O}ڔ U^ B;(^ oM"1*ʭy^젭mPI/4G!Xl`|JNٴ_'wΫ5Js%1:;X{Y1l)m/FE;5V':Ct{19VarUXS k쮐sl7b3ՏIJ|e2Dĥ8NSdS׳nHL| ) 3YR߇)x`h R/TXcQfX퓻-ż ?7p2/ lUTh[ _B<)ܦ?)6!yLkĹ vřK w̏W!l*"*{刜&VP}O+?ƳoqwpA9O}u&jtZ}k*z'z?ntf ۏd%Ji=l={mbVu7,Pulb@eȌLc03~E)C;n ^?P18w㓜{`ŖcGba-5(S$‚z#oo\&y\B#3$]|(Vl01ۦO`➌xȾsEв=*S mjI5$ӽ[m-&W:@t֡<آM3Co:"0qG_h83L |@F<~h7'x,#tF,UL$g!#7{b(ΰ [ڷ;@m j]MCqze'7go8DRS(g$UECn>_9=Ep}y ZC>L ~Gn0b")o LֈЛw*px#lfn4+&$<4y&^PƳc솇]:JwX%At9W7%0l"gy$QQh8%v%S4U?*F^C7p?s<٫GLʍΗf+x&Sg$t)}䰝V $5gՂMHYE9ђ΀hJ#~M,\Z-#9%80Cznyr2]VjɜH4/)?3\BYg0[=:)5Mr2u56Aq&koINkEd;]]$Q6ZJtjI<EO ;pr!A;8'ŢgL] ߟu@xˮC?YEdآ8ܺ '#YyщLBj0+DLֿ̘I.٧//uOrug#C?2ev!o)6 7;|i<ϻCW?aIxn W풐Em]^4aM]uW^1Dap挆dеmƂ:$hbd_x|-zc[e%˘|̂ktNuX@D<)SOPP=x$S>ۿ7N3Ǽ@Ϥ.}|F'PƬ#+'SLflIQ:N_ץk껷 巪мq rlXCYä@$Bjrq"0},;Rӿ͡Э7[3s[7Tl'ҲyB*ȆS"d\(杚:{wUX%@nlicw7EYH@?W |{9KU:&\"t0NWIs ;J&@`߰hٔpAtHS0f- ~#㢬ކ3Ю]d7 OtF%čyh,b@Vv>Ěspxi:?V,Lsڥ.;x}8u=_bo*& Ex7T/[y,3o(E\2;hp3(Q w'b `F$ݧ!ʁnZyV`B}=$WP2UZ VXp 9NmGA4ν'rmB#ffr jwFnWU|zAZV>c*g7>C[;:\p-Q'84xo>+ D]tbZ`(.c)D@ɱ[p3AV+}&~?zPڏAAjN5 {qi\TYF?Ht^tOYu6M̅KsjãN`Cƿ ,Wn\۸o׾]qGd^N!xrh#ȧL=P7qc38gNU$7###!KRȅ(cdɰ#}VY@{e:!O0d4`֙KE;NTck@r@ҋ:TY)"R²ngЦ> RPL:ȥמYKNJ'}2>g ցo239: I?I&je#;4[GL0˯wt)<Ǔ3G3f[n h#)<DYߡ.<C@1tX<3anP=ڃWZvF^ Yy `aa|%gWM,8IPڽrlB47[\gZ)%6-zU *YyǞ 6(JV=P^li%O^-d& E e}gVTqh_u^o ^h8oQln*%hBkmvYmVz{L 5$$eȭ3ф,pb׃,WT2 ULmZ1{-lteO px2X^XV"]_Y&o}kǁTC@A$UV|RN&9]k{"[`QM8*1(F/ |SMV1ljL8ZQr ojx2`~CitWIa-W+%I/Ƴ:e֐M CFq3JΠ8◔R><>Ayix:Dw}rg:\f@*wC]4^* 4@%*J{Eze_Lp?9a( p瀶8OOJ%Wfy$XˢWmTQ ZHA(&!7E8X-(#,qlvD~?}5D6~iW>|9X<:"_`R'[\}AHJ%Ao-Y>nI!Y*J_JDzi̬vcXeZ%%0 ߈S+U&o^!, oT#:Iū>|1|l8mG(>flA]N/|p`6gޖNI[F}0P3Pyx?<zSթk\/lf*Q1.lOeG\ug!4(6q3pgnq2 dž`ο:F* n(`\^խB,1*@8@7!5m2Z-%lō[5߄]̓| q*f.)j7P_?PBƇ.t=o(0.]f=]v_([vSͿe)o.c cjCs] [!kmSE@ZI2T: LfF|9l"8-A6"x1Ǡ% T YJpC$ST}S)O+ɐ>P:#8u~+γ}!X+PE UoЖ2̮9[iq,5%M 7褃zTMe3~:U\"M3 ]@)O5)M'{|kKwղۆjMΊEU1u O(GycT@{!YgwE:Rܻזbۋm[Y@QswMbKB=*_ 6a9ͅ:[leqUҟ_Ɣb,mȤ/][VdFL%"DWJQݿ}14BXAh30dVՍ%$H:o`!BpWlFQ4,23B 1tXaskKk$XF$@yl'tWb>2`sz3dv5~wӪ?շT 5U@h )J%nD]GCGR|# w+c>_ך,ᗄh,u;lU&Zh /m}+AQg {N{i {s Uݚ:k<{ū]ӝlK:jΤmGi[Y'nwܫ9w]Usb|뺋,w{ϝnϿ4+V H X[@+g<qnuNG~a5P**nED{\!S?|['7tJGsCJ)bjBT^ eW3Vle_IUj:MUFcdꀋdeͧF'8J -t]&=]kYV0C~#a܌bZ8ބG=9;9$Iܓg l?eC-N şxӋUgoU@CO}v>E1ysi#`gƁmf_(? &`[xܾ~ʇ_> ΰ#t_#򊖠]C̈́XRl^"0i ]U׬f"ڒͩqG#w [)3aq?Lĕ+ s TA>1/_?7$T,rOЧQ^ O)jǟ< +EA~F) 4^U[|\̢scn7X5$/:•1^^ ɬ4]Ӿ_?Ti0r>I7I,P")I4SlDTQ1^}Eb 0(ttN]qu8W~ȡ'0%7C(OF*mƫB:i\: 'je٦H2Ԛzƀ+e Yq;fnJLaa{|I+1};Y&ޚjH`c%{ZeRސb`Zr>3D5J6(`Y %܅x12I+ ŁXѩr)I,*Hc][)'Ͳ?}U!9e|] }+eBt ;@7ڀu,ݣG'~`ϞV,Kc"^eNF;Um-*.%KwRxD,v#Znַ録KX3iOuYEh2yHm_G}H9r3)i{wmCF#7 jdLTXx6UyMR\DMW~VQS{vAUx?:lyˈKjK2 zt1 )8Fa߂'+3{A{LdZ7xW:p2DlBtcN<2^+.H+TlXso:eV|8HIQs%]GhbD=*JtF͠X(8y-#`zslՍTϹI^Y]a 텈9b)B c h_v1a +Qf3ջ0X; r4)Ja(3]aw):dX=l)32%ǝ$5OE=3 }^L\^v:#x;랊z9x >,pnzUy9'hw0SCӢ v7pك3B_5ѨKvET&{L a,cu1V=P+1gsVm"w#Q C˓5{hV%x@6^9 {1680q *ϲ <+݃S7HpȯiiC;f/-% Qf)y nq:+V{L*6y%^#·5Aa}38% +Ȼ6<%jHFin{I!H :`>Jl؀sZ)c۟m kH=v.{[s-0+EdTǃ]BXTiD!'VGwi7|6vkƷ|HMn[1ѣ^;(i "B,drزⲦUh0H>(sfrvAhHUwR%PCZpKcG0[H &f 'ȑ<1rg\)s%UK~{7Jf XJchh VKsO{xz#  0y9ϩk6X,ZypA}:4Rdm5 ͹⼒`=/m\wq 8Sn3 >F)#|v\{b5qGBF! K 3V/ٙ.,U(Út Ӡ u|{[jh2(|Ec#recn#9 D_J+ -:"C>WWۼܿ_M{/Xkl&j>AiHYXO ɦo8v3b(bG+lZP`U{W3ΰ,lҢH@?>ŒIO-AeRʖc-]~2"qX  .L:v=@L^X7;ePfm:\EJO6Hu|^AM] &F£PkU}-okъyl0&K̈́i g`bQJfcί{]l*Xf Ecp Ξ!nprHL๙$loIoׯMz8W H-v_S6lAK/'$5bB3qyH/uq({jYc -ͣb*f1:%{EYB-x傤=>ǹu3iƵOPQ%W!"_ ݸUJ7: SE,}dɖ:YԚ%xxPEFxP, ˭2yI8f%%a,gqE#'jV+hY])y*R龀_D>Qd$&BC,$( l`b@A8Ƌ76B_C5-vC5Kd`JǛMzzxfCՇcͦ]TRX*ˆ3ͼT/ k^[|*,1i} Pt5JVN 4Ւ8-E9ϣSJUkQd_S\fXa$C#?ѻЏ'AOjУӻ*[vyസU-,iS.J|Q҂>-ۚsqfύ5ZHF &d/SqwҠϋ/_HՂ~u]&7 |#Uy-o< q ׎>PC$sڪ5uq.ȮHyPۯB̋[b)EGX)˜m"&{Ecy ~!k' yrz_T}1|Y)tHMX-u6)'䦏vfMt֥`)r|1jʊPSA&&xWɐ3Th"=Xʇ‡,1馬F@}3fw嚱-b#MJ"-@5E<$.ԭ㙍O}HV@<<4ē\)KLPs6O &F_VD6~%}`8NX !<`E&L̈+6B_~y/6c Zݑ \T[~*yzx^=]J_Iͫh{Wf.7̈́gXxzc+/'4V,C}*i- jքve%|$ ym+mH/> g<9T.V>c}u֫Il[h6NZL6*vdH.h3iF̹C"(H"%4 S xGjAWc#!Pmb1(1Ƭ,yg0 vG'}/3ChM}:L6(@:4Fc):vjIk((S,A'/׀ל(3C.Dp8?'P)k#-_j k#xȴ׃˼E _ug$-Dխď.|ݐC֏0V;`}~˪_JG-e)ΑlH dX7)!Tل `Oz"+\,JJRz=&p.PӓLkr={WhbNt1?ҋ.dV ^W8D́f&O=$q{؛?x9OVk*Uk+UpUNy߄r#B} i[R] ;GLnZd_~ _A{ ˽ Hno=*"iފ];IO͵d+9-4uW9¡Ɔƈ!SaZ]i I!TعuF\/I?}L>hw~`iV: U {Xţc(k0o?%SLCv'\)2kk ^s5q(9>(Т3Ş-uaݞnm]LIyX%rq"W|{0t"/eP(h.Ύ?@Ԙ,:KӔd6a1IYqfq5<8YPjdeo PhN xV?MO=t9i4qFMK}z?Iɫ yeSX0ʽۚ{^ytoY^6%EbT8CQ*t$GrxU _=z3L )WERэ.p Q 1QWa} 3>AAȀpO-5bRVu嫳C_^O?gD9kQd3B7W;W͸xJ7c"K1^W'jK/FI̚׏=]IPӺΏB}iz]1J1G9eZ~C#|0\G:i; ~䪩Jk+Zzke? b.ݮSCUVQhb'(sEQ}ٯ|0Xy熴|{gEfhOJ6L{{Q!HfgQVL 9Cs 1ՎCfwv[29Q4=>)\eƈ}pyzPq% w`fQx8fG%d 7u@AcqK|"ƥV) w}43މ`CWiV.<Z)T>}d j̢`tQB[0{w'qktM9i\] A6B\Hu躈[}\G-Y-Ρ# YpW7?+vS9im̄XOzI ,\5"w"WQFItx@8Ȁs&dzh? }$qC TeaX*7Kb?n♠+0!լ+M9N%܇&"|p=sN!&odiT3a!/9Gۨ)k*wՆ2XŒA˅)o&Vxe9l^ڳiRA#HţR aZ(ҫw& ёQ( v 'lKi,WKa8:G%[敻%G:]˥O0@c {]k ŸGvR߭!6v y ¡R%3Z 6Z~Lk{EύG]|G*cuoYv=-&`$#%a6h-甝+z˟SŠWDr\'s`乳veTNO Dh찏 ÏJvdwFFZblɿUj-Sp"-AHQOj:2!*,SNI[gPT޼WC'Yɴ7ӺNؔ!_=֑J zCogH CVH#3:/cє@vR/Ǖw-[e8~{+BRMo[N|@FOua+G':YE9"q * a^UOk*>8"9M7LX쵺G_]؅Fg"' ]u2[8,QY7 \T[hD4ʍ%o+kA裋q'q_|z|UP<]j;88SEZ+͸jfc`5%c ZDHq8Id(n3LɖCl/> :sM%DFT^2$ _!\ЄJ:Y!$\Ȅ*frİz$i@="%xXC!~ F~XZ [[\a8G *ҽv/Kl1y[ä[r‚}"`,v˞Ѣ cy$&%_mS&K&۠5?7I?@b$|61:INMhF4>ЌrisUk&qP.ųl0Y؀c"qc(X%Y/WX샡)6Y8㦻] | CTzzIARab.]BmѪFruBAErڈz25qgI!x=ca+Wx@!\0H|_j46в v2<sGJ$vDVaLCzrJQK[Lb4Xy6M>\1.z)f0l5IDj%?4k/T+t?*Ok7HGmJ[qx%h =9Ӏ-w`G6 ]zUO$>p $΁/o+Ikx.+%k#ί4Q!x+yY&x4Ѝ7*\Fk w WWb g#M%AL.$l!j w+*ɖ˗mUGރ#TPuеP5#je|]USO췕cYϰ~|܌cOpc#3U"հ,3b# M7X|Ng ي^ ι' GsY˽6DF/K'C8 Ś+kǁctx,ry"G«Ǣj%pU3PbѯZBm#ү::EB-{z[\3{^v l EwD.v r'伮-bOoSBՆt]X/"ǍIĩ(huC6yq8#!Injۢ^FhjY%9 !v]W3Jum U<)u, tT yI W (.QjBTֳ؁--{Z#<%_Bu +8P#>-*`WUL&F!6KݡsRA:"N*jC )3P^m?cx w3Z#auAVY+ ͤWBH((4Hes8/#.o:*qvlu٪%T [c/ݓ*R)d {k>jD}SU)F2J?@,0)̌"{ā_{A $Y))^ ڒM!@閞bN|lb-ih }pD)?#<ڏˁIg47Uљmg1]EŴ% ]FH6Y(^5`0A i}Fҷd*h>zy56~Z|;;D.qErbyS|'9$V"cIW(ud)ϰ$Dg\4 +th7[9سxtҲ=Bc홨hG23d%\26gؒ0ݸf q^3^4u_PE l=l$ ?cڌv=!M*K11@f[ Օ n R,| ;@LHNZ2΃s}ƯJox[~skroe7+UD4CtY3]8pD\\>%F:@lEQ[] VL: bpˆJ>ukG DϺJJ)G/U]su vs)Sr0I߄L1 ]S]8APΥȴ ?y2Mcם:DS2b"n!⯁+V<f/m& 5o\C]wn7CQX7]vhwfMn>K({J&f*X'uzRNCo5)& S%x!bsJpqz;tI)#@$ )c{=M ݪDCq rQPVDŽ>M.9v'9M394&&0ZL#? wP R dC~Oo"6ϧ^VGԃf; c<_yC# c xBN$u(MH/ڇkBV(5dJ[LYCI6n)})x8/y@=Kd=g_ib6~[%c2!g!XO`V6!GR⧂sO&#jՙ;("VtR9at';p[nڭuۘ+K>sSʳcke%LY:˗^ϨH!e ~: TMd|R,:ē\][%p̷vL.b 5_A%^&iޝH辏n41X}{ԭZN%LnE580mO~?.-6ձy@•d(nĂoXA+{l@;rj`ubwܴV2aC!;]5Č [O;L-aGKku-Y]6x$O^"*~ɛBAb U=M6z՛AkV̿#5~^|oЀ'\)Bk$*jZ ѓ4Iа)5:k*цh&tWՊ]V# n?ޱ,S?U- mqEx?7m:BO~n\$+e\1 Dnxmxt1LW+ޗ q7tq-(1[st̢b=G; %0^7GU!:[z{EeK*{\!σ>. kjKGk1+GZ`RFw (8K(ReȀM/N yo#cY"EQ3pQﰄ:i[|e|!4|FKΝg[VЀTWs;$U]v\f4o=ض?;fU^C)v@ 3DNWdԊ%3`cq:eeiL7z;0Jf }X? WW䌥rQoY3K7&9*>X/4-E;იF;ŷXavݹtij P*|+Y(ucō~,MZ KHfX]nx ٝUa4};*l.WEעT#2r p+߀l:n 6ڥIw^Sl,nU8>6f@ˠByxY`=|,}mv:niF:-|@څdU[ybW&aɐnv dwPh hOv ,OraVŌ0}9ӟܹd#We٪ }dQ]C =_ yxh!gCiE.U {T,!,ש~b% ~yYOnrNȂ',;Uök8feKpѺhebz>GNʎr(nh}lET4EE=!@--݀nN7*(Ft4x<ށR 3RB`:Pf-JACb\U#-N?B~MyFc \A0H;ã>Rk"@*Y*HYUo{/'E8tA2MP@ BPR{`kW?L3I7P,JޑCpT1 (9oH6<_?e(y-O5A]T)QL7sTm223<3!k %m>8-tZ_ _Ϸ"U0dh]gQS{(.'VfM--TZX5m p=#A 4jjl؝U`X8 0{p`iv(_*6EJXC1"4x\Wcl6ԉ[ֵ̆3JTۭIVXce@)I__/+9h'JCaP@m4}w^)I2Žl96=yֶZ֧fv4m"Pz3ҜbؕdzS}~rwWhY:@*g"<0'y=wԶpTYIB3`-3gfƷ% &]| vm` 9Vw85Ζ3܂^ 4Yd^&O^ޞ:٬YǤ #d$=ͶÓTޝD097sz v;Kl."ioGZ-K418 H,̈u/H @Jfs>Mx\x=?q*($gNMYP'GAk9}6% DP9gCjH!X;/7QNȒGlGLG4M;UY_ZPjcSc`ՊAPVQMJ#6 ޾ݖ8mxإYV1e"3}HX8FG%% n^*n&̆:) I_wYob(LGQd܄61$3' re wa#uW'=dő"LiTͮfk8֚@8'u38a?9j$lY綇ˉ&5RSݳ6m{~ȿ ogFޠ>Wr.x=hvʚ}6\_ٙO]P?0J8 Mk>d!x-k0j~N G]"iR`Yo|Z?IވT&Ջ^ Z!IFEZq~GzDzw|o@]v2f~՝nR.qY䖯vI^zW{.G>é)i uT p͆; D@%D %Fd59bY|³顽9'h˺BGTa6pvJ`TzV`k,+HےOq_|bW?ҼךqM@l}ݭN% 1{JXLIi "  HdWELADxjBcW-D v/復o;2 K)qO XkqI/u>آS?5͋\oN-% k-X9CL+*C}Ѻ]z·̗N(k.]:E 2EiXRȑ hax'|*|$ ɈczΊb@_8XC^"- - =WIDtfȃ/b9> 'm{NhiOgQu+'5"2@ OyS[# F}L R=0QSeFX5j;h@en2)S[>GMbqٿx*LQe'0x83 HU X:I } <ʠm_ET"k `b 5̤}.Uᐓ&J̕^hMeђB`=,yAʳw{ J{=y%mڭjpYjY0D5/@λA, e<}6MҒ >Gn siwD@c~;7T0V;cvR!Ĝ_oe:I/͝},{HL<%Hr{OYH:Nb1-j؃Cp7S,;P99Ra_L흼Q+7ws`+]Up";&:k3?E&zI#Ǹm=p2$"o6wV;ҿ]‘P~SկJsj7XM1#1 vH`ίf;2WE$^XVN[(aw1ZƢK%50M݀S}cBcwJFZ0fm!c&]GY,^*vLa7[Ϳ9_s4<7!mn |)7kkX(ɯa>Pi-b}:nDzM,z8HȦ,ֿPbw'-k&ٶOA^vCg{*P8)qYxG.lgbpz[fCa_Kh*A_ @nXG6 ?vȞ'tTɟLy| k3bL6Yf{ظz3A/=ީCff?$n>nLv @yC.nyYeƜB?K3YÏ^QD}gȾK8`1Q%lկQ?&0-!Z3[EM#$&ۍD|#Ƚ(nM+r"\%~>0M7s$PT[Wi#e|Jf.eh*orUĠp.1$q]2VY~f&@` qpGwZ9]v:Y'Pmؒ#"+&!AT/E;lO8YyF%juxғg%nzwy\bOyKižb,Ld|/+U gALWIyֆ hƝ,c-u_17`&cH] O|d6s-L X)ϣrրo@W?=@g1i+ o'[:x[=i<"w8EmqGllPDđ#!.쥥zEYOf9 Ix7Oywx]k$l4D[kä|Ok)sL Jt <}445*[lkL̫D|Eㆎ7ϺRncݒ9=Oa L"ux3c-9ͮq ?;b|cT=K0}H6K ֊d*}әUƒ]Β`s>|v}iQB?#(*>I&\P~D$*g|sMӬW}f H_4N'sC4` ۮ=6}ƅWpjt^,3;J)dtUjMGYBP[@2Y\{HKRYʒ^=O([ mUq&%*.*LK9Lxޥrbl_=?SN T;h ^zN1>' S TmD^юJO%-6Q01҅FTi:X E̠}VH,5lCi ) irûZL=P8\ǧo.=:ȰPnL&PneESӻ\98'mOI[Pd>^6lњ$*8Hw\8[aHdT>䒢9bSt>洝$a=X~ke\X dJߨar-ZqS浄_jfU[c6֊d_n\Z-9gl) ){LEK$IrN<}z^k8&6Zeu07&q%CQi{!AEnsh52N,WdriHP*z߼xFx&~ֆbʬ)*n q۰iE gDCPD-) ~k6K^3Z_/@Ή9o\uߎOm)`cmjC]й 6 *[@fN(?"@Z 4+_h*5TBOp_wo6ꋟHa![v8c9Ḽb/$2F#2a|2wHELD W6_'"rXʏ8J D sy.e*/bWz7)Aic8]8۾χN S'A=9^d[P!8_RI]_;/U1uDwYlUtBᐷ3k|Cv&s2[9]c)3hak & ץ @>ECe8MowiR1Dr;a<-EKEoeZo|WF#Zs< ɐ"jr68]JPPNAFԘtө|0pI5Z *W~΍3!mc4ɅS}*4r8T?Y8?3C'2&"qկ)-_T(EAoaA|St6f}V/Mܚ.J3{R&ް"C]O0%Ze!3v!7SKŝpo7x] ަ}|U&5H)T yJCr_A }Vq7I\Uw wVJ[L҄c%u6q9Rw8LXvg w5%G ><  n0ġ{M+Յ"|FΏ0N{E-7;w8|\n'%)"?rk!:rYT՝7K<֡.7D6%xO/AfeHֿ ݕ3~loWbA.?Чl b? c[-ÄPQRo֏t 3b&,oxhsnr/7!7`|է>u'uGUq}׌0f0ъ~]n{+-syF%b>_0#S_XA\t/M95@>a5\v8% ̙ɫK4Vk +Ҧp$[g&EOO4EIv#TE @Zx@NU; jnϪ?PE7*ҵwe$pwCfWIiA]2P' }5]q\rաg,sb l} T5[G _Z~VC~{&rȷ "e:I?IG] @?qƨB1~؛h0}Y66Jg *tM*ce{B|d6/jWA"(#03LRFx=tRLѮV\RXz憎ŏ&aID5'>r_|xϳ7RiIQh!&my6gPeَTj.Pd4E߷-fi o_A8"@hEَ[}1KMT4Gbɋ>UeX3Om%0iN\gM x)5E_Aس$e>\T Ϣa24>NXi3bu֫)TB0ڋIZKA ?31vf#@4HtI͑o @HȁJq5"J+~ڭ9$⚴'1fZ4>X1Hٓ4`Qܚ3*oN$k?dJa'9KDs؀_U'mm%(0A/?zGGJ v1Zի&}/vIJBs.rRR-ҐUga{cta"LPgh6iF0HԲ Ek"ŹQ,E'PσZ=\6pkr8ZpeN .CiQB1 LUXEW^x7< g#{Y+-4qh:} I @*K'8tə%2~Vx+r/{o6n,5QFoT pR^;=씢23+^",KN+7ov4 Ӊët+M⽌mh8r^],V@qrB[59,C 'f^*a(=I$0a>%ܚjL_tjwrHŴ а-EYD(N^5T_P-Fz0Za(]_xȂniۓ?p-yqwnI,7Fd3zB{z;Wf^ǛGBk?-Ҙ4ϗ ^RX45b*+/tbmkeX*72KqmsmSbO| d?% "Qԟ( h {>L٬,]H qo7x0kr WjZ߷a!4Zfuf*c^ MW1ڇO-"|s({X3:}jĀ#JOx 7=h3iG{Lp_>ഫRSzlI7ʩ |›i_T*.1P4uEOv;GF7#ks:5 ZttO*+h Mݿ2A<,p7nӵDB?+{Ƞ#E`K}㙜 qCzIYVvrVQ;FÀ 󙟙Gngw2#eݒCH0Q|[jBh~dx˒DlO$NURXiLv5\ZPΫfBuoӷJ:Af7Gry!9 r֔ߡ0A~,MkR@dH 0M,,gRý#+59Sy6zu TmP5[}F2gLGq\M4h2SL![PE ǧU(Fѳ IíjA't7T˵ bTU,㗖h]0&s#r/BYT*D K,̧iw5>ZW}]-u [ػUב'q ^6?bylá׭lЬN P4q\Z(͚R JM] =5T:b0$;-RIB=Y" J;RʝoA )P;Z/!`9p#+"gk<:]'&zyV0Y*_`簈`ŷOZG0{l8A :([UH1*!hN &<%)\kE>ʄw_Aq3nMK$x}zV̚J *:0 +gm{o_A#.>p(L!0V{J$kٽnF=/]$Cmg%vw%Xv/B&EA j9p:,9׳>'DjGl>߮"O7,kgI~gȃ2 6ʂRtvP}Gjjxչ$TǙ{zW*@O˺ hQ=xzQˮs7kxq2:(խxW{T_C#^,?{'N ʶ\g8Ї%6V7g'漪"3\s1sO]j?t5s:Յ zSC1&&-7^ݤ \AloRrO$V o1Q|HX2LEφ/VjOyV'ު1JML`л(kM7*sD`dN뉌3q*0+ xIxC kawD +)2vJ-eH߄DYk~lt2m@vcR h7]tֹN:hCI-oU,IQa M$/[/. DJakx4#=@Bxsƕ w4ز~aiwEG(HLkTçAeC&𝔎pr!ٯ^_ؼaY\Pvl<+Kx)T;auPP ^)+$\d&_\&ڣė,#ٙ# C'NJ႞kr}.[W7w@l&WՉV(1یK+fVg2g4*&~*f&kXۄ-`"ITE (A[{I:>=\(<Gy.d,^u1,}LĄ#quPXa魷Clv~;2>T(اZGQ1 [6:zf11`Ta PH.QYhԜL mIGxd'3}|tMqqkS##K9p#IQɲu?bt@=B9!ҭXLXdFxO}ķm\:säK-m3VC c,?TBABG܁gU5ݘ_^6ޡJ@PTT)Yi?,N>֫| k;&UL)]z88W&AA9_V3̀DF\ld-g;)11x`a ;ĪY܏]pjأ8\D~3 a4jE yM[n [NCbECDj Ϳ_9!#^0`}|UQq=[p&S ?&z'ddn1V$MM|BCޤ Tal&^ Sm:Pʓ '^T,r>hu3y|F r,l8BXbd"Y&jME/=ơRHG=Jë\. AtDt*<$TGm<1)z>[ǝ 4[/[ ;qv(,쾌SR)ض;.*g,&% 깙։$odufbEu5yr bg{hjDx%NJ˭[ύ ӶI^ʗR^!H.\ M_tS xb4,z[c̶e}h,\fT Y+4 yrxYaD6^_El*}gxL{|í)`zǨgm4pX߅z%%sQ}Q>*Q5`}n8L7^bBBx #How.&Ha*~mYL7@I'.H@^a򲃸ˮ=\,VbQVkZ7 } 74|ֿU~#eNH V1uuc#BRD5 vg*o{oU$00(2XS!S4(@G'ܑJ7˲Tu4dU^&u/' g(2?,S_͊6 ,Vizn~ mɹp8پ?0XPb"3D`+~:vtL:0 cK%Þ!HؓLJ4`~C0ߣE1;( *9 aMnPLFY#"o'$ .n$_gH"4d`.+#a،t+8StaMSw`3z[ŏU .nQ DF4qJ@q('s9q*($u) x7P;_Y*t[N&^tA2Rѓ&͛E>YH#9:fffJc%kYwC`#I-↉nP?Tx=&2yNd=)o2LG4dü9K!$qr(+ Ju]%z]z@]YK?Xy>iQIuHo8)=9[pCڢ;a6Q0 =[8qu8%;5?=% r.T/B ?mYGŖB"*J cxǩF#ģTPWI {^O [C;';ߋ 1zPmN_d.W5*ID(mKlھ^c+Yrj|ဉL8'j)Vyu\3 3*:Dby]X$c+PV}ѻ O$ƫݤ9s{pCfZ%,+I482\;⽻ Bg|f&5lH_ݓweH' "zBHf"KZH4Ӽ+m];1yҘ&7Z+a%ןZCfpi'+,;+})zC xEWvc+B4nǢbpԌ:ac";nź"GXje#v>#EdCV)ɼnoĹL@%k*2 &,XS KY2fE{+F5}W4Ӂ0֢ƽ/ho}QTlל^~[_U}Y3:k&^sPB\@;p#rY -W3ț֥66Q)gqr08[}3fLqIv}:Vbe1" qc!EK z+68tDMc?r*ߺ!ĊjWS|C.|}L-mɎ9(#bTj& ySݒF`H4^}?$A jZWxKQn%وLY7Y$WnN(gY~7pU)r={ݼᑛdQzC9BţCjpB"Ş ULUsԹQ% Q[:7 ,_(T}}K#i8ȅ4vl 9yЗ9Խ!ڡNuZ~DtG}}E?镊x6eOki͗_ o?xk Gelv}~F{-hRbgc9u7t.}ǧ,eOH\ AZ?k*M[] nl~HtjjHSCD7nRK[vTLkKӬ)wI%(㵶?)]檆K%EyVLSy4KNYNs)bցmC\Ȍ3Fzd3ڕRrUͳ:9笃5Ut"5'@3 IT<0lθէy_>~Q| %/"i 7ֲAO<1Ƽ\,ebD6oK@MK1# ږ2_זӏ Ǧ-3xZ SCl/Xns0'Rٌyy7q܇2H$aӮPn!G\z _d,6J$З_bW3pUZ..@v!޳I2y7PS}N1 rw 6SzfWLkAX9؞;W]B5K"¤dzuȖmBQ%@͎Wc̓l >7|Ymhmx~cf JZ Y6ޛz ?hhH${p-ܸX G`4~{q%(1txPoz:+A.ir d9>]1P j[J;#f|`.$h$}1++6c5<Ӵ`ޠS{R+! kV. :iy{x3}@ G"9{# I]<~v8ZʱbE&KFK?U=ޝ%LOI\5H Ne)P_D rL^dċ!trmi kg2?">hV xq I VZUhtövFr80\D¥'Spt~*x_/|4_3}J) 8u0;}l(^mj'YMj2 2/0R[FvrZDoqtEUUI2=\ |o^H;6`Jl7L GG "XMLAdO9p k S<*OQu ELKzF g c[!gfkD8{+*ѷ…^չ%IđDevz9UEi{*[XMZw9'aHVJDХ@/.I|Uf^f.nqtyảk 7oKlv,].i\j[O QXm b=<?*YȹWU$B{S2ڽ| 5J`QDX8L;V7SS` 6䣥fZ~qN 3)q*4LiϱŠf5h`q<eU8D#l[V&\k'P+QS'žN1[04GIo L_ t!o(`Z7&W (M%^U}!zQ`YoW X#I@g(vJ:^M'uGmYvg%rA{ kC;g%Jųzo׷ƫY]ԑj;>mHx!Շ-7YRba0P#)?Žl"i*?"͙i;@H}zi7IW| 9e r31VG5\4zEkXz>0vbgr4M l36oebln|WtXaeb H?2ȝWg) Z4~9XI/n۹4|H\(2u:s,>6Tu]:$ U svVaS^pl4s:QF@wwBK@ `:`I*D'ys7g_͸l)~ x5d<1eМʸpUxHޙf@On0OIhກh BV[2_=2ն<*% 06*ClĴ啫jD&56qs$_>n:J }@-H{hs0ӤEw<,b ߖ g6hf}5ff's H#hxuLh{94r#ߋpؑ x3y --(z9CpH9,C}0Ѡ))ħ95ႉEk'8|NŻ6]x{#$'nkf0\[+!#rSl[ǁN|@0hQZe#b TdXH/w)%y½{ڷfO0Nd-PGU]tsed82zYU W0`x"&`@Ehg⸑韎KZ9߼5{g[cSՋ4+[Qz;Dv6j,.Ƌ!E_topzzoEd䌖HEm66}g@iӜن]aYW7̚ MLFe@q.^^"B5Pc Ls ujcE!ٲzGӻtkܭ貭+IH WIFaYW'cHWrj;u1b:SS.#Vp ˎ%etw٤(3D_'մ XO3xKiz]<=sޙ|asyˏk - g:IMZQ)3IuHy_G -,Bφm=_cނԹ! QX:$,x*Ó8 #Qɻ#xVZ?6zZHcDۺ߅Vq;)F︥My (u~V\19pidi>*&f2́\l+:6;BS$LmػgiX,Q-lYiuJܔ|mD'ՁKT3#^jK4]:J5Vܘ g R{n 8t9A*Y0\Yj1I Kj(*]M7֣3Ȏ/!K}+!Qf_K^&$ȋɽ a_~Y9i^#BD yhسi=PKn_ֿ):S7R]EJebܷ D fmjxcpE2bC7$cL @6+$c s]rT-3[=C~s fo2Bήqs<=,5 K4>MBɭ4n^/3e lkHWezW߫Q\`+u%3rhUp\MZDd$;M~@d tb=%[1Z*_2-6H-y3q[<{UQp8y=Rhl<[:yKYw ElAr"('9L)v\;lƉΰ"lE`̦)11= D[W#[x^H%)K:nNe866V;Y i{@4C$HZU!WR {ce?p]pfxq~ oD✵Ty5Đd=n,T'EG2ϵN# ;8 |\;/ j[PDx |7/v*:-2C[ K4Ld|7{ 945.dAVG;KɵS;`R~q#W.ъDL 5Drۘ7"$An@;)XAwc) 'h+v4ƥ+S5 N@h+TˠH/$&ƒ1;uA,p ~:l-b boJd+q;GM~2)Ҏ|Pvfy}O+ c.V ΅f6.bu$sʦLb),ѩG""9uVF$1`VՋSig14ZVh.94MwAAؠ1dP*cK.u1ӧ?fc3m .N#y]mY5?~/s=z;@ET۵ib꡹ LChl krδ9wʦǤ=QᏵyFrMkǵRS|yhJ/'d~[MlU&օ5lTʗ[\ꗕ_<517 3o(CCenG'5ZBaNdٶ/Ñ8ahhX[Jl{h`x3owMǰ++J]f"-ũ٭gbZ(H#'N9W4(ilqmNF쩣c*X}؟ :USc!g2A_J|+͝*|O,̝({ LpcNosß)`r„)[yr[{2i&_uUpq3D\9=&)-לLkٽrͱԞn+ݥ8xaLY+[@?mB r"ި8L!^摬k.јz׻)o=s\v0l~@ݚkY7ՊgQz#&[A)>Fܓd5+fn]΀>Ơ>}jC6AV2=v4TZWc/_=G1S1V>3:/}0u^E8O{bGD/r@xt̪(^tN|w.?QID!_x%;ly,ل5w^XP53j0Ǜ)a{UBI*"l J1۰:@N=Q{u֡萾9Ȉlcv3 !$\V}r<1}|C8ힸ ') ,;=ce,0]>{W4(7 Mi5&wJ@nï+}TxP*RYwG8/UЧimMm{F\@GCjR$ZK`!ܔltB""#NhV PՙAr,Y̜}=-J[zθi6# >Wt>z>vra99& 3Q#T.!!Uo8 NiҜ%fTѬI/|Sd#RhZ\%9_;]1%lI2 nCرViDbz.7??52 ʎ{=uIąLwѾܑK=ͥxJ|c-4w5KhiƗ7}cJuhWҏ#L:Wx3rH:Mo.KΜJj_G*!VRH)l2b_XW?,ն3/6::2;WTI`t:AqXlorDmCqMܕd ooL"WKDͬ,bPϾƀ?i aDOZ0uBXn|~yf@]Nʊgu[v-圜;3F 5p]3; } KN}k'ށ$-y,Z(o5: عϨ&@#bYiclK mO4D#K6-H#g!@9A6ӲFa]HOͬo -P}Ll{bk%2?BWv13^绔ڒMv4`ӐC{;^FdlCLE˂P^\!+Q?N&GJ%.) (+1_|76Xz(ഺ~vZu olKAlK.ߵ%*$uI,zt rI J$DJg?BVib%JgKV#~+w sup;@;j$γb|(RNq"ﭧgBրW$/]K+2NK6Mj8I̥g,Y@(N(?1u 3;!` )^WH2'׌،FMz'pڣxwŔ whl.Kkïz+my0CO6"\M{>?!nBmIw1om1]DI7zT q[l< xJ:7ho oIS/&t@[V@'X.H$!,6"fM-VqgcIf@w 4ob%pZ=ڿ~l_-It$5~Cmglh`E|l/ ks%EYG1縏|4',bŕ.ԫ-8O=Y0,:p[I7kVB9h+"ZsGoַLP)9{alO&6JIh+arUh#XF?9Sƈ17afwYX Bۆ+?H˙2:ɖP:x*K0׶ærKZy4ό3&gy9{RDQ5eQvl>[ ;X/% >pDtBft$(K+g$ƤJd\,K|%fd98"Yc~4Q($x8(ˬV*A} %qoGu545؈MU4xyPΣ۞DGjh@ c^28&q>ζ">AW2|l2sA&Hǫya."й~%zFR<ͥ%tsHxDW&H{#a4.MM3W :[T V;!Ly&[GNCV(#(S8uBˡ6jOC9]A6ff 2'sOViWu-_c Z1>tۊpG=xLbOƭ°r |`v `ċfx`!Tzh"=S̴8u8lOa l`g*)zIWV}SJq46Է&GHW0-}Q0KU^ >9Z[VQH:m/Kև( E*&9t"s/# ew(N|=j&&C>Z_^$k93`p+EZ޿BJwJA?w=XPtYQ@-/|9DUSŌtl)Z8#a"s\8A>jT9E dBY6լ$̦=֋Hv9|\BRyV6ڰB7^:4߇P4-9O~mr2⬕ףvW\oSund􇭣-°ufn5Ў 1v|1?c-^:KKnz4}͝9HT1 ҳ @H`ЬtI06s,U Q߂n(4W9wb8ѡ-'/X*hy\K j:l&ϞGf %łM3%c,+{F/bn\JrlH.V^`\ޫ of{E>nM CX!tv:"M8x}Bȩ.Htr(ImPՇ](OX5߀;Q>;I|i}ޅ "Tlm NY^[T~N)k"nVw&|bmqڜS~Dʃ@ûS'_uFhɲ:E^p4bkz6N+)C:;鷃U ,%mJKE9A6O>HsWKA ilp ^N}੫qy4O14 D59. i~+p^Lo"7,bg5u(?̿ϾԙNy ATw_pa 1hJg5{apV)y2&QR~5%k~[Vuqf r`*b"YlB-OrSE;x^AjTL :aQB ٚ5mtKDbbGWV Bppa1q1r>97Ykiq-Ћ8kCwr29қo*Lp$r0B6Z"W6۶1"+o7쌎wj:S+P?Ld;]n>܀GDLU<9mITۍZs`{"t%IQU̙#uKl!Pb 3NjGuZ0g sutП>P01ࢆ^ra\(_<_Daߏ%}4>HTs!`a.m< u{^+AˀgWY)&cP}J\쇃0zs'g,?]ʎq$h{u١!ƅՙb}-!˛.O$%+s:9f^k 000Xl0t 6CB\|BNR聳2fg z?M'ωDbW%9or.6Y<;j5uХe]>DOZXUQiXR )G'~\n}!,b#&NS*m/#m-xB)5bB/ 5jh`q)=2ܨ XQZ# &a7 @ѫ*? $bYnDeXqUwE~*M((G0`~\ q'ǝ.fܸ)UykvvjY px'ӬK[__od@o?B*MX2V,啈A[ȓMg5 +Oye[ -<+9Dҡɷ*U"aڠ*Rc#6Q#}s~Ț *W'Ы\^2x^֖۬kN>+ ->e4i:O(c hA`j{dP6%5e+edn_9 <}qBY*ɦ_| vpNw}P^M% Y{7살]qH^\8@'.[ Q5og-5B}H nz7yA?^m o-wp@ĩPRLgiq\ۊ)9tI |O6HY[Etzc%XacC56ƊC۞;޻dd~0 Ί;P`]٣G5CuY΋חK8>yr0q쓾H1cP *66]aT8tSm77X'&J%R{/CS]k=e0OP*}j=BH]}'30r÷١h/kn]ƱFs3vmT(sx˲ !?SY( PJCh_i)Lghݮ翙O8*YTHlRu"38(@5 ѶsE +W|#`rs3'tZzb6eX͆3C O_ߢQӾܸ p?jDlЪ[qеGjdl \nY1grƐ̜̱tPN!FZDn44BΙz*C.hʒ*Te~"*,-X>lo"N^ƎkdbnڧC:I(A1=O_ݎqG"}S~pҮ,M@,Vp5V@ gDE"}P[5|c<<#6\Ьsʌ,nD!<TH{:D-%vU3&(3aThK}fhd?L6B$~"@Tp;nG8W9cn5XҪW&.f84/1wA,3Cǣ*&3^i$ALe$ۿw.'a@h"ma@^ߏf.4&//To$#~vPd_7kVmȩ'UzmۥA{ʝ~Ł5->E]ꪭW4L㵉Y}YAD7иT8 By<@1[ÏW|^gOǹN{ Z<ʗ#Gz]^䔳ôt86Bd o0.?uYj2>#ӕs^9+/)9>Gds(:I$On X`&t^o1;i|ANӵ,d+̸A<^Qh~TsA{wdɋ[)[7/woRaYVn(qvQ(ѵ5w>֋Cɟ)N~& {: ~B @I}?%5%# FςLl?,f,%&+,wGD7{6F`=-2YmpA:iD/q "!.2s91~^߻HP> dCŠk : ZhTzx=$v{:ĕSP~&3Jp 65 nNA&BxQA"(78nז5 8ZAі,@<QqLY0wvnDJG +!w}(~g*S1W'1h 62>j)}>?~bU(DhZvC;]=e"' eW5nN9,*T asv;G2.}aS@3X.x gKl!gf6㏔E#mXCf.LvR.mOO6lXՙlvbncj XMRJ6 6 ڍfxEqP΋Y "Ct|*G&(e,Nje= G\._wƧޠI4U~جAllbƔq>8k\%87nCv6sk =BO\2`PPj_DAGh`Ph*YTVrrdC<&iK~VGdm(hg£ҹ$es@#`N|/BKí$zLJ{B%hܶSa*$TW8{kf} X)0Fz vsEB+x`|_ 蕱IR_!ƹ xHS`= }]TI'H'Զ%*6F>;\˾F5-q0hDR0q~䷇rU-DRK FMxǖF 2*=͔hȈI\jVònwiC +Ȱ1$j_͑umAG4Ρ ( BE?]~x:Ihx @drm+P^Y"6K X٢8r'΀xDjLGMcN9 5r|p|btD]>BJ(]dQ\hmE5iŰj%Sq@ A_^PEZK&wD4qʍMGIG*v,X '?, 1|1?ȋqCCmb{PJ*+Dv"K#E6t>".ٯ!coR)Mɞ.I[Oa Jp,кj)d q Kn7/Ē"yu#ff6E=h0 K_pn^f|XR ȈUSFaþE \ʼnViRT#\Rq6ao?> TqS3EmKn>kU?&\6f#-ث=үpW.őPyAj~AXY^clZ}2/b.();O}S"_>8]ٜl$ ꠀP[acb\8g[˶#)A6C}~";c쩯7!ky9<ꭀq뚫{:A[ cܛ=G3|MX4 ax{G0&ɣlz$LE]>18!1j@ۈL>^ 5x0&~mɌ|ش;2%O$b RghN$Z$%oT\ST,)25_+h䬸ezo5k*cz 9I.3 aޕYSa tP;]xDx f_Zn˽YECޏ;RQ u5;RJU;9/D`>6xpu *%e"+K;穆Y"n4PU)9ߊvPTw4ÏP(8N<pݏ6ؾW*bd3$~~ T4C01-H\S{x`A"8|x$AMt^1ϦIE4KP.>σ0b4!ŗ7dM%yz~x>ʹAd#[  F 3w z{&Tv* :jv 6Q9>\nUF =ND4x Bh)\o}2c_9i!X5Nrd. n,j]HGId'śaϳ(ZO08|1Ġ(DqdXF+ޏq&tGΗ 9 ]1Ͽ < H&fI;Amݙ.{SGVUz~"tJ RD/ٶW9۶0_@H޵z9/;SJ!4 ىcUz!*Z5\u:\ӭޠ'$W%t 3o7+^^`@%:mŻ I%~`VRqeYg\QV23"U35 D\\R&ca[tm=mH |rOO1ex#`rbG!Q8(ɽ469ƋD&</ǹR7.AXr&^2Mk7!lɧN8!"e͘ȯ6  Y(rtV5gfb,_\#EUY:pԺnlAU(}%\Z#px/XSY=BgH(u'X\l!Zk +bأ_٫'v@K OUsh!c Nc.$9[I!m:ã)!u.4n !:X$!XjԂ`ԏ jdZNxE6g%ŘQ=O^y#1BneEUx M.0TۋzA4Ԧfϛqc cgk[H2pdgϧeL8 :!JuGt3;! g(bFt7ZT&=l"y"kX RW<#v:oJog n&@6:'PNqGev"8٠nY4|xn ߽wD& Wą_&kq$=3_̓X'woCݞĹĻ Gsbc )kQSn{OY9\0)YU?Ed7loh0Q֫0+ 0pEL6Y;cweIW_Y 4|eQL=2b-jD0'eUH ~ xweޣ~FdKωrj-̲IX/Q L¦N dg0f]>S)j#N6E7D!E;SvuW_ : ǁ\q( u>/DMP ԭ 6C\we|ᬙ2*Lʷ>;!& QrS.K]T -t&J)*˙S6D9SAG n??5Xu͌)QvU?C)Pо@Yr Vzyݷg8Y6N!iM=hڮ%tbBH0$JSf7Kk X9w;YCҐRz-q}GS7֡NQ/F|su3L]D$A֩m IR@ӥ0!),!f;b%IӒI]R|Ka-ն8򓥣#Cյ.L Z Sє~b:b;EӫJޱ+3d7uA7ٍ|喿$N4FF+d+ 0쓨 pWIqPγsx ;^~j< V^P@}C[-!|Wң=+I`7x(f7DӆDQ7v)zh3fyS2P0[IWg~52-<% _Ghp9 fĻ|s'W?%w2gފkjt8vYjza|,JwMȫ.xoc)RYz L'&v =*ATvI"@27 g>F#Ua a`.J%-6Ky |,")FaϾM*@7$p^s+`dww$al~ljo!1`>QNLB=8=$gӬG ;(zAn/i<!nx(x߂^ tTEz=KWުܰR~OQJ8tQި1G4Bu]؈ܾEk{ʘШ0Lq=Nω!By;,<‚L)kGt1%x i㏨83XIQe̝vRb)VXvzk%]C<c _3-&nqXlc~eISn;Ji८P =nD)B Yl*?@UF7T ԴJH''y>](1CRlg> zX"1II`<O$LғF_f[LZGp8DH]ri.[\ƪύݨ 琾+7s6 x`gvLA3X5zִ#j;'ԼmT mcCfFZ{P% 0 H="j8diWb,}Jxd a"_}g!,R3d4gK<(e2mmᐸpenܻa㾠Y@'iƻ.`JӀGoMJ}ނFcn_?8 %<@Wy"k_{o$ԷY"2oiPAF=} ~wy-gFzd^ZpOmR+a= *|ȊũfBpX AjM ^''-L,~ &*>(vmjz|5m NbK]<5>'jn 0 UK&ҳ,LGF8٢=!?Qxb}IJξFw.ľ,Iк|Cg:_~Ϩ}$hh5g3M+ D {`? 9w0adq65YdoGo-o2ɾ`~+ ]l)0!3(d~|d$7ѨP1יc2W"l#+PAMjvku@Wd|f+.MeQB@Bo%.l VhK%3;EZg DvtEYSHww-0_3Re˥x>p(_Wkc lC, I:AuUFs.vmJeDZoS jaG՚hBP_;KOM&7G O9ة[`_WO")>gQ]=Tlm<6'K2?B;ia\ـ~- >ʴV9r%eU:mxdyynW˕P"xR|efKPLn T;DFvaN=!Ґ r^I):gNچgjqJ]@`]g\."<6Ѹ$6EG<;;i ;O-NNO5j,Ҵ e%na?2;K//`ٓ~v|(`KzKSފzM{K/C (c -n1Kͻp#iI~Va\G<::jzm[BEo͓{D0sR.^`5 F']bջI[Bݠ @ctj[Oes/_#䭀5K.P 'hQ] 񥋃:Z8 = 0V75Uu(HD&Yӳj34VKb? QU Yz@}nfSuDmIzBF4wCD_ڹ71ͳH0S]sL]\'ZZm*ou'>MX-CkUDm큏dw6 V iw˧׉?̜]ݕLq(0Hf{Q|eja~E"eP~!RAR;(UU(n kE`3p;xo[04[m!oƽ=9sd 7V՜s)^kWb }Njtl"|Q*k L*kzˈ]]8n\< i usj8/ )2 tOR#+&R 0 E0݆6,*莝_.A1O>^nN7R"kuLO')EԟXCI* ]?ijcG ֫UNKAؙ }ODzbGc7*(5liQ}=ٺe 5Lk;waR6#]A&ǯ Sf6 83r| űx-{짴ldXP#cXr5 LĠzgGdV-#8:'M`~!|QfB~-L9Z 0"d8l:۪nKX(ֿ/-Jzt4֋W^u7p:eCo|Mi԰2&yf8ʨȫN `v_$Ll'a_BX 4 KB"@j0K}>6H}=,KUw"|l;"D_Sut В_!^^GtZ4 O.p}\x1/q :7g^g"3%X*EB1%>5JW9ݲmL9tPqk YQ|I$uK$P/]ܼ?UnǨe?V(Ir16)o/֥QvBy_(pOGںt4TnH'!/=?i$AGT~i$] ;_K-4jvQIFڨ`U6k9";fPO:#g)O(Wd"$ku ox@K%S\`]Xzz+f.L=~-UhdC{gOTޭ5Xu<|{NFvcZ)ށ#=jԓ=+o(aw3[˩uNKj-{dsmo=x,0hN H;dv//fY uO!7RԔMvN/߈sAH;(d#瞄DZp¨,v&Bt,-2BoFxׁ 38U~;o/МyǼq{ng5(rGy| G?D|wy_assqIYC([  өFkzlokg :@U$e8xT-qv6UT+ҟ-t"Yn#G $͵TptE7 I D_LL0wȤWq*d"](RR!<M30xHxr|>*9 6o%^foytZԿdq{dե1fvgDhAOS7T[d5ɕcI91P@iVD }od^>P;%o]2gt Is{P(-W Q_a rX(l(4Ňa{Xp> PHa<ϹJ 4,??=:lj~;x|+I9,F' ; a~^e|Ӄ[J=6|sM VchR8mX E#zcrE&go  ;t5JRj#FB|Ԅ5wcZz::wg`;m޻t\k'؉>)[`/87U _+OJ lwCdŁD:dNg `$DEFNFx0)[lթQ}5i1 Zw:RtUuȞê gI7X\^'[~ʁl}^QhjF6vT5^7惸h2qGK FUhb9IDNpCm{ cpQ2qʂEz {⵽9?an<'9}E׾ٍ2z0 E"Y;zA&p䯚$R̉N'Yl\5(z!<)nB 4uX?08^\,n.>p,JϩᲞ= mAN~֛!܁Ɵz+O Wdp @p?oo1'?' Es9C.Ѥc`vLP.3C[x |Vpq Bz_QWL>JK.'%HHւ9"cʥl,qح <8Jt$iv s9II#qÿ+&o!n4Ot <%#mC] 'Xk0~VCSBfaEG :3Tk5&ˈ!iT.0(Rԑٶd#Ae 4,j#?6yͺ^Bc<LU ,N꽻[GXCO,lj)Y/E'PƼt CC4TwH2@_M"D? %DY$XJ;ϽdOA)ml)hggN5 +>HpIX i`?#8ؑl%x\@dG7hcJةIЂ$})h~kkpİ\ n|o~TXW!q~Ӿ0 (5‚Po`|cX;MM;{Q}Mqڒq[*ÉAϞ'nsce=oN ^،Fsk@hN?Bj}4SDX%ظ"q_͠O6Z$sdd.HTK{U9ٌlo؂谕$ʄxK+EZ$wx?5A`omqŸ5'v]"X gA_etzsG <$bk>%!ʶLs$Ql_ h@obB6~7!.(KӶIF=$s/Ehd`}x+;8 hf;1G5c$ϊ (j/^ n ${Vv_kmwZ#߅)v6lZ }|֦\Rh U HIaAyz*H| qq40%8΂ﯫM'WCQ.?&[y)ռw-˧eYVxknG|[Af,sm+eQ.!?נ֙Hi *R 8+ ުm{im1ͭ188\ʭ:zyE9 r#+w5ԢS):2,AY s!S gg UɌ6}u7A]Wу]M\igC[$}m֚Dr=3<;"ɾj% DU &{M2>ʶ| hM-eKT.381.Xrb @YaUp}{".P7UhCtSSm!nR<=7E>HN #Bf۵xxzp f(ܣ.E{53Z"?ʐ ^>}'~2b\wbƩ 7 b3PQ_/=ϐ?Q(=*Zq"G d[Ǣ:iHw@0F bVJ^ B/)Uڍf8h6BOgH]? l[VHW*MiOW} ,8FGz`;$& RH] ؜T2o vKW u'bkkE| Z"-y"n~37=~s|xt[ <;7GZP{3tR7[GY*~v'<d_@/*|&^,,LdgR0}P(qi*^(Wu2(irXo-{RE񩥷,xVOS[N!:J<4[ z2FvWv~^aN <ǚԭ=XIYYhed\l|^`)wΰl7{& 8Sz!}H̅"cQj;`]L>i-W.ΣBMr.ޝ;ӘK)P <.Zٙ3;!|xwHEO]pZXYݻDd.b>+Iw/$O 2O#rQ=r~<sυ& k*'P:٘~#̳O !2y- X"։됣oGl6̽NT CՆym jH,mDDuch3=Z9;R>+p$n1ƸJ)]ϸIeX4v3fe&]c sZ ?Om5ZTqs,cS= 'גC$u:u;Б{ȃ[(M׺%,(oVaMTaűPϲX:?3xFts~o-}. LOMT>G܅>6㖳˥(SIɘ)K_dnd1`0s6dR].h^hv-E1Rݬ('(x)tVY}ó׫I͚RVNlH"j3%_91DPy\F+7:`B뚓e" G)bms&V2 (27hvZߏP)l`/Kv,vʡ%6ƒ+3no ]e3~:P4׫3}G9Œ0F*MP]:I\ E^a^VŊ n8o'b-^fCvB!SLRlUK _14 b$Cؾ(!D0= &Yb!udq]RU|1{wܫIK E]^dag)!sj),cf.R"|fб_ y!H迟ys]ݭlT$B7p6C2N1\!蝀e1WCFY˯WC0%0buU›>VI!=ZwdlʜdPN$)-x6Uƌ&JC1\iU=SIs&ͳ 0JzkD沼D 0ď o}7 8iΙ3Z[ zc)oY;r<=K) z(a7KԠM-)ÅO  ]A{hI6&Sr푢҈wX)a)}iE԰]1_[98[WiqYI,j+;my۬[Alja݆M!m%W[3fHM.0%N`Ծp4qFx@^pDgzMY]@,$!;vYhz']ȳ'/X4M RŹVnL 6PN ٬0Ix X T9VNO2ՂC\RΝdm(`hBbu 5ai%9Pٗi-iAitGL{Zw !AX \ dƌ W:NS>Ғm.-̣p+*tsG:@NIUC4G 'Υ[Q,vO*]^R\"@pbO㮋UrffeM"#s5OF=WFm2f<D,HܹcYlr?{2=-JΈfp\ AV ,>B#O߯l5@v%(:Jn#ui*O~(ꅝ,&3s?= Z$9(BZ<K*&iRJL/h׶S;w1FpU۷Ԧ_ԓãqu2ᐦi2,%fJaLh)cs@I~Fzaj%XvFXտh@ ` Ky!H續_Y2~?(xB}.m1W龌Ş9ݒ3΄n ̴?&.جbNu|3h'ZeqN[yѾJ;OoTt37I Pe]gbzaBם9+Y~T?=퍇\Lmb_#&tgzVjtL p m|ںme0T1w&U KmJtŚizg+IYEw{ %tӠgNNdAi M?08HL' 7op"[u FzEXߌfO.\xڬQ:3[GI$J/aLk??Įq5]olDʏ#90TTbVXkED,ũ3y};.jY8TLw=Rh^Pշ,nϼM-0sH払ŝd LRT~QĔ4A3P08 b89 4A2xVVH^Z<1@NP!$K]/2Ex7x/k!pYL7#tc@'}Cy v(q4C+@۱>=ൺlFk?]y% ysmD7&{ADV.;LmI,+su2iqU ❾¾;I<m 8}-Pe]pj WLǂ)Ҋd'#ߝAQH?oemXOb(sMy ̵nYADvκP/QOmihv#{osreΛe`$%;) "ȃ\o~bxI_ɎqY0\MѲE!/hgڝNd0RՓ| 8}R:S2= K0 _c \ȡȩTpr~&w{s l|MsYuiB 3#K4ߒ>9,Iڐ% HzlQBp* V+  ر[yJ-{FnҤ /0}SɻA-v"*9$RA6"=૆UwRWÐޜnso%gTypKD`i%Gs~S(fw2q~ybX@/`HK8 D'8SC#gj_ҒXSQAe<2M o9.)`@ 툰/ 4|o)"0\T 8(jlnjma3ȊuzKgF ,A_ʘHv y1OͭCڏةėͳlj1i\&EKon,8w2j*}gSGA:~"g};[F%Y}EDtzw8vG_D[L7zU'Xs0ˉ l3D3CuЮ)xӝL8Rw̮=%AEz[- #GVdT~jG*B]w/P}5@}CI->½9paI]2,Q˯*\IDwp^ j;qȮ5XBqZ9D2ꩦmڶȳ/t |s߁ܦ^$ﬨ b2t nC-܊jۘ @fY?FDVkPOFvftȿz2G[Q:l:NȤ=6+ѾPuu.PQyЅ{<#dT¼}/Αgp`1ҶIb^+!Fop.yWIf+֕`N@3-5660y?$/qdžO^!;$%(T9XC{~q,-'FEca> C3Z1啧'GSvO+n콖ޠ5@D4vc82=M#}.D4\oIZe=04L@))F 'ߨ+0T#)W DG w$9|3= "FOQ,&i\<=2#<1ԐƷ^˝H-[1=eG"_p]? Dt$n i ֯'Z# YjkQg Ec6#iYnLSKJrr=;ĜGf'I(Arð1J(rQ9BbKo`Ѣ1RWo-:IUutR*"TRƜWO0uq+3b7bjЏY+%Η,%alL0vhX@۬4Sy-p4p,XB,r5,K>)Dx#䝏Di-vP6'q5NY[@N1^bEwp,{x>754tLIJ84A4 i`E2nC7z]f=UypJ.~>gQfi EꚹzMVISyVk$*R?=fA YmWq/C+ھPޘMsy䈜^#̦U >̤+u)w.+\EåV;(PT|3jeft',P`}rL03x240 "J$M1"sQl3c:4< -6NKXS#\YgClpmO[.+-!ƕ2* uډnnSFV-;I?x:\ b<wFh!!ț ȰygL;]X#g;LIZY^o52Bcp ͵=b[t%?~t@dsLJ^W!$W8{ZHp]"mkׁBzFnγ c=.̩Ml Y?joM䑑qFfI'kURje b^&1ZoL2aG iis$ƕ'(xp dvJMbYA|Rf]iAłjmHQ _=@oݐ%& OG Ï /chA~E(p`Ԡ]e/6od8;Gt͗Kb#w XiޣM8rNaPg2Aki *ժsTH @OTN'ȃՅAO.뼪Q_a?S Y7oIuKv0~[Dxa4=$r:Ȧͦ0i θ5>ψ TŻ0-Np])J՟B~jfYϤ,wŻIiDu;]ɨG_儽N ?+C $Rs_8gp!&#Mtx3tW¯R/ie}ѮlNu @ʥ1̛{-8+ꉺ[.bSϏWHu͎,YKZN p1bF; FCC\9 IoK`ZO{ 2 %v<$G@qt;&Z-xRβ_" [n c0pEyXoE:XB@WP/!mx 7NZGNPo!;\?I NcC30,T(fX ExC&z :P{RcDr2Bۉ޳YUF竨{@T$vVHGz 'JR*0Zе9 g2{%tRbt{<Ffm oovD*;YEIKh nvq9}5lIdyI|\% a˨S?ۅ6S~ͣLY;ѐ$&o6 ۞J^ *`64#v!@ȑGz`V1H{= &M2YO>j:i^L uKcb>~\c%~/%q%W5XԐ.rxޚǶks7#;{;OcKJ:f r81Fkbɝ[k0/ OGq+mC5WeU=vCd !x"= P$u+ }Hh5ӡ)o6^?R96h5~۩5Tah{/[^"BY7Ib^S0#Z~2Zj? Eǂh:U0o#B3"p^rB#rz N)@^$c.gLߟ}}'g23]T"} NR刖\#IU ˑGݣ_&i Kj F:4BS=β.%3֕U6].PC$t}ϟ<;>nDܮKHur[wr3T4;a{}LW2LO|HUՂS/sv$ =swEԫD\(^TDFo O}{^,-Rj$[]b2xS$F;tR@u4YN`~Fne˃F q%0z8JgDz_x@ o?1\r`#I̦Wr|af[tM')G=BUqul$>4zJnHzl[zL-=ajHoikWb+~.3Gs^Zy k8y7` iږ˾+MO?I>A';8i۷=O_8" c<TVS0߳Z8Ȟqlk쨶N{h%t}b|Sw6/P W"0q~n]$96'<+%`s1塪Z$[p=TT')δ1R]?(u[rdIÉzSD3^a¬"byJOKr 柞>5vqV~]Oaux)gt.ϟn`K=еi}A 1/F?dc%-jY:SF׊=2_1i‹0=*Xcq@U= l{65y=uD]͐shQw$]=qߒpXd294z;b Β>~H`Nf7!,a+;< ۩#, [[C`|.4k_{y6oOFbD,shU<Ү =ѕY@ CQށ=Bi|2[F>%ބT:^kбuxe z1!ѤkOJ4#a -#uU=^ڲ h"E{hp ưr nAiI<͢]WE# 2R4(ExqI56#r6=KJqʿcivDPMjpuy>-_מm>|E0qZ 6ķue0c0]cuʱ \HP3PE[o>GSnj]҃Z*Yzį;9S vo`a15`ZQ'wqm-v6*7nsi+fS\1@$9$nN/HṊu1oۛvNwxI%ڍ Ig| KIh;GivF᫑B3c8bȻuQWpOʇ˺-%W{榅w57xez`.Ҫ*ח R9p34db++@b\5b mM TLL _u\MvАm4[uFXޖ9?/^TbrdQT$~*]GYuh1!gQG5\D$wh!9F y$3c_#`}.{0kD2ҴO#lH|ea[U!$. `S݉^Ti /5,IЉ[TsE-F!7%nD ˹ gG0G P>M&-EAP‚HN1«/,<&U{ؠ^z?ƦSܘvꇒtal\1ao5u}Zsn@&5@N(^/]֟ܡ8{z4^LoI R gI֖ sX<]vw)Q.`52>ﵜ_5ďpVZ:wI^]JwKc/yN W:龫~> z#P}ߔ_@iF;|AiLVy~1KH\IrY1[ 6m[ ǵtNC'V:,3@8(`&D 4}(UKzjBEY{ދz6GUG!ri@Ii|Y\]͢p-Vlj~u{}s^m|ДR?0$&ބvn FDd/Aae\c3iͩBȔgذ(χIڜU:!yݹ n͗MCœJm6%\tƋl;Hu`?ʚGhp~S KFZ\w^ӟYbp!vJ$iSID C a 8jd[[sZE6"͎a n8*OO} P1han_>le4ȯƨ99hOfɋ -Z9='oȆEܙNB rdiSVT0Bơ9wK m`Kor$`v`WzF*hT #RKP]]c[[z  d^i' 5KghtN0 wSyC8KSW+fwv3Q<, b&'sohD1|0Cc w@r 5?'_T U"R\zԀ*:EwRc |9Bg^{ +[( 0+kD&4 6S6 %1Zo7Ji@Yy㔷fp{W'}pqcC͒.bB"KxTtzTMThqma*Ԝ6IA6nVm8ub~!Eg< ^,B 2T3d RhՀi*x63}\w3`iHZDX.E^Wojjj.r1VvFķ…BH~fjbGmWE陓 /@W[=*U )X񈶽 g-VL奂Tn<=_wC= -HpέX"ؼ+)TJA $bA)-s(ۇim~ni,r9Jp+oƈK@;CE3YbԻJL ^vS͋lӤtqPt.ۣe7)RsX;PoͿGz -uڰ9:IIA*2D$(O,Urzu75VppAE/ҫK,: EddcH\ZVI4px ?kN2xpap2x"[p4h/UT_,I|3?\RIo\iX՞ ۾J`ʺtZd(i:nF=ACX3X}g;dKv`\ lqZe cz2l#ٹI5hm0Un5;W}(ݳćvD&[aS7A( e{!xR6[7u^s_۱$J-ڈC77 2jsg"J^lJ5XH~7&㗻-% ?Qړt|%xW_S82B+3bwa%:l:$$xE㾻%ʼvʈ gy" 9w٪H|ꓴuxJYΌ.;v^8Œsؤ?RX~ÌȘEc!>sџIEPIZl{MV6,\'.dR#t]5݋$NlIZ#~! G&nxl#vvB?um x)nM9uiM˾ ƭJ?j߼!Zwbhy*HaWRҙ,/ʼ8q>3-h&N՗=$$TΒsmȈТyZtea ,&>fFmR!lD$;y1*m #u̎GHyP_j+=iOVx&G43W= rs⚎,r1tD4V)7~ Wbh[aO<A`i.Cy>OAl; ֡Kaɳ}4r\>gd՛SBUw  Oh{ +l]QkN=\IY|4Mm,lt‘# ⚼VFMO: Mh"TǪ|PlR=;qZɕQ1݊Ž\h0W FM2- ; |:o-XaBík>k`ӱn-HFyUG"d*1Fwe3JO$oBPgq8.;k}'G@!!s\gԁV.ٽ(ڰ[NSYj 7izW30[4%3@ 'ihba0TE2)D X5 Eėԋ+q%FvCJWNxki&3|"{]gZ8PJۉ9k'&?X0Ł),E;Ah^X(7N6߇E=aoOH"`~GFn) 5IMw=tEzN/OwcQfl4UN%GѨy2qI;#±l ,_Mete~Trm䌖i+ï_xe*~F{\dj57jHeQfeډFPPЮoѪw ٻq&04;1buzf+h[u}k\{H}6V_pA@NS{1åpK2|Qp%#t4Ϙ6 OaexV~'{)L\1^KI@W-ۋ);Br5<6Y,X4 7S^@0|SV]>wEG)KG`įlvk x C [s|Tq/`,uO/WnVNBQT#H2XqcxM̹|)mNZ!@ݺͶ7!MIM ż?,%PP8`g]PURwynmȬ;dL*\$ARvAә%ZWsQǰ _Z+-ReʎQmE͵7 cQWDm-[fюD=L' c"{72}# ZC">D tw^qȭ՟9H9c_(ڗ̯a\3j*JS/(DI8En B-rh߄d-" /(t9_WQFIđ@ߟ{/VQOt`_\# FBۅ˶ܽJ3mL]*+C6"l辞ae)QYh!#1V/wn۱Y/ѢֿҪ8 G{dYsT d\h.ICT5e2Ⱦs ";Wk;h=o gP{xnƿ7JfAl9_r˶qk^il7e\y=+[: ʸ}c@3 꼩ʩNrEynw9'B'O#Z ,{*:fpIGMDtB=.KҤǜ[='plEHJ-\mmWDCЖ=ٹlm<_ISbMٷh8 ŕ0\@,_H<"ُ+U:|QIJ_]?ꢺBft0*ٜ it/n-S*X|&H57Ycs+Ƕ,d#4oِ剹T$nU1<_'W4HĒEO)Qtpar}jL d]']v;zT"(>`jաQF?@şPUD8jPU \ns*XGf7k{FjmFMfx@O.e3yY2}bm7^K5xi~3/+X[GN6,vM0YهH,kOQaŦ;WjW`_NsvfpNªE%_{H,_f"d㨜_VԀ>il0B c9*8,R.C \. l7D12(НA"nCpf5dvxսE\,`^oFͼ$}XtP@(rv*u/٩-ݹeG݈])J|pAoyFy74`y `5:-ʠF #m]<^MCWe%|EQCL BQHS4hƐn+,Ť#J+ xyodc8d166atGb0 k8E is sv돈Ip$cG8p9"O]5~i Kb$ۛ*T՛m#IIUsUBVeLD6 Bc˰ae41f,5P>hE_~pG-J&aXO2>71k*Gad2G[I~rr*b.0Y3 VET$%kn\RBqwhɉ̒2ŠU n] 'v2wxL$7S";љbH>d\aBMcIO`{\ܽ:{/,6fd s)D3y;- +uՃ Jv&6_㸉a߂8 wqɔ'3*CE/6mL.Ͱ܊`-_L_3NM0K (*qO*&T,ze>ޝdEmcD6tiwpҥCք0=FaFg~J/ M(dX1jk HMMQR%F4ȼ#Z/;!KUUKEES;4FxQajTZb_b;:J~cSQJڋQ߻X? `m QWX}?PsF J5<'|";ܕ.)iI{PDj{Ķ`ܳA.yrBbp`ߥgkeEO c02 I|i}2) Däj5`ap2Mz?WJP̃K7IUMVqCen9G|٩?ȯ,W^De %oU?"j4!fC*0l^EeGn;ФĪi!={46)VbSKQ4S˿R$Usͷ F_asTUo!QQMLu(ajV&0ᷯi E)aqw{b"Ҧn:WH,U bUB$f^__yM̨V !3|[njM`հ+^s?M ǖFVp>kw_3m~ Gv1d84]X8`0}4:Bz1EU[пlJS =b:RIЎuLֵg[$JQmN-zX#ih3-'Nȧa L~(EoK66GEkxT/Ϛ% _vqH. Tq^[e1( ‚vZFN҄V 4RPW":#4I~T5bR3eɫ >BC%%]cN^P kgR9%#}^v|6mA,> pQl.&}1{s vY]?i^]}h+~nH3] qKz8kHwBh aI_>*I&X0q0ofDX:]j 3i?9en1N}'A-ES$WKAB:WsvŶ^j1zl6T҇'*A&ŹdMH3?1N:#2[M}jeP/U? Gbi諺V Cp.GԱ۠5=n@Y{\//"lf*] X/4{=gv>^,-g'[6U9HUW36ڒOFfwd:m-10O#3j"M5s$N'[\"p3iaq䱳D4dYtZ*oCz })=+ if5(uGGI^&@e($iEP 4D0vDkbG|;(;wJ1+c{̬n)tѽ̽r^CjUPj9(g^g!g+\6Mem>8]>IO2 o5uG] M1 jCjSM?u5f ML=o`ssЬ>AuvLF/jD+c )ֽ8ejg'O|9tE!ͷL) 2uh F{9c6) AI퍩.j~%։W„NP!h$s\j5̂meYxpoޘAf9j=[ )#oZSLB`uᤔ+KB|V_z ƧFG=6,7k"^o1(Aec}ۡby3sHf!I{SFUgfzp6 qj*ZFʜy"ׁf*b1]3r˫vAfjs4mGDN^,^_&4Æ-SlK&v@ؠ'B#8y)'LWT5q eb,|%.pye%I;vQ"l th/c~rM̉9$#,?I]$F/;x'_2% Mp^eN7>Fo`]^1#OGJoFlm\=vHN"=Tҧ{H#MtO@<'BzX/P\ A0~.щ2MږGX>U:n5ط KmJbgݫH djNšX۳ކ2 I5%tt'!:6"Hi&[{ZbbƔlZK*jd%Qkc(;Bm5Q $SHٙk\-_.*S8h튅kAs~8,IAձ5@I]3kKǙ}wm^RFnUkk",:NBG"K6'm/~cߚz d R !Dz<ɧGJC bwG &N94i<~Lܵh %*e,w=jbftU ϏS_BL\;D0 TOZ6F(e3U\9Q;Dj^^~M^KR v/=eJsMD܍P?yV ÖS*{#IuN !?RT1#ӞjJob^Z7.)FFUs=R}"O6 ( # [-<]*Lq5@&9'׼/ ^uwEMH EHk:YOꂞhU5ovpNLJHSs$̥(b;W}Kq 氹2+t}܏P%]]O؁'hCq3 ҂(*d/ʲh).A+{F^ qj>"Xa0Ŗ(:F ny lM` -0цKK39/_(CbC̴8jYt2kfc 5Q'iW=RsNwQyZ)#VcHA˖'g_2q&{GXzgQ-Vgґ\v1|-]0]RY͉^ 2rX<d#vQXBR餽fMDTmjY$:ѼX'm 2DoP`y7CN7OaxL0*_gWSB=!iq XE/+Vx`'7',v 'ɭ"8 R¸NgSšbC'ya 8'h%coVį:!ݐp!]CI+MQ;wI=r03y?><*F홸Gi VJSBZošyI*POC9 *hOT40,h@FbfuptFC޸AәiGyz4zb{ v~B,P#4^`Sq]mJU{Hm}e֛y'ZH6 y5@RQdX1m^ \PWdZ*+TδtUn$ldqp1L Ž&NuS]V(C=YCoDŽ Z]"4z{vX]I* yԣ6)VvMjcf08ɈGeM,#͗[)e?JU 2qڸ#m$Y%< Z mΨ|rJN]ӕrɴR2Ϥjc^]ۉS?辇o_%'w:8ŶgbC#S">SQ Ii|l7Q-$ n -+a`9Sc痘`@`[7<R=_ UU*PV]Fr\eLVPCSQ:H$U&VU @qj65eb_b^=oF8`8R4s|G)G:X.uVb24`Qv?x_0'1n,a]iFwul!v`trȭ3dz W<74V O>ɝ!`26GR =ѫu=#=1/Eظ;rf8۞wBs]͐ԉʌ+V xUw$qi"\7M)0s82DĬ/9U6Tj3J%=Gm)G"s:ab0E/MH:; ŧSHWsI[9E{\%!z/#s=TE!3bpg{:6f'\Gvvo_~Zfhuqr4W"( +XJ* 9 fr`T#]+ϙDZ4o0KmÔ^YմzF{7+@PM]3ؒhK#>NpV¶i_JţBCX_8h 3P3 `n;]sy%ߕ9IJ4:s5'wk:2D{52x-iQVۮKAT.ɅűRMB_h{{, ίvTl0hC6Z,hV[/']9,hn7_)%tPV9xe)M|I,ϑx`D/VC/;4:7^g2{o6 yUFrjهh#BS&]R6=Ђ[躠w Ʊhbdc4y(Ȟ^d>C+9ywz[1q=)PmԜaI%a Vr# n;gs&Nw7I|{1 Jɜͱ )a HHM.fTΣ'YS ;/H]eWe`Ξ΀+'   ~X8ߞ$ٝ^2Y1Ol3EH'G]D2jLhH9]7ۍtkL=GUa-h/3Pw_갶` GS[n1:`Gg`*IG} WBpQ&;ϐ0mR0esenoa.=% )Ň_sbs)"0RUM+_T5}ƚ\MMc(%n(ʹCap:߯')Ah Hh*7uB'?]Z1PqڐG:ALAX} 4'n*6ND١ r{nh!Y.v{ڮ.̏nODJXrV,WyآFX /Lygrli} ' ԩ.l!Qy= KIo]-;~FcS'Yo6$we@_bdL o"OyERGF\*h E]]4b`\(93" 0wSVXp1n|om ĒQt{B#ccӲ8PpY&V>/;x BÝ] t}A^9)a2O>SK}B} 4Q69%cC34Lj Z>5mF (T4\\;qD'b7JGK%imzל#ᡖ"V!c!ދnGp*C=/=Y'_"+dGF!yЧ%=Ylq}~o30KwQ"[hG7`+aI8JieQ'/wV5R}Fϗh:"OʱlclXPdVG|oS,Ͳ91Cγ6H.g*xLvYH% t/׼T0QL nӧtiVlԸ1Zr=J$@2u@8~jjp]SV`_A[2LʼuJ :#O.N0i)yN3&m(.B/Lk؊V3iҖv+CLjm+#}k%L7M1Od΅ѵVfkzRDf9[O #T[;yN-4[? )lCծП<]j|ԙBjLWDgԝfISᤔP¶[ǎ3YbRB(S;^NlKn#^L(Ps1djډB*{nm GW1RiNF k^IΠߝ%J 2 qi? Vy3-{Bh[Vz]c!@]#?g!;Ȅ b߀&ғ(ea =qWQy(vCLAU'#=?il]JȿVK<Z FǓҏu^fta5Zp x`ŵ C'bfӆhL9TY; yc5:= i"o,k Kj:7\k@ɭ8D{U3.h%1/yBDoX{11,2U v MWM.XX?TϲIդ{S"vv .TPTjfJ? ou-QIH:лآd;h.m٤ZQiex :0ѥ#TLa9ztcRo>ёYI1w:Ft~YVߞiϵf5I]nDG]CA*QD^LYAO rI"<4`,I/dMqPO<VC#*z2VgpؤD0UEo@)jm1Nw#S9 [qacͺ~D`'xaUYR^PS{wG2u}f4kMU4n{ qQd - _svFаl]( djl=n@7e@wn#5C ;+4FNkF#+}1AZg_1U[K DKrdzTf,ETjIDsVp)wPgnSc & ŕrdzm Jj9$qu<p< Rnj8WwԏmwP,qΈM\hyqҗ-q D1)G19t:lq6Ol"pBh!WTgpc';ib'_`8y"mH)Xvπj=}H$g)?-%`V48Q_qra g.- 6aa c/)WLy힭|M-:gbRg*PWMɡ_ܵ#sPZy{cT~5]`Vv4R59MIڒLuֆ)OL:qt[mUK_aJbSˍF6Uut.yݳSWSoP B;sCWdd&K=h`ӑNU LsMeǤUȄ;X`$VZ΀-cziB=>)Ona9 ЮH=rߜT+Fe% }7ї4>PmAϛWq O' ɘ 5gb*h{Vx;ԅ[{SKd7Zβu%GԺ|+R9ognpI 4nz[1Ri`;5aO]j- gƆ42jut=U ,&b'kQBO L)?b iI2|gX }S)=&QGsyw ew "̮^a}PVǷ63HW"󶶐OBmifwlEiR[{EZ1.j ˠ;O!fg^A_]TE vlV|5 W%0.wWWf!ol$8= E霵Ɲ 75_]ץ?Z%gUOziM(u)SRK1v&'n ʓ5J4SSN@Q|Ӗ`(ѓq(a:QZ \3X7zU]<v"{{&ܢ &p],"B8k^ȾLLoy8ol#H@'kŔϓq)~frUR˵?ʊxOcLaԤ7ʮ+pk|Hmzx+ZP :T7ZН324"6-c; ‰6'7פxFW8Ѐ܈հQb$鼛fZhƲũKtBĶ'٦O:K7O#"NO3DxLSD\{8I]PP )=w?bTqcaxÄ]RN⭃,4ަgOp /, I kh .橼Lx(TZm+ kf境B*te㏼ܧI. m?G6gkEwNe͠`%""F2)-qWY"t1Vx= UT,LlPwX`0WeCbXKp @t2e9KR5=.LY{׵W`|7]/0s.[>&`B(fZ+(]օ&`*,Y,$(EV˛nN-tfzx n$a~pJEQݨ.\~ѡ%S6NO&*oJ hr}'IQ(n ʤu>aQjkeۂ2'o>"OMP559B:Ru[2uS(LkH\SX&w QjI h?Y3攳=393|i1;4Dm@Jr c`m -; 8fBsPcGö;*Y(`I$kW/ K{5㗃ABuĠfZnG򭍓ȔEЍ3gʺ?1|"+(`Qf49dU~/æ{JA"_z6Ls5DlYiDzgs٠3uN!4еomw &Ivy8Rp ņ!5B]KҒB{}IT=z1W?oOAL˨fނW^ VySE[gZ/$B51:_wN͌_Ż2}tk\.AU!λ{P Cijk3 ftr jse&D ĺ)D`|(ӐCGii(L!bm[#&SJ^Ikl0TQF%nlQA{W3#wzLx<G sZ(E%iH5_lJ Pm%D}&K`C"_/1f xاꤹeft(j=w.{}Yj}##;Wà?]QN^})WnLZ3[!oBBGʰT'KİA?pLOK]- z#fl1GmbbkF5/S?`IQ{C #/ +b䢯݄ `#[p7nxح?d6gNtaTG/z#6e780Ϡ pd,~"d|W~vu$'foR7աA{QKJu!JhK{XHzVi+(MIri"`2 @AJX}fLAV#QEBN$+|d_>4ye}xbLFB;sdCtcbΞq 7 A ?DRQ)cdYv};IQסE']K9A {v!f5=nM$a*t0ETz/ϭDX#ǡ (U V d)HKsP/cd壴k.+Y<^ل7H{eLI7y4qeuRabzR!GA+)˞u`LbšxL>Gi ׆e$C3grr,봢b_ҔT[8 /DȠxЃPJUUGTb܌(bNVP #ѥx}Hl\ƝI>H1iFnvqƌK(U)xR8U] ..HKdF!?/,/>ˌѓEZR%%U``.E,vUQ!KNyoR"J.-Ŧ` I3=|rs?waȫ˺iA#a}79>\h!weO(Nhኄ_Et\00cz^ uhUZ0zK[Gi\̲2X!@@t3׀׭ }ٟrGAwpWe=!f-ӧIU 8 .m ,Y\uQo\785EKI]mdͩ2jl5(̙#8#dM>aES Xul(ݥ0hG?eZėp:fo1YJbVGY-l7HGsr^)W%QU-Gq$p5f6j4|ԷTputlgFS\7$fn`#nŜ.W;6RIߊtbʣS<`a]kPy2 =~|.=5dLi&J7GP !{ kd9F>4~uiե} *֜i6,JFۣ{(&MH;15xJk% '6 xй)G 5ahmރ^P YR>&|˰xzeA.ꙻ3qfSs0U Hk D12-0`|laS%y^jD6ixrc^3'D/2{d 6"M:pbѕZ!P2kCμv?}L~ Y_0KR4)}`>^sZK݅ʬorEI+FؽeoYeu1(t0YvII˜ullW^q#i/F5FqSpn]wJS BQTmq(~&j"ωb;.\F9/H)0X>T+N<4Ic'5aMJÍ!0=7jߴ9O6`HA:#sb&-?y>He Fٙp8FiCKw৙Yerr\$4p JXqV=s8LhPߪbҜfrb+L&H.+m7b"qG ['#}fh&3 {Rnv#& 8#U]8i[9wIJ zErA`"}P)@c>`d^ #1߶wt\鮄8v#ۀ.chJ6bh5TGAWQ}H-! y J+LXh;wӚ q@q~F5h8y};"B_`O8\u'Gτv<*%uLu=!̈` |j//T{}eJkEH~OUFs=B^?ۇFCBG tP NG<[X$+}464?fK,9 ]ċ AnHtk0UZOX˓ ^t ,NZG8/f1Ս^4}.bbz*;)z96#[nnז^aN87U]GDr#~pƾ}>yUXaȽڴzFjrPYMHl` A"^D:cY+bT0O_Q'qlC{܉e!x3 ~u:rc. KȞv'l } F:a'( /׫^- c֟GO,؋uuLT8 {Ehj39LL,WYDt ] E/d]ͶZhRJs]DLrޚ,%)_,,^YAłNQ65?^7ؠD7z>^4|q??O57bopSnZdzn%h)UD\E[ڸUiGo6KFle6+tqun\fY[eC/g&pVd27( F y-ˀ|HLj\(+zqHTS(RKc65o-a\W|s<8uJD U/KH8GZOo 0Byprlw)-^b̅pc2@<'P3v:*b>xBdбfDwO~u^OB|g>Rr?*,NlQ?_FL\}ܪz9Ac)cnE8ӊ33+.}Oqylf( lDžz 46 P>}GL^bGB6fg,\GkL/ײ}hl9M3pBi+lNA2TR{k8E7|i,[zJ#,%K53c6oIР~gu! p@ْ\ 63ڹ\DImG~꙱)"Pnm~T I UsF'qvC}O6<0ݛOacz<f_] o 1 @<$tQs;sdvdC#fa45V?*j߽JgUs*޲g9WZ$y^*03H۴LQxڂdN£7EL߄ftΪk#R[N`nCH!H`'Pe[臡sGt)0 `\Q-⭀z̠;XO 3%0^ wעb~, j϶wE2|<Xx,֋Z]s(sV>Zs鞖VW>ztӨlťkQ.D{$jF26JhAymf*䧟[XHRQu\swˠ9"UM&dԻ^ 1~L<}b 1HmB1j6M-T{Xx`.G8)~S尉.E~/ǵ1,OIC5])wB:y]7eM!T7q}Wl-;ܿPҬiV`gC`d ][JT GMp= *9% ŪfTQ;X6J}yݯPG_n":喑X89u~t쭫ˌ?߯FƢ(XiKp U Ki,.&Y1XB=N0ǁ3Sdqm5f$CW, ga j!xv^Ԋ5%ܧ>hwZf"mb(G®'`ӐWp4_εJ.HmFcXqހ:Re_>gPb ?V+Fd't3Lu4,/.5j7 tTt;rb wDzY\9Yeϔt5,hXR EE!5}Mc[I r\In])3E+>a9g|\v:Mo:Gz'A>t75R:|uFǺ.Ӯy8+Eرibwl ի&.ibK.aR#I2xcuJ!k9(a~fn7mKo"3$cU_PZJvFF-# <#)Ϲ*=qA&1>5e^+RIUj([܀H+.O >ӟDW{b/ l=t  ^=<32Gbtnt=34Ki==[p:cE>]h߾\իa5&wZ DғUc%E!@eG1Р8O~(\j)|su7.g͋ʛ؆ He]B]mmmUҖQ?xQ%PY> (a1[ezF02`")EÐ20+ LCKZك9-uW]4R$?ZjyYWx{<-x:*ݠ4q-BT |_JX9{?=`G, XTƥeD /DDv!vhm%Zڴ伃U= **G,oX& @gVYz*yL07K|#5( 0nBR.k ձ4\!wk$=1O ~%@ w0}fm,Ж ^no+s!r]ي\k[swS]17%/Q,y!cQAߠW *?Z:UCCbiI4plRJh.B|4:5aG1:B<-Ŗ){_(J1'x٘6dskZD<Oo MID{%o<,wK^YoRcj9t?O%Hؕb( vI`=w{{$Ʈ(6O)M)%B؟i2z.}:-U[\ZȣWel1@G:=WF.9U;^?%uհZms.`3_d )l8jZCy |>aqK _9@-sM}PNFBI~=gDo9YI)>33vsWf2"nRN$q F$ǘ%p/ fţ S#m. quB nh2s.'Wræ}EIg爻Ae sX_=:>VHB`+ ϶7q Dx6C%[RφaWR*a%PJ~"6϶~|A *U˯ & 9 /ۤkI`K]Mv͝WX2 }^"~4Kf΋u=ߗ<`e݀?8)whOeN0ӴN)(Wh}a Y>;=VNwc)onD"*iLd9ȕ1aPC Zxmټ y|Dr|@ъ%l^VA rC%@2XMpҌ02"\ڞO{q$|2 8bLF"`Nײ~:&j;szލ*jcStzk{r^*~鿖,9&Ms)lU6 MUo+:$RaEOٮve7x}3QUބT݈Cy;1Npe[8 Ch ` gğnf[I CC],53[}O޽CKڏyb:w-Z!qށLg# 2& j&z|qjN9m* o2afBn0$3 (- C,Zqћik1l$=8^0K~'6fkK^r qwr `[,7!n#QQfSO)"WfU oEƄ7b 4:m&^-J{E#1k[Q[Jh'XTcͼ3VOIiqKoX?{ Z|Om#?d H!M݀2^f߹'=] MgIO*ILHS gmvnЍ<,I{O ˶ LJJo_-^%ަ(6Ԁ5g,9(K̐JX~jX>и 7LZZx61#ƼxXTM.5N#1yfx<4& w?kΜs) ҄?|5"wc&o,A8d#PN0 GGdY t8o-]o} [Ou[w"v9qsϚlz@F,L#y? 9i%s `(fo}=Hbժ7JU8ɪ$/!(SRd.ђymroțyHyxr \H`/<SbŦVT6u12FU; \Jɨ aZp!ܵXx;:N>S/ڬxBIgu!j]db{YۖkUL*hO&h'۷Fg6K[x Vh&V4D`|pwv= ί9މ[sxb!yat"JxW+dJ@IM/9wRYk%?oM4Nb'ʓ̾Ed/Ns<2)=_gE=CA#R`Zmc-=[!Tʰj@U%AMbO߭o"lNWZ  ƻ"g@HsodY5tS{ȒMg'-4 :F:UߴW$vJuiSF}1\jf5 ,@.1 h<.TfWb9%y{43r"ϒZ/w35jxʏ;#8q󽆊i~K?p_Ht/h|nGZ҄]w=e*5O6z&_ѝRVZݕ5+ڈ5輫~%|0Sx!dYҾQVd0f9y$2޳"oX눴% pj 5C3lʇj0*Ph{iTzܵ;ȯZH2p!O'#_}e^SU<6$(/){IS+Cx7[=AtT) ~T^Pvqԭ$sI\EҮxkD]sxB['o/敽#F;ۅ;x5dڃ{[(ЭҰ0C8Gx%U{Fepk8G޾Oĵa:Q+~%H%ƓUϧ}G( Z ktjaUX:0!V2 $R Q rmV\CH3SȖB{h~"iFWŌlw"fLt="([NB mL[!d~gLF GW//z%֩X|2_m*$btOg _XZ1>Z .d "ڡ@ J~rV=RsO@Q0ͳZ[k,E %V|Y` ݌t+?Й5U>z1fiBq82!At |#$~Qdg8j/J{4S] z(vk^s}x-ӏ9{ftë-l)Ϛ^~ o/Okn8>r-$V7x̫A \ ݑeXX%@ ɉ?Ԝ<֡Kipv |`H= mD)þ!연Tߩ=-W3DlT z_>iNhLfi6<~B˹"`ov$J^ WecU=j^(vPB&ai~,KNJAaϺ+^ъ_yJO?N8:(ex(42z?/ -M"bQ D̲S)c#teHX_?~Dp-Xd;ZTx9 Rπ6'^s. BvDϘwFdY?fnouAe&JkCB8\ex}ha %z"c7diܐc=93BD\@v]qr1XQOXeN,u` `ϡKY2lp(tgϏ t BKЗ\wI[@|mfuvSqv70fyC@ X(Oϯϔ`c!I6fj:OUmd`&j!8s.S#0 75,20 5o~d0bhZa'G25%]1H^~-JtojO͔-Y`Bjslr4Ioxj#$]3{Z(̻C4RDI"nQUWi4o. m7w 庻m4W =JoY”< Ђ:wtչ=[ZYԔ Lb}‚MM!5dFɘ\ vO«eUyH^)<*iRs. $WQ?Z}E-UG@3*zéh8s8cHb ƑmĶƐxVk'Y(\^:\lKq2$99=Qhׅy ru,0ݤWm,A + oY#S`fjdѦ4phyrs칙'&!ȵe}\OCvv&NMV.浒W>|&QJ^)g3i#R:fg<(8s:mAY07R-3g[]`;TZE$pQ6Mo:5%_!L| V8 "t'7Bsj{z_:m-oF7_4){3uaٖݨ&ߕx+.fK +픃[x:G*v8c!Gm2;kQu>e7aYHbMV%vO8,VOK:rL XbRhZ `S+^F3tu" E]*ԤpcQZd'9ٶ 9D.S&85qH,9e=`Xfo L !@ܗ&9m#MtFz^TG)"數rŮG'ưQh2p;~n^N 2|(/%B{vpU8cֺ^۷=C(_䋩*= hͻ3ѬVmH:B^8"@" P sN_`|8Mn"^#[Y(;xX[(rX]6-s7fZ4}Onr)+gw"(Ԯec^wC0c,'Kxwg<-_Y5Xp((:&TƐۯH d}pOt߱:H:b[\_m}ʷF1BTk-A xK׫S)M 0@̬TԚML`̂MQ ܧ9Y fp+k@|P}φȘPŷzm.u9&D6 ~^M$ϔ,>(7)[E_·i@@VD lFy;;9wĀߛHBڬ AH靯"1>Xp|4zr3@Ow"aO: [=p? M'=`Z/ ov! B`Xf}-kJlwu  RW3>h<F$Y`3r,aI,9g9aH;$ڮgؚU:<9 fF_ʭ5"ZMhlBsh7A;EG?V^`]Uz|Mi:`pt\~Bn@'5+ꗝ{.Dy3ז3+ 7 ws>Uy]UK۹P2cƣxDwQ/uyfa#⡣X}:'}gZ˝BZpقfmc6+%=ztZ>tROc[G56wQVٜ+; \2a^RlxP@.{KTurw!d7LN۶{IFF'^bB/\jLB+Wq~`2; 5k\( UKC!VFM`ɮ>':t+M$II({*I~pqd+cc+{,DA }:+U( S/ЅjnGb ic/f&t̥cR>N<@۫[9Tq⼦bP h&tvIWN^XJO1#ZCӰD=3d<}i]]Ab8J#CXC8zqQLX^w}=u # !0p*1Ɨ-$u57[_ ̠4V _W9E҄˩]%.<,4ޝ4*lehek|JDF-.u7lViJ &yN\ {qSCD/x-hoDtq;`\yڣ܇[D`^Pl╤{@DֹD|98mpԢ:V0#t2+=|Mϳt|2RCD|:N s`d*L75ەz 60&~[}1u^Y<c?VS9TK`9~oZ`-]4O?q; %j3)\::!R`W5p}ϩq싩0auLIE&U(4T FxW`n!(@?vNaXzNtW<#>{pZ% H|+}{B@m n/ɹKJiY=?FAP4}>kWwh\8J L1vvy¢> 5ՌuUys/Urc&#%(T+ce_it=6~()~޻BP@P{O0ިA/F6E5;ٜ MA>nh>(㦯O1dvpt3~ K|2. &¦@,y,.806uhG@?/0߮DI*YR^_h#'3z-pAXިԾw{j),VTw7{ÇUFSp/AzJQYu၌q1=}BZ $2*VA͠UAMt-ԩC]L@|Jy"m=i\7?jȹhS_CU1hQ CmD٧Y~@5 /;J)P/v>-;c\ĦD!5cuD[Zђ^6Jۉ1O8);e/U>69h]ݹU"avʏ@T>hK=GϥM fL/yNOZsDX상E-'Sğ<պ +b&` W>Õ 1ِ~8(8.@6-gK,] 7MR42;>HjC(iSlc~fO zBp*jWW#sz3 >De 4DYi/<ᦔeQ?̦AcT|Zd\kh~3x@6NQ~ˡ(K$){'L<Kf^&a+fP"~!G^LlGSf8e[+w_= 3;S}^X@-h Pl5{=\dzʥەfI8"<>FQ6h$M;8_[O`wRt?.]jcakGe(C$mp2j;I7Av1ϛ?iC):>: ]荴TG{"~f V hqEbs7GV/&#LQ,s7u?{omrAMvf/tmmB4bp$Vݨ U :! hi] Tm7Ӳvs)amԶ݆s`T _1W=K6K[t`6հbcRO*I%%#qQf{׳[mي;ؽ>A5p/}0ж"&5$1Z~ @]%`5'C[;57AMerebLL7%7m>!-ut٦ BrA4$n0O6#Z#_N*Om "|y5l!iN\r3}odg#53s긽3Fr-mD _$._@jwi$I_S <3Z`xIn/5a)$-[$T؇P5h"|My/$<.ѡʖg=i_\I Gl -Wbɲ`٭sO笃}|fH56^)߬?.lp`þk<6 83nFm 4Zi{ח 4!XBV{Oĝy9FLt%D'|4 [\?#5_ڑq,~%)j}:HJ\|z@8w$0Tbꁂ X}w.47%oKNyHe""Rv#q_2|S 1?5[]0?%}Ϙag9KDmot2YFx0pY|vUOg/B2.1!"g1D'&I1 Ӑܧ싶xCHZyO|`bd*HEUUuf9%0,,[P|xpE!PbgUQ>u,67ԇT%F`Gؾ|teYvb=C..fh0)Z(pEiNAd\l GBG( Ϣ:L54=h[0SK7`L`}=~:o0Kי2^'jdğwa Ұ_߈=yk@U5ysd/Դ^,]^dž 9{rٝ)ф!T`fE հ)h߁5՟3D/X:+o炩-/G7l0-U{cķ(pn# =+ !Z:mafZODt ~wSXv5&7b_W$\&z2Vw8KKMJi鲤+U2C9s^>1&gx .=i4/gNmܜڍ 6t'/\+R# m)CCCy >X\vbu)+l[~7bDA. 7Cvw,5cPk$}3w xc13k:śCet9LĜƏW#p'5^TLhRG+@p4i"xb^'3_4#S 3Dl.bM眵cˎ]fXp30;|Kv 5V㜃iM0Ɠb{S띫M}~ld!{(c|'@#dC$eɎ'j$%aBהG#iAY?Y/bEmbAIlc\.:n;twU*d.Ip IpN |:\$HBu"iunWਫ(3_G!ShχpC_\`F/IΊ7Ul#X ckOm*)J#)vJϯ&}AG?3s4qXI m1JѹUW{PGiD8[ac864X**~7 =Q9ȯ(TI=sML.6Q4-ʦsISr~E?.01bȢ?QNJl#v?/I˫= EP?Rf PHx'-~x]=x}3:h8L-^8Sûi~`?zDm1(Vv|Tdq̝6]]ز jsd1TKSۗU\ޗӁyfL9<,w"Ժ]// ECNR\K]ZZ?(%#R=KBS:Gl$;A1B ҰWhP"TN@5Ơ?™sDn%eLug797])eYf*:hhb%SM\=-l׫ͯc3ot#F};Fa943cz1tq[Bf!}GՂ23-p0z%f˜W3~ ou26UA6Bը‡IPd20⛌\zAγ4ECT!fW)]; XH 4W)zbuۓ~y\5÷Kp N1OEVe}6tNjulH<ۉ2/Gg|'$=ҝ e$^(FtP!h罁'mslZ!> TzzL4%cc6h7"|k+b9 Aw8KR:ˉW\ jMݜ=CBxrbLS(oK8ʷlWzA\(ӊY:8>pm ?@Xt7ɼi;`/}7(KFza…Rsw{)~MB=p[BCфcB)jV:ǝJG<}"-qN/̨}f4S)H߭լ0F =,aDP0|Z$>LȱO^yHab178̽%·;6rКp_-+T4Cp*用#z5Fy߈@XVkzF5{yas,>5Z(fGWN*n5py t0{Itd2&xjGv0j oK.\>LK_ @,$U;5yrų9U KRA^ ЇXI,]0P2f8Oqͭ@G)bκ? +}hcvޢ$XGDO}T|f)˧*.&p)W=nLP09 xv*\o&C2$0;wi'sX{"f)2l!) $ުY7cR4SІ贘ݪ2LԋβZmZjگ*N1>aSzWܪ M(QB/}s?ґ+1%$pZ]meŷ#[To\quiY嗠)5G4݁%,q1M1$FBֺ@I2אX~ ͏VGm,p.R'Ni!Ti"ɖn(VOxI]lz[94e0K*wpWf#>3Șa7Pw ÞFc4(_@wH}3^NLb)pw ^f'w$g3(2QBtq"89;m>cOz~!هS>cUm$Ei$ݪCR%eʵٓBnIVnЌ?Z4л%3BWx!8ܽ"jgE' Nv }X=Xg 9/[y`OldMiM'sH&t,\ɯLhN' eaH`E2'²P $jΆ4f(j롩y(Ww320 hAϧD2(o Z"@ocmlfĂܦQ0h3[y nd{:?3Z``6wT @dO0ae^{֟~3ף/J|a|[c v@rY!J(3!oi]*SR{#Jzx5SSz4Pqt&I^n/k$Hh;֭yLHBzG5Vj0 㕍2fp{~.@qqB U9ze 4-XE YrM*3s\M|}Dq*$ (F.k2FT6MmΉY,q4+g(*W&,K3hr?e쨹f0c lt۝¼I@&Q,>6FOrẅ-G7ĦqxaXeFfiKO7頢Y[]fmX. G%1XCc>>#U?Mƙ ~Llz@ f?Le:)pib=jש]–MEl^UMawFec~ Dtg򉳎0]8eDd.)떢YjfviVE6Ԗ&Nm\ IC,\IA(9"I[VO"blA#A-09DAci6k*cS(n8|@Eyr=XqlLt}Ŀj|193JѲbgMZ 'ƑI8X&{%vbS 2$@rTt' `%(/𰺐3s)bTڀ\ĥaTf'9B&@Q&SjQ˾[ǡ%($(,>H췺V꟫/kK6z *p_x¸ikHeqQJ .ЀǜS'(JB'F`D곓Mu5C%rVz1^l =BTݕKꇓjH,W^(WDqWN޾iܤؿC'H$a?Į@bqƿ+ӱ揩`}ô ?m;gFgه/껟jtrRԚj?TJ0bGֻvwŢV"L9Ь?}Mw31 3QIe8A4mm ~%GXqWx(`vn(%,C&XF޳ ~Oz+ykE)8eWr@NDsx/ ө|1W_:I%aEEEX_w­{?`WuR㙢bC_旬k Av8H?S`z >w`Ģ5q|1;3|4j+vKB V͸WϞF<)܏00f8+u-OHM,ʻQa|yoq&'AOˀt#QaL#ov33Q&_ icrC 8K )R^V[~ }p2ignEG m 1_ T7/{Wu3>?IժpgtbuR1LnZ _żP!׭@ƻ]TgPeC;vڙ9z eokvL5 Ru{ڟH1W RLNh&.IOZ*R$4!ƮĤV 9ȳB@XG\9#옘/i %xj0L;Ǟ%((~` Pz̧T7:z>=}U Xqj2,+5MUxv\n 1BNx\~m= : Ù[G](ht2c  (>Xa ãPҪC I6읖+)ހS홝d[qo,k"E k5z@0-k%e0jF[at,Ƶ 6Ѐö9kv%My9^Wy78? LCQEPH'T=Mep|K6q6:H9MZ[,39==ܗ,u ?CM mPyB\ktHx<ŗ ^e}o |\ܺx7 m‹ZjvDR3j!-X%jo~f%5)ۋ$/G4}R,m};- q!v5d9VJ1:u-AE;8+oqP8Ӄrܚ^F;&TܿEgD7P{9R9PxS̓C^,hjqш ?P3cL-{CŊW}[7/ض`>@DnꞣeFaDնVU;eD}̨2~ YuY<*E3'v1pL2 cO~ y#D,Ѡذu?IބJ1ON Y(JhO79j.!Xx⃌W tB2HmڲVI{L,)ur}j#v]0,O\?| >ؿQ'.@rau@s@˕>;iZ1Iꢴ#wh?.hwpbK ձ1aNNE Қby Y4AvfDWƩ r.s 2`@$g'&TŵA b)h;JiēX-fr<1599CxV uM r6VFKB:{omdGktDY΢M9d˔:ZaĆx5A/ӌLTATRGqROjWϩ2Xs[>Q(]>$GPlj@h9P|>:JL<{\LAvt"!,K'LHK!n8hYyHm %ʞdGjqMɱ8vYQ@vY`6]O4"@%8tF{1ZO}Qf!agxA>Q`28sOwcnSuE:ݓo%a=Mg7k=NS} 2 u T: '{*Vm j3םT5yك.NiϹ_i*< Gޮ[Tzh[c>Bȸj/n Y'Gc<]j #rsfoN,a>}fD*_<6wޙxou&..~0=RtO~/%b&Va-@a~wmГe Egۊ;v2hβ\HmkVؓ} ' ׂ&Ögh_6^s}Tu1q*v<8rH߬08)%jz/!-AO%9N |U0 0S;.tȄJ~Tط7"Wͩ/Kͱ]ߊM `$ q|#"*9OtM{N̡d/X3U1͑@$$X.A%WMch_V].,Bk<@;ne {`/{286%sdM! S\X{!# Ȑu|P8ae/* 3۲a.J5d&S8Gs};lzX… ' $d~\*. , ؔxDDHb;NК-քҕjﺻGp jdx$ڎD/0mofP( &lmNb߯Mh,Ti?U&i() E.6QJ<(`2t\,|y7ShUxטY?3ƯiO'kp("7!DNFRdVA?nM另;L?nmy: gE0`? Qtx*6 Nkwa_MP9;: U@6$t\fZB |_$ˁHHNG]D^pO+l.)Ni{˴$j3~urb̧,JH<^/g򮧁]!g|K?طւFQ5q=zEoFPXJ< !Vd B^/ž7#:pm@&|J%rr^ɐL"d697hN.mpx i!D97i܁aiobHr59iy2ρX,5E]ʙӐ7CӍ$9M}/7%tѺ ZWb + wxnمU&UTtl3tb_:W2ϲOx|&&\yUZ5|*#1ADc,FFT%:LL4 :fHOs5h`*S W&MYUˇ կv[ny6 `P@~+w[Xfj&5ѬP$ 숳pPC6E.L%t\22bصMdv2F\h8^ S0˶M+AT5F72&6K[U8|ũE§GHQ M{AxebA洹x#\r3;/J&Z O\m rv yl.17zꃔcWN"8I鍤<~[M?~5qs#q.u<0 zypzI;q3Xh2?M Eu)HmW;ksԬlQd4 mJւݦqG$M_gΚyCڬB7ZmK\$Hل9&TlR^{E,~Z'~pdv0Jh)#ω`&F28ڸǣdw;nv9 K%@$8{@HD ·qXn/9 q9x|6h5A4WVOv æ&S@3T#|]ف<KFY Nmc= 74i<R#!yx,E6@|"$.g$S3Y5|]ҪZ u> 2ŝ?t$?yܸKb lNb1h]ѽ"mmZ(6YIO8ط`Oo^ջ9O3(PgN|m4oFSH/F\|/+@LlZ3<_t¿< bB  a\$LBۃu<"Po|K;ˠIͳK{sӕM،ӤmǸ6p^Pgԛ)g/{f1o: cUF8LBC:D(` 0b`0JyLj* {ss=8xSD"!Q9&:g@CDŽi{6kKuiiEwDڀ?i#k*4 VD< 0=SF?rv"goQH#oF@TbN(*Z9/.2EA⦳Ƈmۓ klu XJ8 Qcp;3*ch2]W*Ú?*i.\gj6B2\r 6!|&*9[-" ߤ3%_er"p\~wxcC:)8W2s-3++㠰62 T*ѡEUl[N!+&P _ci_TodbbbtΎEBWD d((#vDCJJ@ J~IlSSΏ)(B@(`JP萮Rb˪4V82wk&wO߼( w Ʀg3ʅR:H(ZF+)_2 Ђ?DId1 DDBbDŻep|iIN );,h/puc3-s(.(2^Ƿ5tu\(̻I7@n&ͽ|V|^d͝"88̴OY0B(F+XCKdMxT7` )Do+L 8vF010&F"^|C-nȋ_RR̫b> v?* 1 ܄٥ŏRK[D]4|~sXO/ڵVQs:/=O=yg"[kƃ5y1_{#7v3jWƔkyqSJ,#FT #b)b'1ܲyƹy_F~J)J5>0~0oyS =*5h;8[aMN,+sVO7ͭ$hy( (WcV&#j0Ϩ^fkh, _'7<]+nOGO8ME0Yf|⪈QAxt'ȟ'/aw|+A~h ɲ,'~b`]stJ<B` Vwr HԛLh#X [L1 h*4ސF0΁,:E"p6y:&ܳ!<_'3nⱬ`y\Bf!_[@!vGuAIK'Ql4_ Ÿ{BJ7iؘ5*t6S`KQ.Bp1>_iCF4AWM ^ / p&HD-wp7FJfwY@K`/DX[ U0qR5:,Ho,N7.Ag+b)8IkFRgYe v&Amb(T(QstsͶ >b>nB+g t,giDr 2Q#E n!>HLtHH1`QJ\MvbȐ4Z-@e7E$R-wVs15̆!exBcJY~fOG2ۢT>@j kdD^k{8t59[P EU{]DeLJlMsT:4$Y_~Ծ5?c6#"5uxXK,? N = eqGakqE,\YqFzToc?݇em@Dvo=9 ȾJzZ>u 6o @>Op(72XwAA2#.Ɲ|$=8,="+g(DqSVC+!RA,wD]nV~;4 ~7XjS<A'|1->WPIS8cR^B*fN凸:V!]b-Ҥ#!}1S\ߪ HK`jfwbj*=rC)uܫ ͨ<Z[ܛ̩aXQ<6E]?rK j;iW@@bhBhú `jlF+5b}k6v" ZRМZ R Z2%V*cϸmv<mwxRn]h b}VM2~Mճ(1݀o>r:Xr>c_I{ *ˬmi>[j6ՕmfBFT۩d5^ XG\60V~B2U}!Ȍ[0T\-aAdB!xQ[ZHjתDK%`=7sb=#vཁ)AUϨA .Q-!Զp=gXB۝ BAJ"T,3G4_fȻk!ecC>iMZ(O9Wv] u쨷y[1 Ja> DB`r=}nRE4VN =qouBͻ\3 Mӹ~_&wbHu5> Ai^{P9kE, 뱹1{`&o G K9W,?}TJ΍zylLeDܦw;-!Dv#8o&Dr 'FW/Fˇa(uUT*Ne'IUBpEa6;zV ޱpH5G씨,f$kkYWP&DZ1)'vR *~w>.zZ\ꃚq;l UuGG,N.{N1aQ : M/;&gl~G,pA`uJ₰?aj;2:1DЎ~ P"(v!:msu'ۂ_ɧ SB leQҼn/XG$oGwx[w Oezt 1 _w c 躨{zMDG62%C&;j~_@LĘlDxiFQ&6!\JT懒lٹpݔ@ &d -%3z䇣*$Y9F|fVr25y팦 `xZrF=棻Wݭ=|-!v$`ZᲣчf?9V. #eB*>.Y_զ>':L#2X[Imՙlw'VȢT0fjZE+8@WŅ=v1 ɛxnRǠ6lAj!/ax:s}e39Vڕi^zԷ8iC >I7ʻI~LRp`\LjZs#ĭHWlb}-~-{L"eL}oǙ=y?'*H)<~*9'J1au09E5/)~ ? 0C[ ~[ nҢF?>A^]%AeSTaM[1'ՎZ%$iyNut5`}f{(vYq(Af1z ڔsjj2>njR$ }Y52Qm\S#14_ J'X@3vckujH1Oxfb C]fR; vx  #Ȩ4Rnێ]w;*Զly:imXlNW-8wA IjN7IfԈmݠ<#]E8u*;'1: d. N5Gjuk͢&zQwkLh.RIÃw?vmKzH:r@@: \!ԱNOOkT07[ho!C̾"gD2ք Ce1^Pc\~//V*5H*D޺җl%M%KC=DMY7PSQYjr4H # r&xRC#1XЁsVm,aZdpT#f2]TAPNki+`KS3B"O%2;j&$7䇱1 >Ź-eArh]܃tZ@"ݥ"/~|;\RxD1-ZU~\hopS՟,%-X#`Ñ})^Q3F]Җ}%>QP +E[n<_yδE=]TMz%{u+M[}eG  ECt}qT$W)/W);$b2mkԊ QNJW׃w(H0dX)!彧BE6q4kQ0-y˨j؊k2pa䆩1H{IM$nMbLnذM!%To}ng!/S BSWY U`.{(J.#|+'/ɧQyuHM^jIvLc2%^mRTtW͌/NW%:B(ojݿGKUg:&y,OO;S2z0˶JJ|xDyHb3lubt#L]SKE [gSOCנ1^uJLsI7a8m{9D6,q?;ʥ6M"3OuaI/ Xvp7D;tTaۊ~F9)]ekg6O؁I:2Nj[Ɩ-}u?N'4YdQӈQxVQeqdÐ>>̬Q1.mxņpvtLo l>>U1{nLDu}Nw>x=ͦrs$_>]£o7IlsPfT_a0"nٞ%jO{;ajp:V򅾕Ep!p1Τi 'RΨ7ĊOE5}Gd۠3D5;(8a e 1̆Fg}枎]za""&:%Q×Cm&eIQ9-r"|yC) )fE7?IJPq$gdNYzkYs1px9qfsS4BgDQ?n -`v"x?xvQ7x''_*˘]i^.. AnR UL2[Cģ$9{/y_K \(t\ebeX 8t42M۞î$] +Uluڅ!z $p<39&35t Xv!%93SMZDρ"_YOPALaQq^gHvEL&b]r Iph a \Bn5'12z fY'nתDL/ dRaֶs?L=tnܥQ:q4&;QX2`):wcȲ_2Ir$L>S1(/˶Fy,6!"f8j '8sT{[H@6VĂpq}4C aY݇L8?NHYq?;|TUvʒ͍nj.Oq)>^ow@S>kt=w#Bh=a73/spZJ7(u5R/YL :z#`mn_'u9)$*aafuHq.zdOKUq,[ssFdܴCUn-zcQou';򰠊k& 2'I'Ar`PlV %ɷbeНA ]<\5&rA!3Nz'\-FqQg)V\ ī#٦CN/ {4  lrՕa+RmΗ}6j5ћ==w;_q!#Jl^@ǝBwuENU9Yܕ9ǶT;j9lv#]g~y}:ܱ:IN؊[: SBcޑj[X6PM |0)F=zN/7Tl2N(of'RfMRef4w 1}|mOrVu 6ƭ"Y?7# 4)?a|ɻQݨj#&<ζR!xSb/ikwlYXA3d$-Wu/y?uYհ1W!?C5M0*^@Fǵ EALPdxL&|=KbG^k{ rX+JHm '<{)?D2OŽX9S%/8t$[łOΪv+?=PUUxdo/)SZo9S66:1 [-pC EÐYU< //o2c9ɭjJ;Ϙ rFF :HJC /ެgVv3h#■"Qg2w9&Is?9UA#gI^>[ ݹ]0g/ThwR9}8?P^6aj?>(՝tf!0q8dw%[kIn)MN I:hJqL'nInJA!- }4%&~qt:[~ v6QG[$w:uϓ% SaC7w…"qEͭk2VYLԟo͆dHEOuv9Z2PճNKgWs!N&g7r8C[Dd\Ҥ̓)ң2gMVT{(TY&̆pwP?Z!aZwO!9+}}1 0(leX&h?` WD0Ie2:\ &$~*])tΓQ4~N{շ]ABH.Cwgjԭ4sOHލ;D%^^\r)RvQ@ؖ2f6*|Б5>V0i͔S/ߵ&[l.Q[N\]gOߊ0fߦ Zi.<63iG (FTs8.۰0z x N&0SyYoJƷw#Jׁ>uJ!FrCۤ`M*4^BG^#'D`jҖ3umt $lUЌ&9l#֑nD45#jctr'u=B+ 3)oY<^K\|ݭ}G4Z9U11՜Fy=*5ZyQaz. ܢJ*-ӓ}$$\-|)vFYn9 k 4%?q-Gi; ֳyw] LхsZퟤ98eY~)۪ۭRdF ( F?PamrW_ dQ+tC{kr3zfPʢ1pR iGsTnX |L-f z .QQWdv&՞8v?0=yBk"Eje'-ߊN.e/7=_|Zc3ڊ|PUi?u4'{Hǥ3)m1rGêUR \%k8D0 䡈Չ_ԷFU W U*q(>Z6uV .fn/ yh۪HӨL4uLG%s2RF_#8gw6HiRfQ%*QB{Z-Ty=CKFPZUG0L:YIJCYyG#nIE;P=P L6=V7ۤkĖL'\k|3޶Z"KI]GeviVDR8y4$66Mu{kmv2l|px~.';$UJK.-ظj8ܣd.+fBAfpŲgm2=2Djgzߡ?N(ow9f!@|9@\5'Zɔ;S{nE-H}愚mr8OvB!#r3 /&EъI\\:'CQq @8cJ^TT{cuN6P 8MP#9Z\&:~)!<|%k/sB-К@_>J2Fy5La^f!<"fY6K v >-eIW)G9]cJe>I/ec;Dݴccsle)(1hةâimT(DJ}=4bɳ̴k\AoA53B'}X ^4?5llfj(\g;=x jx=ʓFC2Vq6mhf*5Laȿxg-*78 3 #O^=؉5jG2eHe_†lqҿмWՃMFHvDUas9F4MD1NMtR?zd{iyk yYHP8~i?UzGfM(w=,#nVRoh&:)iX^A)oX S \E"XMrU[rڑC) 23jI d\ɳM?"Xy)%Y(BW5! 6#@CUl>ioqp>!BF<ơ*%41h% MT&!A 0Pe093UϾ+iĢX+hW$5G]J+f61sɐ9(閔W/?ټs_wDLFE֖u.cFd۵-fl`!ȋ|;ɧ3+M!QjL6Ljq]`dE닛X gZwxK&]9}9ԏ@NE}+}c<ښ"!8-q~{ͽ[^SqS >ȂF ēQ%d1k+ݟ 5%Jv"ݬߕkS͂["y 8$j8ns[<YvVwCULE"r#3/ʮ-ա5]:<퓞ט?,mN3/b9\RB 4!18 6 EՈk{D]":.VS3#I`CJ̯3x :ÕTf5E"կڏk-jXb$fWw$ϖ,] }A$L=gCpvc\TIDPuKEPβb9+YeW+E-=QT)"a5 yYpâBT9ĵco;|9.9WR$eF;8ՁÄʼnJ-3v67*6TxFOhhډ:S?>,%%[7?гߎ1M tiw[iN ^Po8h+:ۓ)Yy4B ߖ!ඈ' OR#U+rEꥰs:/v[|WV^O=ޭ1'PC'6!n{P'YUEhS":BXBB&7:U즨.C#LB0Fx~[)[Z!/2Y+mo A5JݟZa0hLEj&i!/l郐V/eMYJN};.{&Sர6 o={:1%y d _] TkH*o_ W?Y䶳 Y w|O4޸;C EQiŅZ&u~Z3$rq08/2;Y_͘'հT4.&&yPZ@ !oxW>N\Ǻf@+*Ew\Bg>%IJQqQ@F p{JFq{>wPН?7,|֔hM `Tǭ} eFNٹ~(F<:˜ 4pfDsOV! ]Ÿ"MaԊ,Vh'YR\}Ƹ5;zQ'fJ֍ˀm 9,7ad %an2Aޕ 6m,;~?<"-OTܹv#ݰr$FQ/>ng݇ZgB1qiQxc.F8j{xvyD C0=վKltlR8@H>3rې-}WlZm n!}[ydbKWUF OQOsMA,PLTY0$ m/JbLag"BHYuhi)wJgr >f F`ҝ@=e@\~ ,.J|C)' 1+piӰgVJBח 2hˢz|Z_$OXRFwAe;h_qÎjќEuwViQi8ؚIN/0ڞAk_VS/ =c໘&ẇ;d%p:P ZsfRk: ϜՋgq{d=r} ;|֞S3]J=}Q;lxPWC Ş 5 Bl _b!Z|F(`耡[lseʉkAq.=_E_?5pAM%GX3ayazJwd]--##6d`$Ā┌P۟ؾjIX>yi(ݭE q>@J ǘ։ v:G% "!dzė-|T\_znj%*/=s6=NOX38:UBK sﱗ & Cg3iDj:k{"-0RcNB:EY\?0ͫua'&@Y'YLc #y'NkFe}nx]N' D~whv*Ҏ-T*V0*[ k `6M(y1&h;آԒ W4 u..ҏ LTnSv㳿Բ+Bg sA.R6 pp!nxu[{R,H9I`^8 p] y:9rM1-h92Im> DccT;e#`B+HZ7s2ړߎA5^,fR}UeEkچn+<*Н. 6qj/8S->8ĆW ,H'ib=Ktbl"d֙+EHaaFя{&5WT?7aݝpu[]QS݀j ՕN):'طZ:1>9es[l[Ƿ%̢VBXh$eCeR*#qu观n^")XJ~l44s-vWC:&q-xHc7JʂGoʫ8oP? D7-Gmw,zʝi݆ dTu6Wzjr\.-wSo^$|% $QH5,9RX}LLiC/$%6Ƶc8xܼ  )L/OZ:e% eXB3to^sGc}W4,clp-Xd ``LSdŹ#9imD2uyPx9>l[|C䂬V o\ c$Y И$jK[XH^~->WWc.!t d 柛2ԃ- X}7V0hhK{;OOߕ%HنN#n|ށ6%[5=:4#YtKUĨ3^g bX6/H*Z7(%*nɾ X8K(QN"рb7tZem*T9eKvT[#a`S6Ԓ$k/~-n-qU+J aPP3.%%77_rwAbA8ki4?%~D+:,@ ^pѽSwFF& xçtDHa}_$* P@)[z* "4֡AXQ,+2 #ƫ0\$OII:95Y ?j.󣿤&ZwW񺭹rrKXH@4^#wZ&;*#N-X7m}v}"gf 1r |ń?>{(, 9#HIUm0D>gi^*l5S.vu teĕK$ݱ<|8ʻ)0jM:"PZFrm>E ?dzo iFgNs,fBy:;bE"L7yt>j( ! `ȃmu|Ej mmXoZȀۛv8TǢ錣Pxf L1",β~:W8R͠,&SE[&\T3}-JwRbM#YR(Fh`\dȤGR dD:i̟೎A};/L6;<2L!8=mC#2mHHW9w)Cv֏AX_I4$EIGgڈcm Lݗf,=zh"l?,CȇO1af|K rN}0|Hw 9Y99z6D "]]Nfu\oX[Ǹ_͸ϫ"gxdrU/̩pmg>_l7WdHVLD@Y2 ?+M8m:r_d;915&k$biV3<2>Xއa:CVY^[*.edÏ с dgh'RAi+=,}>9C޴ҏhZz̐2N~_o} F9;9+WLy+򳳱4yM͎=fKf̮h=*_%&ӰN|}YM0',X䑬[^mm7kb˅vArkv`RBM0s2 }~MKe`BDnP +a&#i1z(^{s;[(j]cZS;o6qHpݯu|ktĀ ~tg׶F" }/^?J5]3GNZ_W;8e/9sDKK >). S(+ 7I?|)Q9ZW0leg;WK`=tYiw=gqmBǎ̳]<>ˈ[U Cn([\.p;kfA<{s>-o.؍zޙ)Z@?.C@[=_p9d5~)L-6uHD {O.~izfAi:k$HlX >{L8@p,CZ|+ (${ϫNlCu^3*i ꓅.ͮQƉMiŔܸw(U~-_yYoU7.tO70&Mz/BsM@QPWa**bج5XziTVE dؐQu=$[}縖Tvx3(<:}BUNxUn G3 ~>ĝY>i b*Z(FZN(S@Vכ-TZxEyJ Aq ŷЛ-9f<>ɫfRM0?dȮ{} Upþy @qﮘ pO__{Ҿ0CjANP\fµݦC6bvQez*Xu]2\VcY B[nT3OТbc=FFd>Nح_ Ᾱbp\H#Eg$~̬]! R-ȚEz$6j,@J EpN>66,Ttu19?-j@O֐TyL -aZxSuZGL+V~a:*#v ,FUap=7哋LE_jb p D|;\<Փ?Gb0dG߇ե}r2gxU^^k5{jsP8K8VÂOi} O #`:XR$!\3A1S#nv~}|34S7HN[<Gi9f6rȮKm? 7TXHGl!8yՄj=j? yͧX2bݶ^|ߠ 0<0,F:bl4҇Tă*sR>;Dofep8ԄSHH 4aXT0!ڰ1OFX=ZZZ:(Yס6TK$~i_ʩkxaFt"G .ϢZU#lG'5Tݣ|cԲzuW0_l-YyQ=hVoF!i$}~ikfgK4XZ1"$XFqD6zAet쉑ob`3I2&Q@GBY=^&lkn Z_L.P6cL:D]^_ %h0rf!LD25}E䥥NƬi}U8֣3 ޚʺh0ݒMdNHLzwHFX8ɷR3(MqFr/8 +'S7W Y+HkWr$L}7p:h]_8;,K9e_%GWރxVa^kUN G©McRKp`@[j*|Nd]7m&(~jIK|2Pi5W®¶(Iu':y:F1!A#3ɟgkݼK;kr(HT9/Jz**x6^41F|o*R'G&_ƺ5zoQj4 ⵫>mVGeRLnSJ}~*9e1q=* M#Ӡi:PxI/CT a~[2:a2 [ǡt9~ȜpKe5J5] pɽIbGw7ջ,7 n5?^)X2,o}1&nܝ3eُDi)bƝT.8ıF7'e&6ܔ0 Y[Kn8\ )QZX5O`%h2|%i=Tݖ4?!K.yG-M Tocz^qޫJm/ūo^Fi6C=9Cf Vĵ9EoS^:Cf=8". a2 *5;[8s=ʇWlhEyhg?[ [jơ/isVPiɡR6DfN*;:b‘vTV`XnLobo6{AzU6 H|_Goˑyr[UIC3j;Hl7ҙk ap.(`^"϶XG('Y3HQ6\H0OswM/4b6GCxo%`]U-y_EH ybRPji{{2dT[`+m ݃V$>t8pZE:BL,xa颹 ɭg(00 ^\vGѩccAszດyQhM?,.h{w@M9Q:hW0 PXgYIs;s3$" *;n[Q.7jqc+x#0S l4]#[wLB,9Y;U?4KSCI71r֬7ɖ#9kӂ|ǽ/?hUXz^Q0mrhRp ~G5(5ȈjoLd#p0ʝ6C-U0GtTxc#$Y?gty4LOǓ Ԧ޹xQpՇNGM?:=`n¼L7I< W8/K~*v=su3|,~ߪƅA`+f4RG׫)c7[Yq \J@.8.|x“Z`febig8r^|YGyT0RPSnv{q;8!3EȻLQf8MrO:ڝeUzI!pἠI.#vm(t _vcoz`JIx8ҩij]-94ۦl˄W3f2K#΀{ #wr粒7u*kRȴjD_ﳱ\Gw1]%ߌ.P=!DjX.+N|V{ܴtײ?U8g ^3[:6R'ֈ?Qe)o IYlzH|gVYɵAs=q"IdCt)ۉ&lD'p$n3#yuV h!4~F F(i[Z Ʊ瑶_% \*ueM M:$0=X!D 5yϫXl8v& *!PJ9* t\Dj 6Qd^_Kkoyi%i[=Ll ywr,*wAJڽ)k =Fo3CUts_U# R[]{H會$:[ܗc;|vm;3wm>kIwm^{k.w:cׯjRsK85y =CY-&qî&Dˀ00{V04.*ye*}33,lv#P̘zHӘbT5]+|a?JC aW-q21ȫjU'$6D3<%.Oe%i[Ξ6qYs2Uug; Oo$u>3W~d,,/ RwOh,H9h寮+@LI )/F5kjP?N&m|d.Gd'Uamp Հ͛AU2:2\*d8; dM6!kju2Q EqM,W!?qt(NCv>|JʬBA$`6˖5Su\X>N?h?>Sح)hEr;*=8m5wY8"nE8(ZRS U4r%{!̕4]qĄQQX Wy1!~: )K C$Ր3&(õF/h`Vog\󠲨1Ȁ򢬆p33EHf4L(ga|/p@߈p$pe~F&7n%Hw۲%uJa8OEe)<%GQ{J=zC=9 _xV=ʼnQ8e ٩-7BU[YA-CQXK`y)ޕ#6Ža^* .y||- #*~Ӂ1+{atvCrG$5ovCy^'ٶ68/:(=C>SG0Ty !۳<_Gl0<yRsZ$*#dښ4iwJ]dw+D;/;:\\sDQ.^ԯ+| -шIc_7:d,_ @e5aGd3bm{FI.o4r]j[A~J+ʄ UKD.[xP UGxΫ02K;B}a%q5%cX]qz&t16pYʮuBAe̎iByNa&~P/5ƛY7'+ ~g7*9MpKǽ o TFq^J L;4^ˢO> N*cqgcc L鞺*SY-+ݵ,/|&t?3e h9)KIqm˒4^nI9~$ykZhe3&A$w:'ZJSK.><]Ń@yQ-dies~nת$=$u4bX$Y @rdE)i 8Նr`/=8s;Pޯ~iKwg}(xbxsYQPbj -)La"VA.`)׸V&jѓ"E;KHJ"(&&t:},J.L]-32p o-W F<4y61n/veB7Tap HNk%Ni Yi;On:,&UoiڐT&&Y ڧ_9+5\`\kE^璻TT MD_3,9/dNBX%Z[۞HRo^ɲ#V;~[ujHUptK9wFh`f@]?0g&LW;|ZV8 \wg84dUD[G)pPt#%<# W8u)hdun}pmInzA7҂c;:D@'lv}1\C:&v1LKsѼX#5uFkjٞGAzvrO! -K yEkt9^2Yw["ư3Yo˾HD|bPOq!}go4[DKy_f=lV6[~Zw" ,;rnn}g}|MCc:☯j;V#& _~FU;gRTڏt-iN֜I^sv&x}W7˼mSٻ,ʪkNMɺ(9EdJ5:Y{` to^T M|]"(vJurV&0O&25c!0䆐Q暣,9uBԖmM/;$joV'0hqoƙ«o"ovzb9Ia 'I$ET+B"$K{"$QԍfUA݆5:AŤ_˰Cnvx@̌Amf?6ZVW91A jvb7~WGWe#͉er@]gl7h{z"ȱ_ֆOy7Q (uVsGTj~b pMRA& W7hWQ}נ\旒$h+CXN ݬBĩekCV$%) 4JX8TRpDc6;?=gQ v!LhmO) (ɗ;Bܥ! eNt7_InuP. 5mt@ڪI5w6Wd pjhQQK)0Z-~B3[3zգ5nG.̈́~ԎTѸ•(` lH/GU,5']T,aU9Azjp TA ;K*LRU̕e_6't\,,tS.TW$N|spQy=[g3fn-X07 a%ة \B`?/@ |];;9$?\Uyxq,ԘdRMS-IF$1cnq)̼ކc~IIHoA/iN _ID+ =B#b}:'<_sK+3@c93\u_]^ g+c2cW%g0ڧ8AVqpf/Z¦{ fRߪ!~I[-A5h =*񂻧֣uC!6-je-["ۈT0 r1m| AG\gqgvg[B(D1iN1 '2!uPxo| $#@H3@N8Godu򱌄Dn54oБͶ-o^],Be[^ܿ5>6a'~q̰*e`GzD60 $0E9(L'fA4OA8xI4ABi OJ œ #?+{*Fʵ:x'$Y!sS`W;ޒ#!LԐdmWoԮ &e>qcSRbN֖y>JɄXɬS\YS`)6EQ㑤HkK>VK !!dO d`TU밇z9JWO~IR0UճP<C}॒] IF~_S8Ӽ^?W:kpnIdOZBo'Bm![14U=f!Y2:B *SV\ڇmt卉Џ dc2 GwhVt,YkHHZŷ;/H ÎT]hB9.C,iYߚH_BrᦉQ ퟟx8dU->((ðlJ+*Aɵ=]vNp Fmwx4zNi@ٌBѥN@{"X.nw%c՟RʒMgG4Ba04+1=MGL.)\ (R.7,*I&-:NbdEL>^EWP+a{@<ë4SzCK$Fڟ4C Oٍb9)8R\:g\A,?IC. _jpDl/8v 5ӎI&C(/+{bx d|s9Kmq \2Km*lT~0{YA=F ۪DlR}&NZUhx_DY-=DD엛7%>1>c%|:X&9[sV2AkMҷ+>K^vNeK-n*';Ϊds.'Bhu.E3;ױAz%v׍YP06Sf'NV :96yC\H䡥o9Hji)!m=Ɂ5 v-Z lܨHa^3 [qn=~>^@6pYwΓCH%/{;Q]U.^~wg›$/uUa "iI[xM\-Whn@ Gz xO<ۂ"R-5 -]ߴT= u XR%n*#Vz<D.zXɡ'wґ-,dТP2 I~Kxls ~35/5\WYc$FxdK)sUHzp>-Ο],kr B}$/B-#%}dDzP.u a;{Zu;kd O5xhySo tCadN3U)6?I1E`yڃW]bͺiQkļlxho挪|š)`@]9 B,P?+Xq?+Wa83|JK,C'Z JK9?H!y'F{jO slH_a}tK>MNA5&:Yl('z;Åtq_:HZ:R*(57fNK(~LH_[Uݚ > HZV*_a_/ Wz+)fg`9K֏+~FsLl4  EҸ25.(ܳ뛲4,cbW'gH)ӻygziwc?"dSJX jRY%ZRP:|m=ԷVпX㕏kҶ}Kbn#E1S{ 'o[(NOgys>yb;,CN/8z)^` ^YrgEh}Lz8K0P^]&i+%ڌO{0K9>Hx! _F(eN h!fj<\?[^;i$m}ii ﮗ?5|fLglS<\9**s˟ 1|)ITj)8J|Њ7 &N҈҂<'レcS:FB*kk^M񼣘]M^bm@x`X xgvaE0TWH-5fm/6NЅd^@vp>b頽{ݓ7S0%zzmiv+Z׶{ķ*|JZtUXub284l̢unW+,G 0G$e}s`N&ԇtswŘDHz`YoEIm MM`^ NoD[;R1cq8h(#mΩ }(4)Vc9Hz2-3Ey,*wkŀ6m]M)J-o*NN^IeۿTOtbXesr26Io6AO=3y]!"#:g7}vWDiMUۗtM,*D3<Ytq36LwMU}iwoAL-kru8HyD%GX9;{EɸDm4 j%Y|V<NkL+&Aj0` u<*-ʉ؜ީZ j$}}qQXN75 j)C,Nk*]KN Ɓ|Di]:]#@H {SJ ]g{<#w{3a\ C7H Kt1:aI%chBx5&iB!&.?^Yf^ߧ_s=/zHY5vDpMx"-RY"vfv862m4?L&جEFz*Ǚ:E#ѻ,4S yҽYRkܷU3~ey'r%)OI}?Nq|!wJ$e-2eL+ Av^A/4+ʘ*c kql)T"GmcN?2[0$mH&9' k1{_ѵb9)i2Z65S|zrce{5_]>ۊ9pqU/ddFJY+YG`%o[lg 1?jnYl/_UԎDCRSEU/Mj [*2 O<@u oپI eŨjkcq:C n[TPS^c{j)tZM)?|Plڡ?f}y./dΚ)I%$r4s.l\c[9o~,($Pz G~A)X|'I9_PMW9J j=#\q.ff1PeX|G;J% ZU=_3Vͪe*+4_{I(3я$[@߫C#iNUi BRnc+99#9X/}|f͡!2dP?˿̣k4vC} e]b d=0кY22>$Z[j$ׁ𾾏QCfZ#IWA_v ܎Jz; KDrf A, yt/ı9>`?&<nu Z|K`ĈɕI'e]Ö|$ca,:&,Wa)L %uFT%_"N0W$y?e=S{ؖ77 lWs'eK^kک>y_f~{շɿ4@ ip#+Ȝ/jK{rs )m~M'VM&b-hX΃h\L5>rUybSy F;\7axTKBL49!-@M)站l`CMgaVn1CsvΝv'pB!AjLYBMG,%K_WfdI%MAD" ၄,EM޻EAϏ Juf-J<ޥ_^'!pfpSDśouN?.GD}85A\ f߇ 4->[7z^M"+H_Ofhs8++Sl,Q evKӒ[ Xc!Vv.3oHT_^,3[y>h_><9E %Mf*Ď[[[gԂ7r(56ey##m!H웠؎rG2%Ą'A~Jo~Jr__} *+o#*xzӖsakyF:NmI E۵CYr>\ E/zYM!9S;V$2iЈE#):[Խ}#$ Bqh&hk n l* g`=;;lSUm5TG&[d~EKN"+k͚%J/_?[P6~1VB۰`nZA*2Tcwy`zGz @ܸ4X%c? .DoR%IN0VixJ`"u b@sj Udnǫ ~I56Ʊ^C! ؄vg.|wSs|  $dpfA"%Rz9[ί R+P2偏|38V2AnG>Af$㬗;ji֦>,*jMAnyn;c" "tb^-YAVP""''* :^~Ё=~4B5U˿RA=B(0FnroNad|nyyFL8Vـ[:_ gCρs})rPgM`¿N7ij^Vg۲3XH-;`cca#X aEhSq=NrDA.ԂWckx#P.C|y.j;5Rp\]vqJfi%-N\HH׸#eizZ5y;bL}@+mKʲ5{s+d(8Bʧ/F8/ W1Q"<8>8q,A# V9~\)iyg{1tC>h]m?I1{+AAU^R|C` ^FM]` {JoZ%+!v!,4(Ѝ-1 m]z Bh.F7l2؉oeqhX詗0k~RGb.粂 3 T8*r[)HP5p̪﷑"KIέ]7o5*UJC|m( ~Ag}¯Yn>ϑ=!X"^إb4Us]/`W%:INPQr[ Λ*MYv,|GAH.@.FgvC8s}˻,{cmʵÑ2@KKW>؜/ұCVkF?+Hp X8:-p_W!I2HQ̺eQKF_ Z?ON ~'@˪ĨH<9 2h6L<0be$iۀvjE@`Jr\?SXi@{?*rUsvjO} MPPq(}Lujj]0zC$СžU|*=a)VA}cEͨQ7*DZ1˖O| s xZ)iH 8'xJWLm7F6ؓMGeo?R]A~(ƁarwAg>]=7)3l~"(</"V5hsYf~6}(y5"MX&VKFuD2g&9%1jAW:irp1Ot1Amn4$ݞhyn7#nbu`З_Ќ{dkל¾Bu= eآ<A XZ:@TElW @w~5~'}j}y3rse׀_*؝5CAĄse.x\E\4O7<]1YclK:j-FqkgDyVʌ;~- ,$c9扉S/Q) _ NM+fpPv м`G5T;p{q.xBs%#FHruWGMC"p S$k3Fĥf/R5T}zKF'ϊ;ЃƠXNִ4l;5ڀFhC+ mp $±pˠ*/J"9UŰ~:4V&HQwQ+c0uj-FnSq ;kk>(q?v,۠Zo{Ҝ1F9Paio4 d] V 雼W ~wb)wQu,C50(Ai}jGhMItvFWr*0s֤+QVO<[C@ґ9-  cFlqH>I+(qDK)P /@oF^SCbY$D\A˄ ίzJIV1#ijܘ|elaXtoD7rQLRfٟĝ+*MƱCx69X-;}hpDv1vF+B 9E, eмY [إ>iߑ> v\2ug2X~ Oee5gR;&1cNY@wK0Avr. }0J^, lw77휇\qĘ=h v7Eۙ:;\ZWHui&c$8ؑ3u\\=xs,kΐ'fС)nbɒ \2`in\[7ΊaSIU\)HAUGg(/XS\\)5M޽vlF՛5j!d ~搡.UcΒ%e5@{}7k@/jtt]ZB,:nWp1qg[qfd-^ [/%T>-Et):0PB1>QK@[# "vƘ(/R2(귡b ,vmkP=x(Bb%yg>zFX I Dvzv rnM^Ʒ:L2kx@j13  PLYcw>陣M0]ꥸv3 LN2 Iu} -pv3Zj_4TI)L}핓rO4M%&f !,o7f؀.K2z5k|EEd).[ZtاnXtvН}Q0Ov /`'&"a'#Jyz>ZTLfb  ŦYGl3#ʕC'V4eh>Z{K"MokWul+-ٕ{) 1BPDЌN%; b']Xz3g^׬.'Kn6lrpng%09L01_p7w</څTKoNƑime/.y =֩*hX_`-|[ovmWwkBYcwT4 TZW/2|Ϲ+{0fN;цk5CWB0~`sh)KVjZ~aVȷ?>i7$y.N7롻^_3q_ 4vqF򔻍}f%nG5"K 6:vM(|4%USlyt}aK'/Yǔ⧄JML}j?/#eR9(C2#h+=qo!-4DaLp|TA7hG-M!}\Od"VV ?CiJA83'] _fHdfO`L_zip#U fҵ+ɀĶJTFk>,X^ZU7HOW ieI OVwF/%^,Wcg_XckT qݾq~kSZ-@‚|,.(7Gv, z",ϣ]n$TԚP[Bjz9~pT x-s9.FHIp#|t`z;[uTc6sNhA$j37DIe(}\uɵҜ)R)iJ$rkkJ!azn56=-rOf&uZјfkczkU|a>^ _t0(0y[T <|$|ZIRpp N;,b`-_N%7 `nkO3Wl~9psi-NY`n<: ~:@7J:=󵘫G4W [ kX ynU0打s$RK&_ylIqcY e8_@4џ`/ŌT#G$(6[Y? 0 1.&\a$]j%MܷΤ<m̍X YSF⓲NOY]fNt%ďOzrezPۨ^I1[-<'9׬٣2%c ~M@pKj!q-c#5C/|tRu©>c6~2ō/^i|ڶ[cXީ 45.k~jEMSӽHKV7Z15s4[s q.\껶pe(,I{l0-BfK 3w89יgFӃv`۬Zp-iJ\psKšy>ɆgH@fhc.NgB&1~$4yQ nr(KyU0'kvD(PL+-|~ʸZ"2N‘/ݒ痭jK3'JۖpVHmÌ'wq_I:- b `$aP%"7[ZWll;r>YUNq,xj._^V7:4AL|xyvǣ-2B3Bv YK"ȜP/- o[ʧ#u {r8-%ٜ2,u"(xH#n$b>FǶkׁL@  uq_VcwjW{L>H1( ˍz0{X2aGi-YG:;mfԝ-TA)'ʛJIW%H6ӸN89R*5g¬E[i YHA@ ]AƃkR~Use?s;  YH#à>6B R3Ȉn2c}{b|HF{"1.*wUY5h!XdCO_vm|]tX. Er㙪2^p/Fp~ w)˛v6t ߊ3O5٦hr_n;/ ],LHVT៫`P ͼws3 ̀_O]W5K=X}ɛF*eժU៬cg5cL;VYiY;QS( ٤.}DJ.'fepr !1 80?V)&H=0Ǫ2*0`5SХ\sx}i}A[.g",H!_b]6ɺ7$fՓERy PD?7@!KwS~q+M7(蹕7 "ecz4!ٹ6Vi0Ĕ>ӽl̈$~m/%@NW6csYb;IY is (/)J)3IiTa}Ӝ?mPLT@SD)>N1?£)htRiq&*gIƪ%4Ej~ș$MKP!+Ro\}>Q"su+Sgti$/浆+hf+M' 4Ǎ/_ A7՞,zW3e 3g(KP'ąߺ N؃YpU!yՆaj "uӲw ~7(ɲ_]:[ҟX}i;29(7K"9 lv$ 2G/O}F$;gA.f~%PVzXu:k\Xn/l8e 6 הQ4l' DA3{CyssŐf6Gc檖Hu tdIөx̃3T(7dmz]PwjҮXGRd9QP ]Ls+&jiʋŊ.Յ#4v9Na%aP6ӣ Zy%hU~m?MH>.AOdb^(W}#rFSTN *xZB?gH5#Im ţO91󫚳-hR\ A+bXd>M"@.Ufѷgsܮ6YAQiDҌy<ϾHjc:^9PzZkQ|8FHEp'^GWJ>68~礞ыX9˶w1le|8E_S!_EjHJ10exen4KBԶ;3;K {"),V$jz 1S3YZHgr}<Yԝaخ#%2c #O}m>O@'n2v#10KLUd&c¬9ijL E2 !Z{x];[I9$ s\Ko :ܕ Cẙc1DiHvb qY.E0`FhS04ڿ!dc!H!|W1ު"₣5 %RN^mo x|WB9!O5J̟z3M$wbM$ /vo# OD<5jD( 5UTh=T36 :>Z +ʇPwL$s&XyC?ٺW`\7hUr$'w:-3\P(jt p#a&^Ƒ -r̐ȗp}M??(0jyzG^Tb/ehr,ecK`} :&ZjyN@܋,> n02 b7qg^Uu>J@LZ.A^X Tl5,`f6+,-JTbӾne8Oj{uPQP.}6ޏ"HF׹"RoJoͫGg"xV/*k_GBf cܒ5e xJ&: `Gўe' π_Ȃ)+Ph;ԏ2X`>E3$q=ܟك ҨtX>'h#~zySPH= \zz'P)ohz~u)ne'or)0(D {Ud"QD(OhڑΎ'$)=IȲwG~.mWQcB5]ٴyI=`Uɽ5, h}xD’M"V<,[(c Ĕ{(4} w?Bٚzz#EPwخʹ$ Pb",q&_(;zpU .;)7GJ6F)j^cs Eu\1T> o˴@['"oBGGؐssD=?l`P"B.,֌#vxkYh_'3 x@ Ra*J\1Q|6G?2*B7XgAS;ٝ!hLih(,°p8"/| yčM }I2 f IY|3+QQ'rQEbvjf?J4~aC K/}tgRM2BJ%F bwh4n\22kQ}eAJ^I (I7]5\ú&- 7<~(|=j"Hx|W&Ty(k˘-j>:pmYzÇ3mx~⒟(6(!dIu5!vCeꆸNa~%TgvKmplYvΨf,;}3DE-YMBqaZlS'+cF9dhu,tޢVL}s$T LLWs5}ZOTLJE(p غʼnY/'g) |n(*Q[Q8ȭ\/;jy- uf$NYScy]pbrh8SKaGG{ٖ)le긌R{)w>•SN'{nn!c _؄qɓ%r`]+qMCǜt/vH+HʢQN#&#!{V;MPQYSn̊xTf9}!+5ysJRu cO2[Ժ=hAp3A`g3<|ۦ("_{l@=A8}#0˒PS]>׷8*TQtB'Mڕ5JDJMɨ?lv'Xcwk۔{TFH;ץH3^#S /a'5xpjJ͚BƏF S짐ˮ1GEqǬ05@,4f?&ّ̧{DXV.=$nB _(?h1KyL"a'MGEPzŇԤ1zEG ")`rmٌpp:bijkDm_&Ŵl lcKt4 (y0=ΪpcgH^+ 1CHz}Yص̱5ptS$weOaG4c 3NAT0CDIPYѕN,?') 8Jc(7HWa/u )&OFà&xQ% quOF\OuR"ؤV 2b+ LXl̪({ùvQ)~epdYrQ*oW \Kd)~2AHf.Ǚ/!#L`MⳢD,? My ȋ5unGeҖ B S $M&W=Xjn/U35n+*'Λ{~Rs_UZ3AJ/GAz,˹PhO6zpH^eTL uqWF,Š^z9*sI͙ O{C&V2N1Sh1/=.o &,5~)5[wxA +HD N?I{^Lʠg# CJnr4*mu lsqEChI2C#HS(TŤLb~ܧ/pr!O(qyuK,NkÏٵG aKHc,5~t=roh'zθYsQE:;hGlVZtɚ63B_IL]HP*f{!z9.pzHp8YYה{*+qb#% Qu[O!`)hW Ȥ;fa0_%H{(ݼy>WkzFPLm-qg3aSGOQ1,9X:V819ߵV*G**z(#B ̷ga?DvXb h"KFօmzĒ"Y\2~;i1wXP^eD^BXr[8~jB6θ iU #Q:%:zO 7^LGR zKNn%VjMq耥t9 &wQHsGh+H:=ߗ(IӼYo_$CKMtY#v9yajq[;P:dnΏud$.9N(*20ŅJV9[F- GSX~N=6 Z CaSU*DW 0A]ݰ09Z~wsGyqR&A~Lv׼P5r|ХD!I{&VD sBYwAYlGq;6.kI. Wѓ~WĥUX㮎SO# LMj3 zᯭf$0 Cβ{KD zE+= r\jdHv1 cܱɻ6kJ5)[^[E0vzXz"|*t <<GuL)@my|\,x'pҲ 5/[9x,XSz$Sv̼;{Q9:@Yn>$ڂdpRi@\bw'J*|D3G-7ѷ3G"I[o[6-ǹ_‘J|(t ~찜:o.^mvNm\߫sj|^\UILr~5!N8sԘ^z+[6l5u#v.hfEKwDS6ݦ&68pUJNȽ |tkŖ_NqC-pb~|\jVMKZ#!\ApݫlZω]KV/ `[`e'TЮ]IVcBo\G?*+c(AIQb{qu]L1'Wb$Q( \N^Iw1\Ѷ.> I!J}5ja.1=8!):  >kTo&dglYA V*; t1Y^`]⍤lHT5Xqp۾xS6&wjT7~[%M9k׳jՑ F'mRb*ZVo]25-Zr U<^Fm\(:g28[MwlՍF5J' z4zUC\J]+)T2`\j3hiw4s`;Timj2K5^\8jr%{;һhMq?x\e}a~(E_㊑\,i.!DT'uvlHgdͧ.r=~/?%a:6 %bmX7u%xiJ-`ra]Ekŕ <e4|X,##wҤDʺNYnzn`=D`(49Y ayp]0rUL4AI&LQH} ]Wg*}񐀧ҋ`'|vJDa5!t>ʲȂ<)9Je/L4d[q^s|-4+ &ETYP Vu1'% y4gͯ>5ɥ.ÖIX,^s][I(iy,]I50OMOB{ߥjWJX$Xs3>2? mmh+%`V`x0djAXyII/|ʽW r4 ˭V\po 3uRLU_W؊ n}仴!5VZ[Z^n|% uFyl7h\lX瀷-4c oaCю`H1|cC8ٚw䓖'5@ ?A&DTevy#`= SsjP *rŽ!j֫o ᚂ7tQ`}=~\2֘Z l]́IT&C'8vl~ 8@҉"sB}DCsx-vCZ[fxgyW/U&P]sIeٴ8Bo_ s-5:#`q<{: X ҃3ɺ޿0n* ScI4 {u0̧9t"~֟;9X2L*q Ik;%Ri_15t2;k8-n] 45Br"΃uYZQtp& 6c|9E/ 0?SG*Mv6Y!g$oxN{V(5bw404e#k8J>%WWƔ0jU # eԍ:H'J@)X{dx4 ;ן=xT2 "YU'ۃxq.V>ξuJktӅKһN+2XGdd~#Z-r4J<%^b'8JqUbi妦ܧ#&A|QIfb.aq )M! IÁk oU2Hs<˱ ;gJ{X%=;i?͘xJmp~a3eG(KϲuB#6Xv g{r5B1ڟ~k,<&*P,ފfbPw)RhF1R+YmFuH+0+;OwZ9Y2CwFC8;rQI$ 7Ry(S˦,T7p~=4` H.з@W0B|$8#6ioƔaOI \eJ}ZsW橉/zeg;'!<\\&a0TFzQb 9F:QܺyZG\O_a 1&rZ?0jV?W35Ae`VRpg׎Hh A*5Vrn[ O]ѶU+(.(%'j0{p<[8[Κqw{H5^/Mt"dpE ~شҴlEv6ц􎤘Vvtm_=*5+ E?꼎s-ddo♂XI}+O3bĽoHzHA=hDxoȆ#;;5 /@o].Ueخ 4u/Yš}ڙ-njK5[$Oک,vY M0IXb=PE+#e*ed1&:) !)chbE6p{CmV=" Jn$f<+jeVY‚%S _7e8ϫl٣Pq:T4gksnmֿhCS ]!ޟh(㇧rnJqJ [5+. Zf$ngX d@c!ITWa{)൭ .=G/†CV}ZaSgS7(L_W276m24ۧ "_cѻVGn4Di;_Q\e|U>kЀP.gk#Tz+26q75~1K6 VI4Vd4XQZ]4|&e:QJZ?{wo7`v` ʼnOIr^q7bDā0 Y23ޟ-ʃHy[8`xVh"zC h;%T&&dvfGm"vz|2x3eñQpR5Au -XbXB<`wRYvf'%0cFJ: p| 4A~+c5#i6NVBEVV%$UzUe:(SF"i}(jGw.&s3_Pe]@9|VRc+dΧCdHn~*=%l\Gb@ 7VBl%~ٯKĘ;ol\y^k{ɉ RѬ4vTcs,٭,:w#7K{,cmf } noީǣ9ɸ:~1pIULΙOx&^[wyQĚ/_ɲ#eK9۲ƽ| 4^ ]a^vT{ө`A<ٿr@k3WoP\~_wEʹߢXXt1(X.__L11S 综F*._b 7L:$$b e9]|r`#ز8^"t{EsD*Xqͥu!ͨ{40kFr|!Y7)j!::S x~ԿxRvEȵ4/V'p2v l'Ѣ$F/)YؒRrYWZYc͋9VBb%+yDmF!֐Ez3'f@en$u*3#aQvaH _tU#qbktߠ㻸R*}8$ڞF0HqĢXҽя%rt4]^pv%&k_.h*?z4Av_Jq)FB+QI 昭JI߳c'y$Q qT;@W^!%:V8B뱶ev+M*|J_Q[{.f6nL׼(n d^+#gbxȗ}FfncOߝQ#J!AސX^tΟ_?%R }Q?' xkҵ$%=K[(J bO-y[ME'^bL-XQD \[Qhu"oh-bp7bjQ"tnF|ܚ˼t*c>Qܝrk]B7w$`Ft*nwXa_S8߭Nȗt\7)Ewy#HbR|׏DŴPλ̌fCu(C>ΙXqsZ[aq3[ e*;Zj$ƒX)3'X40KX 89y ~aːpfo<ՇSIb$ƒʂ̭ \܂n'%w5qSw vJkGg@vfOx=Tp5KGV+(Lc/'6>\qiyt!ˏ+w[7R1U*gvd]NAFr+kuFgǁUXͯp;/{;4ɴ-,X4!qs$t*Y!-Ttl l̠J%-p/0_ZBN5 Rφq *_5 CqF'dhM nAHHb9]RT Ol3:|QVwƏ dY~taZGh1k(3E1|yq`1^%7*/º"*[ sɀE)PsA{up/mM*^2M9ωf %oLF2 2n 5 ` iиK Bh'\7үDX#/UЪg4 ˧it)fͫq" %*cr]~N+AAL pVYaýQ$6O=/<3EIKkd|ĝ80@5l@ &!S_A` r۠<<V*W%@wD 097VuW 6d uZwĠW-( ;/_/E^a]<6 _"tcNjZCL3uìjOXRf2 w>a^ 6eڇb(0AKt!ʄl=[`2yG 8~!b?!apE=sMP˱oey.ydYqH$K&|l,L~WX~W7`~Pws* :6b0>֋UW}O~m'! p"]B#RT9UE̱n!W0f=P ) 5_~aT52jq$ +'1&ʁxvtnw6<,kڢ1fh2ah.`T>P?z7nf COdjJӾҋy}JT `<7YA=PƐ6 H\\+=lޛGG} ُ ͞HJ0d7t"3,e% _c+-= X]" &SK9½zG|h"XFv$D=')%iD:HOdVUl4G󴖘\L$: 4㭿P+@.jTWVe'!)rjZS;x@C 9b^ SFwP=?_+E _.'~<^V˶HqƫW?Ss]NhJJT+yH2,f)⽼J蓖ĤRչVp g-Pg*Y8b(pf2q'=s3r\1Bv{8y ETr0F`Ӓ[{/A5fg)ءvZUuU\?*z2`}^:BYVDAg-ƁjƑ 6ثJ4zێϢk l?a佨<L1E  {:@HxaFn]Sn3HF KRjA:32RLLtCnU/GM9L*Eκ;W(|E'JN^z}5VO$ ٮx"sJ4 5'"C 2_A@z @4d0% JC&)@-ZyΑNCfl9waI*-+M5eZuaՆWUfA&,MHu=of  8 8)|%> )n]D.f gGG?r2<*\RZ/ V?GHyq #$OitH&SɎ9ۀ9Q:8 Z$^hV2HI` T~2 lQؽ)!Q3RÎ HibȘ;.a]^T;{?Ń+B^V :W5'޾" MvYb䗋`@_ԅ`ZaiNQ(Rgs;~R6`5th^ >p(j?k:WG#Dž4ׯ7F-T[2 {.qwjʝރ!qnPx<#ޖ+c@N&ȥumЄ+d_WIт!\p<'Q$ښlztkXRk8 Ԁ5)|C-VR?Y XQCS9bx7S&ؑӥ QӺ9/vw`CF Td鬷~i2-jK29@ FJLL:Y6}W_1?iJTFH*~?`oe*#дv K$P/4ޔ|-92'$3UmS ."Sgk"z {;1ŗ&%C_΂2+<|mRX^syrϻ)!7 1Kww/\t_Fk"G;QkB[f+q>`'==Y &Ihۼ?׏oxKTKh#rEL: PTԋAOfk8䦸2&_IGJ0b/g Jl%E\'I+$K$ !PcUqaJ ju7m#FmJifxYQ*B@΢Td : OP[wI&m7;heoҜmHC,F)#ߓdAU1EhSOfϺ'^e)`$ [& K&vOD+1H:ɀ{F ;5ZQTC̑Z"_G<JEpT:!=`@&q14iyK"iW;r_qȯԿPIgX??C»r{f w/`Y9@s-qi 3wkZQ S  jV(ɔiQ/9 k:`@i"b1/s$cB4' 4hrFH @5q~og!k;tS]΁(i|;uXOhd~wտ/m} &Dy*-yFeH<"r0]<[-H2c.lwZZl>ɇY|]_R5GAc{̉'nQf zE=?~V>#omj`x'B6,9-Û=p@ [?{?&;H6E$y/)LDW+(?Šo:Y^Ɵ!#y^7\"{ŕt!lM1SeX9n-KDUwU Q%Zwg$B(0:D8/ѕM'Cm U&_['N !^P43}\߆)ä 72}1T)뛄z(hD_lEC&A% ny ɴ2$ը.L╽r.p:z>0wR`5.L[~I`COn[1d7|E~?@oAwQz_~ PV<B8`ÐY(sC4di /k]cZɕ357:Ɓi7-ث}6#fnOBHWk$^tN|=ɼt]T$@k$9v7Qk$*Y }YF6>a+5D|`/ڒ+4L?h 5=+`TBD?2hNl\!_״զٯ5 /q`A~cԔur]m@*\I0`soFI^mpI{GG y .;w(mq¥M/׿!ڒZDE v$̦}pbٺ6*2g`]cYoy}>O]Yb8[t"V(^` Y|H,ua5>pqŒ>m#᣾^r2m2L m}'28͠1?Iy)NC.롊:~sd[=ÍT<^Y/n. %HQh~/+$,cf`}|w񴞫2?}b+ܙٻYXZz8f,#l,תf^5[Bm) E{]xOGu7}HQHCI 92O`*7.j'_!# =9SۯLR%39 6y*%z}c,*N__uWEU@ ~-gj8̓)eh.:Fq|hRFRߐ/qX$T*s/?OJNW k7mH_l[NSQ?&XA>c[tkw-r[ʖ-rZU|ɝV"YX2yj+N:Bt2=7WkxdFȨTV3Q)6|q gTi/1;vj\7nvsW ! 8~{Ά§o !Ao>F7mk'He?"$rz7̲\@~`o '$Q"sDd\);$ڏ55kIɭ ^GgKZU}ޖ-}ʗ]g'E,x1REc>GI3E RCD(:"&a7FUt#bW뚿թQ٤d+ډBmd[3X/}N4vhBc`3M*u>;`,vwxY> %Ct[XA B(ѽ.Gro%OB`noy^<2Nb!Ѱ%̲00-ydIN|PgGꅀe/'[lO-iYۅ)T8f-/'2mMf7Jz޸ 1nTEtQ߳a8 c~7ikU;AMר0B'8 ƓoQ0rh}r!Ss duxޙ5NQ+=i?ŏ`u}ݕ37|J% BRv'/;{Tx>[A2 \yֆ߬4,):]Mh8nGC9~LZLXb7!j0mR@>[B &G̙v!r^hfoᘜHFa_Q"rZ5UY%6.NENtsNl a.H7;mwSϚ}7.exJ/g~7Y.W5'߈yfyf/PBh* mi(Q0~{q. @vJKH0^D=iv[WiJo@siisuH/X~J yb.{r>sLۋ^8Su\oÝ{jiUqbSYŒ\ }yLIқO/.ޅv, ntlbh$U~&F_Mu|3_/Od=5J_UI/L;~bk-A?s5q̚p0͕yam+q7r`rXR̴f<\}`,Pb@vv`  ٸ`n*DO~kVvC)&PGg8p%X*rs!@q/2BVݎX#_Z =}W#- (% FmMn֟ t>FPDQZmNz#~ 7gMCBR8QbNPV6yE-ꯞQv-믚{Ҙ*)C4b 肩 [84O$z|Z UzM[(׶_ytg 3us91WqdlA$dJI0*"a+XEhB7P5 ZsRt3 `J?YMS5ԋ zMt1F w'ʐOzm#C"t& nul!b[LF%rmVg{3rRXZ͂dOD&/Ym άA2&ǩPJZ?-#cקU^F镅%ocfh-53-ʚ qaWٞYnԭ%>vxig+\80Qn҂e MzNivb&-r`{=G=dɚtҚ"@ 2wSMab$sVTa79ru6h[G0N@ZP .o[Hȗ2yHʧ٠ wq'VSJuF}Z`*n{Z9ː2Vp̔BwD7κE4Sϟߝ [:~* &%I>wlRٰ7`1Ȝv'6%ZÔo+~qS2'Eĝз)&񼂢M䯣.<fm~^9 X/;3=#6&f͠h~CO S]Ú.({K?j^M] s Q}"+1QYm5թx'4L׭*NX(i;JK6B_D8! 1|<Yd@U}|:n7RE?(xq"xx$&>.zyVl`;z (;rOY }KtG[}MLgCuѫy]DFt}dn4;EMT9WRl~hs&=XsZ h˵4jkw2.ۏ K8S鮌KFR|?Wd8ksL+=7c!k%*f©ڝKE$[5Ų^'o^ m#j f9ĀH<.%" 0.H8&Ҁv g|r[m qS:Q'VPIuMέw0Q}Y<0҇^ϚR}x N48\.s8RFV O G$pnirtEH4]HF>)NA͕e \Mx _H*NR*S֏ Fx ۺrǥ]++l*h]GX Uj5.%nF< p[X8]Z9~P$-HX&[O=/L68Wg+NM"Zz#Re1"5t/!f},\dm,JK_M <-1dZ~{ain&35P!g}pyNr;6m=L. 10~g*3Tsr QGn³DW踟.m$e=B+u V)I\8ʱfWo5u\Ç-a\aq͇Zt#aH&'6H}rM;n|sdR-}˸ Tf{-?O{2eREV87$z٣:֪I߹X̟"ݯ3n⡜, y HkՐ-KOĥԡ.QY7iD4^h0(E%ޡu1Q 𡂒Y 5M:E'LI%Tg ꜃ }@!e+ښAS׳0 ogԂ(δL#vgHivWV*(ج " ˪jgYjSe4i5bBqG%2sIF|=XN@u4@(Ȇ#_$.mu]ةI8z)\)-? ˙ k5;xyGL Sn/DGUPFO#zTdg=IN'yX sy֞I;]P%WHY ^.N G HcF#FP5'\ ^Սj_߼F,ސ CDI%ԫVWO" րD Y&N뗓2?c 6P.w55DM= b-x`25rԠYĆ\a@EahOnKR烖4ig^mo^Wfaz)_pBgR@[nT[@<ܥ$){<l4t|~+a)aCia&r:*3fw&t JD:?Ej@:G57+v53AV3 NcՃZSlh3M"u{-3'"@-[+9/d "O&2Q _0hS ?l!VTV"Il7bmJKil`hΕ%Q0W(?\JEg?B09nј|{a5fƼʴTf ~ebVD1` }}s3`*2~aXdj!6%cm쁕fi]t2ÛjPSOHv r &X"+%4e#8f$ittՃj5QSxilv~B߈E,}hVk Yj㓸0vGpH{/|R^|e׽)Vxa8([&nR [l3!6IҶu.HSH86r jTQlO>Yx> 3 h&È /Xn`"}n(H^!u% E[*࣒&&SIUqSn&<\m_Վ;fޔۑSHj}gdN:ZS"Z"v Di ]TJH.?n0Q)̷f='DeyoAp5T>wrԽ(HkUw<`iWFJQ⠰v~{wY$X3 ɇt8i?}Ѿ=q[!YHdB |PA_$QEKH&L5J'q;YpmϵW5Y<"q?kH`{Rwo7<25w6?ถ?}il"#kh67e#SK Yy(uH.b_O2ݦs`C} ϑz֣DzJn8\:( 7Qns_cNeew[AЖj^]y զ6< ]HErA&DQ9u[LGrkB 9Ξh#d`ڒeI!eAVNjBҨCq AI޿GS">{<|[n˥GO/֧W-)|fS.raJ3E5wWYut3a).3h#ClJW׆LKY/D$C%D/};0syԀ F8uW{:/eƉ\ w"& œ]5K;KQ,m#%8ڌ3,i^(#I{WuZ=vfȨv~ԯ8O= z9W3kwZcآĔ4׿,ZYceV ]ʱdRK#LK!XtY.It[)DU+<ʻV:k$KLXrZ:{,|WdSv* Pmvn]tȨ," Zf92Sm , 1/ȋ=\ZO2 6IqJ= &g*z{<R߼bҩE=~?@%@ 'hnƦ8\6jpz72DN0(w0gPu-+3&V~f;c} y 1ޛ槉Jq*֢ u와+gKzg4&sjxJB~?Wۛ|̄7uڊW}"\?9["}*=]n1IQ!."SPVy`~<Ʒ|0XK,fKrjjŦ Blzڴk:!B%l~]Z[#Qf 7A-$(x:PxrtzFuUq /܆mŇy=eLγܤ[GY&<Hav30C=*[~󕚜%:|,iCNg:& ZӓGNKDm|dVa9KpmVo4t[kzO#{qmU!݁|D<GV2t,b_]$,> YQrQbR&z,ρ7@!n%]l}b-:Igx;: >~~Cv?锘y]@@s$gN3Rx ^t+6F>|0Cm=+k3Kks$/@wQIJԳٝJV(Ӭإo{69U@BV[U?۲^QӋ̀p,eRB"==k@sѤS,;< :1fC4Gb!|Zi1I͙Z "k+?}F8/J.;K\xfz=S# 젅z~lUTUZHM#K^@pT4TM=U[fjVm|j1>sa$Oom(VhFVYJְLyj%G^JHDa:\Nܸ67/H仓tݐtBx.k2Gv^d[s 3AdBե'kM=RɑaR%u7 7y&$s.-߷X&jWݕEsSDqU Oip9|A0OB}_"͇*7%7 Z q{ ƉyθDT/r!`®F3 NKH;z%nQ9yNzgWNwrWqnCJ|1k: D}4k/Td?&U\! ^kɽԲ J<*Y|bh$w~=4w~os'ӘM|APuF"]MiKDILBs7dh(}Nc,?멿i.3DžBTJAHIl3c/L~YitcY䞖6Wdf{/NM&p-4\I֥-0^aV*5ĪڔHiotٍĹ ?iljB̵,}dqS>ٛĕ9\N;:F1Cd[t ;TyZ `9l;O:3h0l E|y0I"_K Db'=h"gM8ߴ1|Ahj,`H(-u/T`VUc'zB<ƙr$iHFbX=0Js1_گUaJLiO,#?ɯtȄց3]B0b/uf >xhQv tKUrG[* -t~jʀC9Wt2NnoGCA)IQ 6waadfquk@(> uiѪnm郠F8ьÇ;'ӈa(j`&<=TO ٣E"bݖU&UЮo^%G6AjJbO !d.ٶgcg"v$&1 cR} c)ͦ^B߶5>_j&oyM |; 65?OPS\MH_򠑵?a^:z湿ϸ^L (~őrHx71Xc0a KsY] :̬u`XΥU`M8y#WGI;h? J(gk"kűSjm'6` VGIW9=߲D+[ȺE,RfRұT[a+hɐ_vQG6FUxd诞'EA4rs?>\80D),hz,Ĉ/ .;8'~:ůV n!knˢ*5p 2 E+\D *e'd!vahp 5'~D04lxP<E"@lOh w*i3/#rA'2sȉ]_{ \|[CݿWbІ@O=#<+c`P0|BSv{Z)426_.B`]5L"~з׌ ζD:*b@bad43xY)у \Kwf~d/tبԄP H۽Sbe׋( Bp>)`_x'v|l꾔l/mg[%q{`d>stc!y&l2V=pGT5TyKb7>ۍ(,ÃVG Xt?D}F8Ac 2p($Hzt N"$\d^ G,(稙0^V ?(]ݡ5EYQhvVzHKV;+?!a̠kClO$_돿3 h [e42&#Ď_2dJ Xaǚ}x[n^E?mC,9@J%@zQְ:vƌօ d4 ٖ w)Vn`5.8 QTƶP0hޒugujB)(s$`ۂؾ?I.s^3pHcv WV^770AA_Njಱأ8rb;b,.| W%H#!y%A ʆ)5[ )3Ӆ6kW'TFYUgyy۳h}Ƞ,Iʡy+wa#סQoYJ=VJ +^_{1ܕa^ 툊!| c*åLYRex7링Z Z>`8dމ)\HWB:{g,GdP(e}?vk IH4Q:deZ;1гHɅibҸv4Zub3I`nIJ4CMtޑ : O!mZ1]V'&̽{fkơ(e[}w<եf"zFFu5yS ,*Pe Afs^.1ōޱ'㠖hVg||˔^n-[igb*K )*iP\ ?:dl{%vAfǂ@Ÿ]M7]k?Q|%V%o'DK*,4x"#{ܸwMlZ~2)q8Tu+~w^VgaNؽ{Kjah]kfn0#u#CI4t>iY˞4r| d7ж?ſ"Rw>_wt+/<EA;Amt;ws0 /!v|TL=kQ:!V;2JhPx+|F'Udhu-p-'@GL+SٸBSoTpq-|3 A&TM!(2 vb5%LYq:YڈYp1+cC<` 4ӈ*1Ey晁P:? != mvM"ˏc%02 UN ٰb4O؇+"TchӘ( eǰrB isEaˎ_jY)j(yy]R })NhMbэ|3<Ǜ3' H9#X$ t.'pbx|ad/=#}dFdј`Yu>4InoCҜ-"QVKjLoIwu?!:z43efuZ5{-ی~6O?HAc[S A*u 0%8} =T)&jnE>Kzf:d,f5;o~E$P <2ů/;d3/HXo}ټDSFsۧ#w^m& Tj9 -#E\`95&o-*J0 USd&0eENxShpƬdUǟ])-ztmp݉&rʶtC|;~^wCpN0Vv;q 8N ӓ"gjAϝJ;* rK;|(5Ǽ|E bp;hguk8\O~1oؑ1yVV@7\tAt14W 15`ldeJVR)Dpo"esGX!o)V~tE񒒍;G1} +>CY{e 7j*pc;O8**4\--X܏龤\\y_Ont-#Ek+:IM0 CFZ&[5Buf($(sq˵5? P 0eDE, Z f/nQ#A(AX <#bHٓ\Y* Etd r?WW0sǗt&}B eQNX^)" ]hsϰe&#g<YB&SZ9VpBsC.!89v{|=B3EK]+] c 0u"`r*_$l~~(yz|0@3FJ:BA4L]l>2[ Gr C⨝1?'sNc-Һp3n-d(G˅t,eaӧȊf@J3Rzg(3#8Wх}3^YݞAE}oքpDXZr6}^TVLCC_-\c~j.ħuɎGu䍄HӷX`2'AwP\\Z ;v!l?q IcoqvʮxLyEV.!_.hg]ϸ^UTR -%IO`?ESPLP )ڈ^ =a 2)n(CTtp%I`r?TO[e?u~rO{SvcH+io9j$(GDk&C:d W.[eܛßJq685]'a&xYB Vͬ:h;$vT 6"aj <#*/&Aʕ\tNMQkrQpGnZCs=^ LvdJF6@gjgpeQQtR k u-`#6\DnʋQ쒧 v/Hzo4>hVhRߐgArtkG5& @1e,A{+t~b Oo.hWso)οb|Ucmw(:7]`AX?lt5ƾ(v1ůkPeeDUov lJ("f;ސE?U@Ϫ!_@l*`-τY͎*'qJ_+,^S5\4;E!xlDcR^a$oԳ7yNPcPgX-c$O[fdPNO $E<8:/ԍ/2wo]Y,nr?Qt Ej.gBT b_llεZaNؑ ڗ~&$;3W9xMS6]C |M/T)mȋ^u_a1~2FRM_ @f ֍R $,Tb̊V2_w]ȋZk>,#THYTkϛF!A38z/Կtzp7zEP7*CQA~ <3$i>R{a ou>nGĬoc5;KYDYDz CC#B_w*h'\ 'q+wĚԡ߷T b^b[7|epRkEK >[ٍ%D*<#%OeBI./t?y>IYjW%ksb1ήv套BBެ\@Sl[ay<~qj_c6ܨ ,2(|>+ꙛݧGC:c3WR1E1r%&pEin/G,V>xY5v%@FFt9װq8f>l;Y$eV1pN[&sDF2G/|dCHڝ@§"5|5D4#(lbK0giyLo匆?PL:.A0d3v+s[woU$#\M"a:{OM ;kGQgs3rv;GԪß~ix fKGVu}[^i'vVDlq7nb.bf̓3'#fz1yj)D &Y tWNm1ݻtZ|er 6lhIj=1IDpMe ԧ7| C~6I~O qǺ(vP}X՗ϳmR}S9IX]&{ ;ַ)*'vPװ& OZ8O[/;3j:[>hD.ZK@Z}Pk qq9.3vBGK$Or :]Ok$[qAV0ajx"!yl[pv4sXYyV*M7VN}B,PկDyxꠐ]U;`(8gsd3 %#S2t߻r9޵o9=j[;4e>n4Qlj3?O`[z\0 ƨsq*2P3ܑN}GE ̤On5 tL=s??xu{>F7LhμP0c 6M!.F C'O< RB;PiQݲJFKبv1Q_~cC_@qLqQms2^?;\W pZ^/9sq#'m I4%x9 wCUi"G;6enwEP*Z! #;8&@Cr PK(4Lj)-kdp[Q0X#tKlʉ݋wg8(U҈ cA>+TUxvl@)(*?GI  8 3&]W\ G ׎#5gl7\bUJOq@.Σf9/_*Vur Z#v7=I66+m +L|z°| ,]W$|k298eՔ]ߧ]):rSӺ5U1;c^:QQi`BNUUA{X.Voȶ]LM@a_BɵqiݢyZ^@/ˇMuwe?_]W ΃89 di둺 }*@SiXϨhBcfe- Ua˒OV:)_dI=f dn+WT@.s+![qc.mv8E\q`}+=?Zx QÖ|tH9@4d62I8FgJVmT;ngeL?~oj ?&c#4I04CeUJyR0~U$ԕ3JRvRI-7xf&U;~2:'s #OY01`Ӵj^~gb|ܡk궳rzdd62[ ,i0Pv=!{ͬRUX њ46`xYe,J XB$N614GnK0_h5#b/pMM;9;#lha'O=}նx3~/[MK- Vw:{kzMCy&L],sP6gM }ԂIHC=##1G:[eOLj ,H^Ѩ0bH!,GWmSgq%Dixpt+y筰:pE̟t˙g '=< X6ы`TWQ~,X$,]}$$ ߰zO=18D_(ig hdC쯖DIK=hzD1>iL.Ӝ1 %>F{$ϸ{>:^p%$&eC4߅s[*0x^Qf"M:)=B-`=V^MDJY7ۅVXr0Zi3 Y&GA婣Fł^1_CB +&TQzX (rQl{1G6 ]GyލDdp:S1%"]jbp9sg(eq`xuHR1IV]c"XbAy>/UOݙ9l>Tؽ #-'y*@w GO꣍sQ@w(VpyEH溆aJN@*3Wp\A.)okk10SdWټen o2LH*_\)ui+Aw=4Ȝc{Ȳ菍 g`]SJR`:^ʫC~} ?< e\ YEk&#{셦AcÏB£wK߾R+|BhrRG]t}G]n-dxc.o(тdkD՘q⩗v "br慁VDx/[J-C؄ĨBki|VҖd+}Xɺ@cu.FUj~!qayJ<4{(0X r4&TH)?:G% 9'Y2I V|s[)Rh6z8[OFV"9FS)stpI2"ȀLOFdc(wq< 'a*FcF9XyFF+um2i*WL! `4DlRxO ǁzh`vJ!nz@bc=Dgg5t`su\vJ;ubUG"ε`Ĥ_Hө 6&<-$D!Z\=\>pNj\ J' 7ZmM Bo?%\k/  ~b7H?N~u0//%3{:tѓ?Ž #ۡB{$ qz^nmz#7 ݡ_*u#SL¡5ej&:Jo3#̳kC^7 3yؗ SEX@e ?=)+W] ~յ 42& ȣr7N!7 0pCJ$J;pNV D 0I0lH o `tzauyQa-zj^(b&oJ+ܵb^?r+rƛqc]cM4#G|el XD4l@Jq~pC^s4)YyvG\s`Lkmiw#$=QVEaT2%PR-g.ŋ4Tά$JgZ)Ms+ʶZ`tj񞌭ۃf>{4G}C ,%M؁VuN8UR1.N7 |mj8-g3 ~a"|.VC_3ZPԵHüȑ@,J_-ٮgA`X6 Mtx㥌wRuűr=V ) LOJ ǿAIhPf}#QC;go{b`R(zP=o6m]^GT70OqT-3P{uԽ@X !9K^^+foujQ`Mld}O~ta۴W2۱oɉ xܳ?*}\0\x= #m޶z ]RA:3"qDP9zxny90|sh`QRbo]{F2^†+&hf6/jv9 ?*EǼW? d:ޤLn7b3*Ɩu 7e^N`-ܺJ&z3 `rÝ(ͶoORψK*!qa~r̼ >/|/<vʋҷM xYUaX($KMOVm(|_z%ʆR^^\/Ų'Vs޹u ,CyptAP\8Q801^<8XؾeOD1I{d8b͆2|\j*B3?Z DdNk Фk ƅdF.̳g*R:sSzSa4؀V7a3 ˠ*-ifۖ&l*v}~CFq|TkX>ΡDVɎSoΩXQ ""1)%،Yߝ8b1LJj !Q< /Ѡ2販|Y51LR"fOh'>ym}tIŚ(}>M#rb_ ^ADJiIF|bu?˷ DIEg&h81 Kh^b_0-bQF]p@ '..IZSwe:XޞZ]k~~QUO5B}Nq( Cm+ꎿyKb<4YRjnEHc/A80҇&puXtw8W(W^=F<6%Vc Bj [Xzv h.d</ _rPA<B[>B j-Kz4 "nKAb:x͏H˔\5B$[g|}[tb@jNU^§{ }-jl 5tΥ `z1Δ3Li/ 9j!]ީ: rV⸸tY;+jfVF[DDt:TRBQ(sC_fouΨ";D7ꫧ4;zq^ʎV-UtRdfJ%kxVJE^v=jBOD,f6~.SU`g^$W3B5h|E&tp8Tp&{Fe;# YPgSfQXJ` '9[? C%4fJeGwoY[\wrrS=Mįi+V΁A%> ;I\CzQ?10\ g9}Y3’FWT1aNHY֦॥}T}-qgv6K.ajҮ%=Z`^K gLR܂RY=t,Gӄ, vV!X eܣ+B{eE<Y%QE]aٿ{C/3I.랞4d"k׮<-v uwIe:}$\;Rƣwʹ`/ttk=522_, \w~pC2[|)[Vc(9N^mw%t(S|M۸hx*QPX0.%FiX(0x$gc.4;Vlnn7μ8Nv:9:ॊLo2 rn^wL" sM4q^۬^@BJ6vƲv;}ۤ4$$=G0)~MkcrPU{Ѳ zhw2so XoMߌf!f< ,[,~JVW6dI`My瘇_tL00s0du{FlIlx Gk Xk,U-:#ÝClv'NY CwUbkCY@?xA 0.B(E,:Ao8lxZ^y!b`ApmvLڱD`T[{X@X棺pII^ i"Mv*5pWFڡc5.t^-IBۙ Tت.j%;t~vv\-AA(-Nh^ñ&ˑIH#ܳxco`N;m.Q'w\|YP(X/FŒVGl8f-0ͅ}`ɚͧRsM\{:S\QRZ+S&i֛^ pq aPXbiuA1Jk[%41&vw;w1lk|<#XqwV^) fȜ΀ ϧ:. QQгJ@%ͱiT2?/y64]l v0rzW Ab c>aɲ;'VwGg_ K[,@G]7wtq-l dF G54"R! sa56mSZe gs#^!sMՁ w(6=~PL$fB<=ɦFEGH;TO8 t.y@o}$"-S )"imjׯ,,(/62F1CخYo5MkLgq#sYΡyYJC&(pfl#҇:BIՒ!7}L8ϗ6lAk-fՌ_!{&{ 3j5[ˎ5t8(!ǟ3%ya[Yj, rf 1By˼m13_CZ.á~H% Z%675fabr^h61nu 1PZw9gYHBҏZjϜSgTb?oOCsEf[:ke|e]7 N (e4щE>#ƞsxEݼ T|yڀCv ӂ|4t9+Vb\o"ؾ2>$ͅx){aٔk v2s{/sӺNz Jko[;)Ga{a}Cn& `8$w'Z_742 )O FfI g@O)IUŏXsdu;~~F&>^bVCI^`u[brn_ X?.PEDlA^ↅ-05tzp+2e=5 >8QPOh_FbU$4уWSc qUN?jw_,"!Ͼ{_FgsnY&Qyd S =WcV&[sECL0sp2Ζm5o6P%Iy V0/ s(0P4(FGyt,G0Y#D?`o$}UAMY8㈃o8f;",*i2Sf֑Y$qcŢߥfRۣ3k;~Wh&/[H2'ïBFEkB!䤔qBG!EF蚔x `] h٧]d#`>%z߂$#ZCG5="lS٭3cnNuc_#Ge8hΘ xyӅ!f4K>I,\qQސ0o4Ro7JҼ8rj1͹鈓zyDDn/2g7ܮ<n{S!\ 73v uJ1DaS[,&$ݽ6rǍSOa"0v. ~D*Z.yy 26ѝT@)g?]1tt]$r;~";3YW?2HO[{Q*oI1-G>{5eDBIdZ.}%5ԫoK6I,i4";u+Z+%]WܓJ"X)œ_Q*)**7 PO*)6ͲC# _,4޺@oJMtIa/ ;͇nuLVާkm <[]&bNd7pl!\ Г"p`RF*v!'9UqynQ~0;T V.U4M yC=>` {L\4& aw_|`AϏcVLy~M3 TBnKUo7@^JHfOUiے&Qɉ{c|>mMRR4dM9bc'bxE!nB`8 kÚLPTG&v>Q~^Tx)G@a*V-T[ʼu^mucE19o䷉[)e&D0)~:)!z TȱEƞLWvUmJD #<pU,9yYeslNk<I#ۃR6/]>O б2ClzC;&@a;_L&,‘PauWFܞ|U S ~㐿nzpZCb \CCJ4FV, EQy2 i̤}gV(ڛӒ&DjaE !̀%T~nK'f w i,zkF]]m_`|#}4kNhmArezWwLai>LLԈ1ֺv"H\CKv H1_kx틶ϩ`Y"L0賜y&ZpmPF)<I<3l [OZ*͗&;;&Y%[BnYɟEx`ݫ"2!uK1mgPo[qgo<>;AUDV85, , PIaDSf pV.%z|Kl"IӠ/|EA jꄾWlJ|.f(npƖhoWus~jσ'q$D7;p(_yhX! XREZ+rz:DFcYAD)5wRjhrs{>b@W* {2)e8-Zb0҄ WyjS0)W 8! ֜jqolM|cnB8$DD4=Gq#iDr[W5`ԛv9?EꨈUzڼ6ql),nղb*s}xU$LӞ;qi+ $~z5V^Rk疉P~DM oU{ R*N);n^x,PTCQLibW@ioRP:<Sk<|SOk32s\lC>ux0>*`-ZN%a_v dq7K#x=.1RٸFvj A$mp+B]\P~&RBp-L6wR(y+՞ս:"yKotziEݧX*&$i"~xU` B ҂+ }lztgGBΛ{(hiF;ٿؚ Z@.2A9B:+HJY&k(Np'$Gk٦/Dd4C1#_s1L攓UoP~1HSۮ7܂" =V tЯx݆NӨ$نfH@M//)S;Ķ!rlSN;CUO5>!/hZ#z\!19wy\ƌ;p"(o/:lMv=0iq!U)q^d#NYH2Ms~YJ~:qMV!;U$O N2".yv\VzPbI)A@dlTz^:Y_S_~ƣ^{3`n-@jwz[[RaT/pGl\|US}t %x8Lf/箬 9+HNϡj9H=]\X;E%SY[)E@(b`#_C2[ro=Wc!Gf?h'eWf]D.S:dQA,Tφo|/_\On!h&\0ZV3aXKGV =*Ʉ'!Zceo~Tkd }8KcM t0KmW'Kܹ:!,PBz1;IzгjJyzcS@P6؍n2ok Y[=W8c1 ,ı?~f_P׋MJV{w 6x+m$-sNAXP!tatJW>˳C^6(1|TlLxptϥbjyE7$xģpBN/er=il瞝[:WZfr,_RwZғ9/%x\mVT\\u;+eťdܞ8GPH+4_~ܗ]H?u Fy.hj`1)^ L(#v]87Mq̭J筙W9X_/AEabU{e6DcJΜ=Rl$H8"2OH13XW V mƝ-CR%}!Syr=5xr{01ݶ`3=z@7a\#r[ˤeQS,)M^ޝpi 07e%H Lx =b?}LrLeB}pv.#\2f9B=><\;sY6>"L=YtheU   rb~(G{[3qb VI,$\s;;R"&~86dWFy05X0EG m$Pj7`Ckԟ.}%I"c}2d<3:C$vƷ :WV뺫s1 <6-2;Ռ_i^Dv% ~V=ĩa̢i]]8[6bz6n)_@W;Ѽ'':\l~YYV?S˟(wn~?%p)NSUPAPgtpt4|Huf;@J @y>L&O`[ߡ~ܯ1ؠ57~!QayՏh⥌v7Ek7Kl@y$'l"rez̆yᲘH 7J B"q.-W1y獦f u+_.H nF-XL. [X<^rh8PQ")!t| =e^C ߱ddmóNa5CB{ *\b䅼QK–Em9S5gLHMc}_Yvu0 ݣ0c=k96wFAp@B2R)eMO2EUR.4 fB/h (PnrCJ#HTC'lI}T,MI6 * 3%r~ޝLlOlKˇE|m |\i@v#+. T7047ly&o;!Eݞ9Sb2xZ\M -S)M$h{mlf  tctS%NEhӐk@<\ VEt!) }Af?i qdޫ_3wzmpRvx ~U? $Zl <lƸY5:ո\_n2d9ٙtwEEMc ϊiP-o0_'lc ېMDWL,ZSm4TTyt 'Z |?4NM?NK=qF8~e$VN&OB}=EZc [T(4D<4 gy*6rCvp!#`PN-d\g†0༄j!>< K͠ujNw=ϝo^l5)>Kd@⁐Zs㻎̤쪅&.hzį$]}bzglʯ* A+ .ev&IBFJYKpNqshҠ^2ߛ̩Jm\TDD1A#I}ƖOl]2{V B Z)[}blR &48AyhJXC:EiRx%ϊ.}5XM.)քWN*ജIm"-ruK,uݞP8X30 ]C{S^_ PK!kдꂝ#݅@lc̗!DʫZLE"^&x_Mtbj-0w9lKsu|ƃm=WW;q{?l0)>W]O ܸ2ؠC4wˣ5LRmoK#-6#b*\52Bг;V*b` I;ҙ03ެ)YxuS`)ĵ.꼒،`WF: yix].g-7ůٷYGl>76| *U#81 ǣԠ",?C4LOXxk'F}\ rb]w??W)zmɥkmNwnI{*iw( 4M̔և=qp%~WPiAh~y@\( YK9LoُEܧ< 3~Nk]ΤwhQ(=:7*PHmՀ=~*m=L949vlyK z$2+,%kd^U<ضKϝJ?!_)Bl=*↪Y`0JU0t2\OXԃC ^>dSpoZvu(T6YMizpQ]>U6V 6:ٛ嫳в‹Roں%I i/ w%?*~D:t|~[ 쫁3)ghI. !ƜqY;@ T:%. ?9'*ݚQj D,I/:zǐ{W 4 J<%+_5oWQeYonX 3..C}f PҜC'9{enY`Ŝڃ10ax!ٮb"GxuGAAv ؕuho+98h+<`1L#/'4`bŘrU}Fc!q¶0̨:PFV`hȻ;9S33٘s=a ΰ=?~E"10ECVV2y#z4>}(4-%'j%њ*ӢاXu0fvEI ^4[= rN Pzrk~g IQ%\7+q^j!yu dn"m_"w=_=)$=a}|wb&~GڱŐ}kCғ>l2G_# ]{q4Өj6p>Vo>;uoy͖/٣Tk*វP;;/&Lti q0/}uQ~@qm)U6бh^Ai-ǣyx#"Jw٬h=>ep֓ILQ߰ӭza#[?Lm1Z]׬aH"m,#Q.6n0gc-#f828J;ᐝ6K;#F2(>rVwy;@tX 9ɓoP@{z|9"m!쏕rًe>v14b%Q}~Xǐ22t$>{t.1겚}&ZL+{Mǿś]7Gn~ȸ5](.{<@C3DĊRċYA 55GM!+ZwYS 5'w_U%0=ș3o{:TSuJPL~3*!k `iIxQG 87\Y}4R`skȗk&9h+-%%ӿ$Qơ]Vl9_sI`It[V.(>aKn+g9=!sCԬG"R+і&7x*ma,?l\ZI-Qj%1@फ~^ 9V9c!@79~W@\596M|1rI1: Rp|o{ .~_DP$岝:TO/ ;)4ҷ,95*PTi2ղ J-++[{-¹4jR2 z Pl0VCrjƒ+L#K=+,]x$B;`^M[ s{VOXi4<`B8-s8 ֖&_ð^ ]ǥ82|I h]^V7I ),"6׻zk qS]cGJMęsvoqlKŲ7 16~I#ݯ(sm175n_'}1Gu%% F ﷧s]`|R迒%kU73U$??a`7snI3JǠbŴTGz,:tBd^p} eӕCB  %#mV PO5- M5.~"o"Hwn2fcq?[w)d^$_/qJj"<# <\@bN/F>d7&6e ъ4&-203`cfRB_lԆ crHNsH1AcPR־$I)t䖯LpJ6 Ʊ([v#& oRnה3"{o&I7O9 U]o۱y DC;%Aogʿъc)p*f˴|_ tJfËTk^ c_:czEA8D@)v7IA30E՟ƉSm*)ꗈM%5/abr4]8r_@ BPuf<3D\IC-9^d }_zF V1/e&"eۈW]hǬJ= yQx~UIkL͉Є= 2Ҙ$qQmj?z&bV<SN ho`USDb=ץ]*~aȽ!0& 5PC m1[JT ؒ$yNoK)N*l*]6x]J3X7{H%܄I9wRҏK[GhIwhe} ds9{FgdS ww:!+y>дI$Sm :V{pt=9R.j= ݖ#=tQ RKSٻBYz8y8Dv>R3F~\eC !Bq7>rI 8A5oB Յ 𐾞1>"+A5z|A I=BPhWdw}3)  ayE»0sȿ eإh1@H9I)`[152 XJgM:\cjZJodc`\f RVo*/ $4>SVWn:G ^Cr|>֌>ɥxZ % 2\Нʌ!uW$ s a].@yؖLͼԱ$jRZ5LdԗUH8ץ`-F\HK( !y'2ۅ59P0}>qS9:=h6 DdVX{ UvgUV`f!|:M}ƮH`bEɺ5J5>](Id$#U1޴O7>!%EɍX;$9ޖ%!}fxʼn J1vUVnAZueBJq sf9}lUuoJSSmJ1o&NnJ|cF΋ k0Hs,D7oߑ.2jZ SIz.( Ot@Fݚ>1ϔ6Re$y..R?Cޚ- iLL0dRb(hVv=V_<?`4ڗy">R/ Gi݋2lqŒJu(:\CX?+ ?4`Zs$[E^ kefXP ]C@Xv ]ker[s, Rv:yq'N (^,8%{:cˣMzAoΝJOΟayM7 (gk;""ݹ>T C`1}bxf[L`s,ܲO3oNHjv| pJYU6CzXy:a^F#74Mf LoEAN~KV~) g\$9&ʰm혚 4SS N@[䓓( S._ʎ=4A;W.?Xz#!JD8 V<}D/Kc*78t:+ ePn:Ί;? H Or*5ĄycfAI6"83M'+G:UdW ^ڌnե-W-?ۖHw*|*]sa8rb ]xzV?6(-4ױ^ye.'VUmEnVxaGy9X磭ʪ'@w&9~Yk'*vH@h/THw';UOR>Sej@_s?7l$;lU:HoXJ5:];*FDA ĺf#3+Bhny OPWZw]xM2VkI 3;RbL(:>|:B`D&kMLXc,r|M)ћslΙ=.vO0LGo- OnfG~եB"gތXnvz6_CւP[_<ޢd_Ȉ/psswV ACqpend3t g ^NTWٗamAS8vɧЌEM["$ ݒ tX|nɯQYq,<iҝ)|79ʷ$;#}t--jV{>](JTK:jvρcqa_)ܚ}}{j"ʄsFs `m0!RjDXfEDJTN++=,v԰m!h@)€>"|8r#,!.˓Xm%5XlqA@/?-8=Cwẓe3d!ΌZ&P3$͘WlT_!ٞgVSRz0\ʠ퓡CFBT <+Myb<g4qBh~#L8\:O%h-}FޱZϰ;n`b@{EJ\.*_l03`w5^i;o (ݩG d8 .1-9'L{ &$r>?fJQHR'SƇH2D~CX5xUJiچ9aXSU?{3g.' AG;N~AHr xs<7HB75bll֧>^j,!|&9{aN?ȸ]֚&/mv|rZOj&`[ŷ._sB]dU!$h7߈e0ޝԋT\ ZgiW[~z{GY  9eo?b./+wA 0{Q/f.e-Eg%gL`]mKPltT-ݨbM{ P"" cN^rE|*8I3_/qrCU3t^17h6яqe\16aȲǀUGכ;z/1&_*:vi8U9y*9{ֽ<)|=;*ĞN_҆Hf5J9ܶ8B4zt6g ]@,`۶{&2nU9@ŵ?@:|jbz3fʌm1߈ yKϠtNJKP:tǖ~*2dD̶`yeLf6?ڻKY"^BJ HoEGس8M`>`!)"ɂݜ$qX>WjA]tKb8Xg/ UD`sa4L&4tNV %|sv^0\ԳHiHci^k0Ǯ=Q'}7)'%z N5.AǬ~) |{WXr5;8i'5^ mwʷ'5T⺗z;; mw{fƵo%:G̿O>s9N3*ӫݨM*zXCtIYk/q`v V7ULѧmvcVh|V??mlg{%wG* !i 6FRJhKxA38gGtOA ;*wE*h}<)J`g,s)zܤ>ӭR$xݞ+4a.Wֆ%)q3'T38˛ؚ׋T%ُBbczM[T16;#@5 5&>K*MSئPS/AB˸tC+,̂]P PS9Af-ؒPǻڮr5'm SGp*-sXY&)c8K"eI^.{塙Z; ldW#8"):53J$!#jtn67 'K܊:u*&GZhS]74.QxKqz7ڃz{#ҫb9`AQe{G ,< fpV+t!&'j/s_C<=$cnqq?7ާjg -Hsd芾k_Evkb2#%j3!L[\m/R[HU+4 ܜ͚.T9*jڋljJL&@XlKf*~'ԲO,YC>PA8_-p-M MPq>MH84CD8 .#qAf֑R?C |1_(.a  %2&=_Dw--3uoTK4AΒKwo- ֳXtNJg"g` aB6zsfv 7#y-"n{z%Ǿl pu;&ǝ0jqw|&SZ=[T_hn UZ͞4㛎lZԏrxki;7yG02- -EiΚjθ٨u]:R(3}]z _*OzVU&pQ)=aNd&BF'bנ6=mHmOyQq?fNJΤws<{j+nҦ @;jsXMsL: :H!AB{2-U0eR_Í&d`M=r g&ڼ5u⦎3gB{UkY81|-F%PjxU7 Tv|~^G( Ms#21$JJĭ[ZEJVK :JxM=R]Da?TV&i㶜;&gRkiWR1zC&X[jj{iw ̂ڍq->CZbl1N9=[=EЌx@76 q/pF*2ptNQ;Fp~_%٫_׀[Lg2]9)!Vv9T}X=|^ b>Z~fKgG0R죢w`|QPD*՛8zȱҠLȗܽ,*tԆ5N92|'XLZMsr;BuDIXζs P RQ4*%?Z6]ւTk֙~x/Fխ93i JN:(mtn0Au>>?}h[%ZN~o +~S5 ~ }na MY໦ oDjEN6@ $8D=/ `0=4: +S6qBA\2BHM:%ܓ#ڜ4~o)d J`[Ѽ8ЀY5M_'b|9IUZ1g8[=:5Qt9| (v1¯vjAid$Jf@iv^ZolYf<;ێɢLjtL~8UPGb߆7,e ޱ/j hRt TRG^I<1Ä ݕGBkɻ\8oyzB]lK7u!E"WѤ#[o9<4nm . Ff NKHF,PWiJ 8 y)vp'-–lWisz:QLq4r>P÷^/R҆w0JErXǩѦngzð C(%w#:ЮhY% 쎯[XK5UQA tS [`˩pғ.(.ē_1Ǧ'UT~np% [M{}>o2 ʊX! /kG< ~n dm`71BVwezT~Q!:wwkH_Uggل/Zd3:uۈCЊQw]ʌoE‘~ըQiVkW"'_{͒Yj\DZ'Yn߁7J:M}*5%Sf tmv15mƢWu^"P$0?ʲq3zU5+NpܨGTxrw#7Cx qKl/zXKI@ͫ;ML~ -PQӶCP၄_5G {vHWJ^%O=ƥZxi`8\YIפr3vK;t5{Km=9-fЂ7,ݭtk[f?kre+\fn,yJB6Qo^7O}#' svbDE]ˤ;c~\ #QoA1Yy† v\@#;GљeHF;lbfA`^(%g'AĢ>>#*kmO;io&,C%JKv$Ix$$ X-eUM(Eg{(es)1{M} )E-꫰r$לjPݙbq"Us"r5H!U~tOŎjΉQAb{d}jf_m;c-Ӧ [zܞC(q~Пy-v>#_ՉSpBEc-|{F3x?r܊_]@ PS"Tl`eM[wuq:t x+\<,(邒BL3Ӷ~kl.=[#"eHޠ9[B),,d?ɟ\qg9Vri3X5Z}B.&mM2Dx(FJ*(^z3X`"L=~Xk@;QY~AzΛ3{oS&D@Rl1\[iiUSoNYҍ ?04San$>ɺFI],C0o" B0~3ה=-ud 0m} Xy%`,:w(n/:[A=hIdQ_Àa1C[ɤlv`BiA mjY /$[Vg l}kĨ#/.R fxgzO{Ri蝃{mV\9d=*iUTr3n9f*:,D/59z0""{PwU2( a~#mGn4~V@SMSNav t[ƟbJ4{|.JSB|-# **iHjj6U ?TηV%!.GW1td,2CfҺB*dg0cVPr!}pHǏ=VN^}848FC3 IJ:/.S,~4/}{qiUܙ?C 1`x<\EkrENs ɜD o3oML~MY_E.C/6;)Nj%JUЎfj0ՠ43Xr8?P(zNON(* $lmOkv,D$iwM\rY>]W/,^y`r|dlw*u=By `Q6{nH@1Cلa}4=8;M$|bDCPsܰȒ?fPXUYׁt "enpni:a,vTSd];W9̞A`[k!£1 J7]QO#W e7oGElcw:h/kEܹ,l3z. M $YRoZ4`j',K>3a!٥)X@os}AP / />OZEK7 0L3YM< S!|l~)&Z&U7B@9r3sRvԅ a9S"Ug㡞M]3B1t˄a^81 䦪h˹v)L}!mwFBZJs"F{ Oh|h=V~/QnX]ir]6u #جkJG s LiHsO WkA]HK̔tCK7ro4*R?푥8' /:vFJ_rEvD4Ne!9[x3| L-dZ `^Nu?ɦx|\Gx ̕_Vt Qa#|!só/f/w-f*\ O4ұ%haݒ K6dD6 3o˃: #ýmQSМ|v|'f {YnfT۞ƊƋ4AHj *rZx|=`P< ~{ MQj?vr3mF7[{%씐tpt ]]0oYX-qi8M>`BÌv(iXiw%FS(r9%OpDcBB7.2xWHXAA]×aZDsdпPoìM Q?[o/_f'd7" I Nw(ԭ쁣*{] 1M@w\-{w9-bG{UbF26.呑aʻTbpgx"lJ"?Jgw@ӂ :O 0ٕXFq 91g8X3$6z%v.24ܓ͚s`߻>y#~CFl9.c x~t 9LXCwY?@UTsD91[?&pݕ*G_JQ\-^.OF/.P|XɌ =e 3OdM[vQ ;ޣeq%Uڼ}zeO?ڮ<Ǒ8IzFXh5+΍8L^bo3YBCAޙ,BSWȢ@F.ԫA9[f%(G"fV'߫{g-D(1d{pWQ,Wg4 KcqzJrHnXb2G?7])zʈlAcUևk aEmZ@ /fG?nk@t`ړ7B< FL7PP阋dm 5/\k/uQܧ(oUoq]"H6cbhd̲Pzis"ь}q,.ݩ nҼE-XxrZBz ǁeGR{cBW 0&a6.BnBmH@j2oak@'+-\wb\C6vK*뗥3,k>/(L$)K<04_MI>Deĕ,yd&  %nWGK@Rvl0Fi}$NVYK&*$/kMnrb~pܮDʿ$p4=y_}Hy-m%97U9F}+(M-Q[ZuJ0,8/dއ.&^O14HH`f@' juE)SBpp_cpLxB1oV*d"*Dx2nAB_cw%M4` 'UNKl,d-_nUr % t ekE* ׼hқE*s]yԌ+7lx/c&o.㢕L3Au!+}a4JǗΊf}2i"2$-.V)*Ya Ua%_l'+1 ۯ.D_ij|KJݦG/M.={ 7u,I0g]-Jl\_Y"kD03R+&hp3Rp ,= h}J@DhT›e\ܖaN[${d \)S[$}oba%!:AMShZ|,ft f7F"T%;.#㹧ejK*w@hFUA'pB_}-6LlgTгІ0wiy⦤^A6hoߝUV#SW2=wNmH>qOWM>pgŜ q>Q0J1#jz"AV1Y6{vjӕ- utEE6F|$F ̄$Ӝ[OvuY;#`6 rG+D@ 0&Ø+,>K)!˿V) P& T%sXY96]s\xy㘠kTx%ex\iʯ%?fopJ?qBs$>)7]_nq"RHߥ`Is 1/8-FˀmO=NT+T1$N|?\A=!B?ۋi7{Z_ڄe*(s;9ES5἞96@{XiOX-<&!<Ȗh%HE {8QԵ^T_zWLkHK&+ڬXyw!ס-7?!9D؟@H[`ya& e+ YYmQ0-2-5Oo^5ǍAߙpZ*4Hl!OoD9PdTH[\rd^G(XM*Q "5?gG_(^܀͊ͼ0^TrGku%J-|GF!MpQl=Qh7lt/ywio̅吽ɔ;Xl( H0;;V+iyfreFYPQf5"ޤ(̞A|=1/xGeKM # ]Z-u\xm*?ila?i|ڣ\=]0u~W[:yHpZP5uUjSɭ>E˰SRp#@=v޷v0aCݠ?o$uM}gk ’ϗ+TЋleB5;>@gBsRDjEqÞ7/)+{ BT>.Nn.P RcS؞b?7IFÿp{d|ض3YeQ b>4aY,!}äweހ>4NN`67gux9꣦ 'Lc Kp![%H{IE+ď795Gvl Қ%(;8gM `g eۡկR5i=}S2JxÂQ-ͦ{~οGPYʒ*$Y# ι.iO9'`9o]`g(8ظ)H{ ͇y(L&$.΢0 2oLjP Dg0r Z +B4vYp<rGὍu=\sIGr'N +paӎ5hI!%gҘ z:`m34qf)KU6ic yVHr@α`X{V$ i3~F}%ΉL4QJ2𚰻`HěB?;7G[V``[_.;.GClk=M +_ b ?k*2fJzMl #Zmy$ U ]`"Hم]S53`2LؑU^91EIZ 5'ު #٭#oa2pi"jrڤ} @~lT\<#Ja3|Z..<7e(nd5=]_V/pJ=*<(4@l*(b5L\))1Eg@(_LFc칟ڙ# J頇Lju1+>?-`6C*&LPoEa1 %ȯ2o].,>.~,q6_\Qx3%Fk)梔cvE"Sgw&pAf3yhؚ` k`,9U@'!Znӆ@Yr!KL{1(aRV+++3y񝲙R y5ڀ0V2X/Ξ;!ld[Mqfi(sw"UMvt +TebI=^bG:yYpݒVFZ:ǛR]\Zt 6? ŤmtW)p]Let?f^n4+ @X0*MW k"yhxIZ"6g/ϔVǛ$k@L:jL[ٶ 2(=u>PN@m疵2/=ih:ziNNTtuaCb!&Y; ܢT# Xhj-y͐b)I޺o/e^l.eZDLe8')LcHЇ8Z{7nwNC)R;ޅ߫Ta;;Z*p+r ŒvRUHp3 v+w0v6bnwu=1eXN| f3Nߴ K<$sUp/cSvmׅ!N 2J;|XYuc؀7d7p['fIyMn]ҔܚнPoԯ8C|mBjΡ(+}(֖eQckOFg˻`Zۅ{vp1~ͥtF}:gjJsVm|y%|UQCcg *hx8Oz{iY+A+OQR,qTpJ%t2oV>\֮zWACퟭ) ,cfG-whP7lvHyWE-Ҵ^gQQlFGmnXLʊtz|"!@k>l3WMLG'a|\8F^65jT)B0VہxR1l bŗJ+S ^uټY75N>1?HʂN _+| 9مhn8HRm7vF$ó/n.,]˸ (<ΦguxG NMQ'7IxHf,fuXY-GuiP)u7-V.d)t 9?,G nMeK$%kA!;Y6Nl-]"C5,$%[2}~`f;%$8|[9TܯT~2Z92ڸ]Ef"S(-]>ٛ<$:8Fo)tԒkKءn 8yJ=Z;A0". y0ƙu?wG ?5!ケ|*Eg5!|n>vX2?dȚҘHGf.Y꺳.håMzV+`#YjEW{}l^ -a ͯ.0Hu O ?O \LRz#X 4$Gpqhqǘo/u"‹} Qsϯ,~)aOx[k(:|}ehױ(M3gX+˸}|tϛ)$z"?ߪKSCE_Ma8#b(Լs?1vKi#a1/<¶Wv [71MJvANc%9t9G!cM۞ "ۏUnC6PJO˽@תepI@f%p-C' V=t"_}^;p~YK Њ 䥾@T,u8F@Ma@o$<{%߼p( HXq+IXѫaQt_<"vzhآ 7igS5 YL7*i|Ke>?9Arzn= (Շn|g+KĺF>/cBr\PJ\G9";.Ż(GG*vM,X8iL9pRՑo dwJFbp6JT`lG?pCvwU#R bw%\?aB{zA o;PBߪ΀TDdBՓ5Έ_D0W$_ʻcq@ݼL&*yx5 R-0r39^:M3B+O0$gXǿ@G w?E[cl#ejRY= }L_4n|3+6CB?jbYjoR\9h8~.Gg:mbWlEEFAhhF`$ >تV6R|fj D3T!bwt|y*#pK=\ ԅf BQ8- ԍ.tn\K JN&&3}:Qd1ހ9Lbwc2(\5B^vAVzab;>UB%Q"E`#|rA~jG0fQ`-a?c8/XI*DžȬ(G.X\9T0tCsaH̴SHO s,ժ0Xb :tt4<RJNJb>W(ћ(]< /\ ؼ(j+N#w%-# ˆqC/'RɑyxUʠ /V^YX= g*zڟp'0U0d_*9p 0,P;%Qnw<l!Pر85 c $L'Mw/F3aMJbGX@T ?Rܩ0m@rw;z3_Bjn7JifC,g^]l*hwh8dJ,,XpHH~1 M?QoP6rwɡ+^dv|26d!|IO5D˷ VY7th\QiJ1Vf"{¾Pz!o@>ۘBEn!SOLk|6<;.Vo^qY4Bz!Ԗr|U1B@ UCrh8OVO\ '{T^{(X7΀ku!m5E\5g C|X7huBmMq\]lڕ"S0ۛʣrz lL i^jԷh ^AĎ]oq1#9qO9!Rɾ\lÈR9ߟדHn!eoUWEbKx S:. ~*,e ;ElE}Uoy"(Em;MW qog#X= n0X9Z 2 fn*b蟰ѩڵ\" ?…43{r!>SM[`wę1?1@^Q!=cL=KulͽoOݥӅ4p '#hNWM6۵` BhT]D~ A:w{F5aL}meU"v@}l_LR`*kޫxk|jX}T_}Y/ f;epAN \%Y=B*1"DKw,P4T\dUq(eK2V!w:ksOÑ揂CE* /"AaV3X?^ٖwDboǔՌRaskFQ{#4d睷=Q+ffI,_ V]BZ43~@m5F;f!)E8k Zj W \eO&jOs^A5 ֺȁ K!$p0 1w+HZG~C:1RGvY(1B? LTq "GBñ4E~ˤOHj-1 ]M3žP+?IT̊:&tBϧ֖o$"j>p :KSIgJsS~?@~khh%>tcS4ulu;߄4 K9?r&":m>n&Z>N-bE15LRIc+PxϡꞥB$2תҫ>>q2#So蜙ȁ!@3x:Pt;tPtêaptYڿ+77 )@e \VP*9-~5eZ3#KP0rWδjHjgpoߠrz>huhBkVD?ŸR?A_VD!~/ 9E?$i'F~f6Y1"$^[Q˳э[=d}cLA*pl"#s_BXP`-}%37G3-"9/aK6y7QPh*I|g(@RNvynu_7K.Qm]Ix0DZ25Џ>RAM,XC4u_q/}%>c'Ke rҢNGr?abډWzu~'4Ԫa wmf #d`md_QC0 C6j)G*at B+-{:/r Pqs#M}%чyLi!5 $ 8h/=K Ձ3dIyPL.%\}9Ɍ*)rpB.͑,eBNNPnwpCa dM{zie,e/.6I!:`ھCʠR9{1Bx7lz+S*s@T~VD"%?\lA Wgha X-h-7mBsUd'q1vZ o¶LfY-Ct$vўEa: ٬ۜH~ǗrqhLاᛗ_8`G9ؤT^Oޝ#p^s$Q<>0.Z/ik5- ?qkJt8y/p2cxj5|%Ӻa91ߤ3R`M}!3Ji jV:72N,*i90IL_H&7,l~ GwuM-awfl} H%J \*+}u 74@Qr~$DI6&Vw}y9qBwLjɔ ^B$mvğ=-x{7%TK r , E3Cl›XmC4R;FFMk2'OV%[X` 3ELI}5*w^;b!%LEP?897_¹MQ[4&Gi=6!}Mu5ch5UZ,0jCߧ 9,j[zcIvʹ/}O!0 Xk(@ n]ڢjIX맆/@>* 9Fq ʑ~|kF_K$n5*Qݡp MH6ޒizOg{ڔ,~AvKYC"šF?x04Ҏ6郘=p!U"Օ/cgo(aJE>S?/ɔX/'/Ġ$9Lv]΄;꾶rk8*αğŊ긼ȇH _77W5y3kϮfB&̰ߵjdIkر'sX&(waUPK}IKHm{b85'U/UְpOԾ湡f]zBUqS,IK/M`]t*SLcĭ0,־ ;^VRa1.OJBE/'?ѰKN鼙^yYƑg:m ق!Д`v^Pۜ>.%ET9HA H oaym SizX7gšUF׸];{lUzk0gLę)=SeD~AʨR N m@w.GPV =10ue9-ʉd̻Z`%S"|$ќi7Iym:1qclwczHh >> c_˸IT.UdRh[lφ2bvO6 ^4SVF5sZꐑz9pESZ禁Y r];ᗱl;ZRn  ۅFGt&Z ΔƷSR4"U1I! nv[WƵ-҆%O=ڭ@tJ5R&h #7eR#<J(b7 {q_ȏY"WNÓG.b~W/ FT M`0*9+\%3~yW0trInX+Np د2-~[Sjo[}Z{69O栗W=%o^sݔR20Jpn1 -&!kUuUI^[~ްwŨfN73X9:>W޲9<5+ qk6H )| H lpP[9[}s#'+2z1|BIJp;Rڀ८. yMh3Eo0BY&i1rYD\cb=aB,swP,cZzOؠ*N(3uۻ=RF?k,wlJus{5sO :Mb9~(E$ *Ǐc<$cXiZk4zё,D)-'$( Ԥi%[ǞBjn2iRAﰢl+4t#?]bwXcAʨ/FwjޯHaSv՜3t|8`Q*W<ʌ Sr;̋+a )]&yֆSMȔO2+{o5з ͬrd;}ϕ&W0y+Ҏ4W= bBrWs񋱍ܻaΉ_O)$*+zk{'@ΟVEۉ=p7=%ꘃ+d=UM@5/J,T:l{h}"J>Q]k=1oLt l5MQYՄ:ᾛFK] mAj\h;Ċb층;^`J+#3DƄ /` 1p"ݓH|=a)M!Pu|]QL$/f8IiPk3Tf&muWh# |ukD)Tn e%A'd_I$FrneG΃`$*n:vYS}^NܽݨotL%52C8̼n9^܁M @_{t:{X[@FHABYa NyS\1ӷz$3/ 3~/MzS]َNER%lٳ8'߄"M> "Z%4bC%ϳb^ ]71 q4Ƿ΁y]lj'i` I-QUԋ`fsyJo!(YݟL^t` } ?M_\9N '5(E7˩U`c Dtm 擡s0pZK&$ccVP(\\ A(<E2Chn$}\9"b6[+I!^zRБģo e[j|SL^l*[cL h!;爩,Ċ;6}:smqkfT@BPknJ)bA7\`;?# 4aji:}YK3e-^iIG_]ָ}hYԊq ?5 ?c%f>݂m:X0(+TfmVG2N~xBuO+Wxg2rF!_0ਲ͏K^NhUp{u|Kls.llĹ@3fzt\ 3;4xy 19b\59 ״cm,XV {޲ ~wr:TqeRs PQ?I0#| S$[WȽǨVPެ(;B[ E=lڎe vӒAx!椑V)\p3q}AWo&5%Hۜ"Zƙ!&_gx(>Ęۈl"k*:S5p,-ZWb$ƕQ@~Cv.+'grC9}Xp}wcoe}q6Ѓ7q1R \'W4ͩ?jD#j2IF/Fx`ƴ=w}@$KLPe=YEthM2V(`L]7rO;QhXaeG?" =H߉?\`6@'p_~*lAoebH g|irme5&)!QC]\I~(m˅#޺_-ۊe)JϕGBt #rihޥ2mA^9.`7kgZNnC+aFvxmDV4t5f!ĠvkmrwV$PAXsX ^'Ajw!OQѝw yN؇eBRRJ[S{rqNQfh$Hpɘw(3'Kb/Ŋk݌W[%.a6͹踙ˆMz WWKEs†xsU@؃XCJX8cS-7XP |6Y#=۵JF'%h-F`JJjs-tRVd1`jr%SIDȎ6_X5zPU[i-3iZ>{-%IS.oo/4wQR<à (K6cR:~A=5qzDE. &sfcD#$|Ê9z.-_8VW)x (n 5om;|5Ѓ['VV8Uի9!l@Λ$u6>}2:ʸ*jhY4 *_r*r(FaRk&pԶEiɒ hbߥ}0p!dقw{pj&?_^K#&rb A^% {*fLdGYt;r}@a;q֐CZ[n6 "M0<0{ڔۆdHK Hk0BJcD4Ķ|N(x+*uP,0xصUUzY8cñ?tR,-㓁A0P;gUS*ĴY(iu8% XJwsQW$P&[珀J^wrx.R)dSXkl*J"̜Kov8/p*Vb<gN奋!]鷕!X8q'R"P)Y^x=lJAFI7!օMrux7ʕk k!ء+=z3$ 6!DBmJ@)35}{a:*-q5<ƹҘ:הS&y*X)lSW4>.&K@?oZ0|0uJpW~Z ArbGw~sn҄*}hlvӫxpA)FrQj7 * YŽP ՂN`Sn%U1`Yy0ڱe'Д}aL/dq{^jaSoP㘩- i;I֛P ek@{NJQ?kNUJ ݼY\@">}IJG/83&;*0]kNjl : sTUܔQLKldN*-9gt曯,NLsFΌ]=cJaaҡDͤ@!ڒ3[^Q.ʥ뷊mT$ǞQܭamќo;]1<,U<̚#ߡCN'8, > O8+>HH -f&Se0e4M_5&7C&|ǰZ.6>wcTtSbkR?S),ILsfUҶ`L<;dF1-1R}\$GrrȦsJeaTY p󦓐]Yȃ}rh?;)/2tr.:~@1U z;Z#W72p6 n32!fF-?i.9xޠX{C-U,B=nЛdq:D6pqNFtN$Ŵ%w,8ir`dC0-zuOvE\hѕZ2/YNXHW54>A,+0Y^-5R<RGMqdҺ3]sjaƜ2%v.W\cq-mGB$xK}^HL/p7uSRlBW']9j (c15p; P|>+:۩k"pW7 ADC2:W%^>'F3W|v,`<_*YWy:sp⁒R]K,͔ A$D.PwE)5>YꈯHr`?Ot8 R8-F`0PރFpo.=A4'gԦ>P)1sw\"Imݮl N8o)!If;B#Ť:o@0pLdU"_-Ұpj'1&iUE#K9:?2B;`ԐmRN|y8b/Joȟ&6 (=)ϯwQEuSvNtcjN؍ͩBfx}LǝFb8u]}4fV-^adg;T14~,uFZ M0ECbGiWP e6/Kry,PsSJmwoG+Y(r%I9 tDH,Ng3# W%zҋs/oݖi: hf`*2w Jb\~RzUA`7Hpuz--/W eOV T,n9΁L s:#Ap .htp5TKBT%SUc[/Eck1¶2 4 ~j\PZu΍6Y 5H߼0coIA R+߱ʁ>WHp0,肜5 g88ܻc,a~knWlN+x![ф pwݾ$K o9ց9xXUf!yߠaQ̟g67֡:URߺ=5l֐nO[&K~hƸ-yP5kl^ 0)*Z4ܱ!rW4gp5~NlJd3VuWtpӧえ"(1:jNPי z5!'ărg򿌠T@l:α-|5)S$SEF &#8WV{UJ+6-%V5C')QYO{ -$aWTc])pGufd R76+M5H[LD] M`"Օ n(͝&sǀZ!"[cmgJJFŶ㖹&lxK?L쒴OQ|$i']hV)f@] R `ôq7[BE[``tvjzo74WFrQ;`2I2K ?F+V˖V 7RPnҵȏEMus|.KZFy'V _OS.(u8iK<%V[ ˬt8wx30/˴{wtь-/ }Yˋb 2t}dnEn\ʵ6ft6KG:̏H|ł_T_ky+z;F̜Zuƛp~&9Cr}1Ɏ) SM u\j֍tK%{<7v#-}rG@MEeC>TC9)vԋo2 F 찂^sTJ:fWm+xHt> /~8gN1LXD_leO#.UeܞBS>^eL[lJ!e~-SnW anw͉h]b]-(% њ#tRަ0s[xl$I*sr9t.X P+m-1b3&]au9$ţj\>;.2Y+1'?tmlK죅NDc ,a\g^W[ϜBR5nemYsb4#G~c'cCHUcn1GT$_񫵸ІO# |gb`qw68Gl,yC˛WM=Et3c >*g9ߌKdu'<|CiUoh|Ũ771;W⃹ "opXUW;7]-@k0k99(D CMkTf єcD:qOF~uϟLiI.h6ˋvoPNCuc|`c](qLnT5u1]dVνlG>W?(MKEc[Jt &>JQFQDlYMыCBݴ 1cHgu,%e+\maW Øϻ`2EM ɢz(N9tguPkO sB¶14t7 dd1;vr#~OsCAbȦF.W"0}{҆k-HrK 5e윳/[zv%(ۮφtp" _褗ub9(y:A^Gἅ9F8,hFeRu:~>'Lm)Vjdx&sKZojq.fj7_ޅQHȣmu1QY $\snæ d?9_Ku7ގa(qA IVDnײD.@4桫{`C/I;{Q=^~ooԡ]c> ؓ-jd BtQ#uP"F9Kr_>EaGo),ܜh%I~V{<6{DǦZh49V&Vӛ7uOdʗ+EBzˇ^Fĭi '3/TS(m}XSjTQ(Zj wp)R0R7lD݈:6vd44e d:ZCd"M"X]XXה#1r(ؙt2ij$>0Dh"86'!}5ӻKHEL}B']Ph 5<L 6lWK;Q6O~G]wZ&qE ;ԥ*7vJ翌y3g3*9KNUM͊^&w[iz<+R?=m‰diIB'Υ4^ FFN=ixË!wMy@jOm]wL|r3vP5 J[tBv.v "~Da*ʒY2xj ѧVP01rSb7q+yx2eb12Xnu3[t^m"M#$UY M1XL]P;&гb h7 04G#C.#&RD$'s=JnQKysSOiaXE, QldJ'BrBEe6yG czOmmRtj{z`>v"tm$DZ\ŸC@n' 6e 5%D{ Ndk7Zٜx5BOCa_1N5_Bb& yS훤Sg@?(?RL w<+?:7@`>,"Z^1x#ٶ?ĽW\f';޵"Z7k YV ,ѫ\׻vx,wf@$$IiL sX0+:t  "C?)qN2)(>ݔW3:laZd^Q;:eܴyF2좁9<;51`phI=n/0(A- RVåD!U:4Itm>mLw7rŽB4RDz1"R1,Մm57~g1MrL.$խ ;wa\o3K?#vGR*)'Csh#4LQn|z"o'#zs'Nh }8_:uxxVi˦iY[WR-A Q5e&rhvjzꐟŌLLSaq;dW.AvD$3&ТEKp0\{)VV!@C  Ɔw^ :''s:D: :+%rMݦ3d|X|ybĸR@;߭jrzZdws0t{&u: wrx!L,G|9_hx4$s5,c9wIїٷ0ٙ'E! 2e2V>ufDc 0 d٘O,[Ώ/kk HAOx.۳Młow}\Op(' mx~$;~1 £6#z,6݀3O2CVԽ}oͿD|ݸ3(ZS+tԳÔ{b1w;JSŸzҵGg! zX\s1nL?,!)xz*L%VS\9hа@e5~ɼBq> uKzG'i&*-.MzȬK+cG,GK!SZE*T"SGA3!޽E,~1ϔxk1=ʍmbyt|CC~x9je<#?fgT'ά2 R֊ԸPݧDѐ6d6F4rV~T:{z4v:[p}L/Z*9H?{FV&~ C f\w0)5ۈTz-x$*z nܸw.l8'YZ|>Kξ@T2tp05{]$O<5rmF_#H/G{:9ǵޑ܎p~\ZPBn#۷ ՞r3=oXk5- :9 Z_>)6@|LUŌ6§V^75͢N]N*~Wl>%;b+i昖ּu \l:L[:OrFح!1z Nt2[d`s8vV sd0:XWf}2RV՝U\WrO˙ӍPGK@HoƵQضah*(}*L:eocu.##|geW}͵8IJXNg{Tg6&|܊xJGǝ\7,+nM19y=6=ܞ6nFmmGm<ԓb)3H4' >v`8+~ɓU/VX8? j~ڜ^DE4\Q8G#!W\`0an7jd 𒉿@srDCOR.HFњ3|f .D~-L1 eqd?lۛ6g\n(3QoT[Ϸ_)DV vHyRs@F+_UA0"mBdN c͎ 1f&|ZH$ (aMaXvb 6 I)랧sIL#? gNgKH.0=iWhib곇9LAoދI]H]TK_ފ苶|!Mz|2x0Z3>( : .}$;ǫ 8KX oir,<_r| \Fy3y*ՐI(˴yPTy^bT0yzVggp`jR6Q6eݢpԼt؝ED"( ͣ-˦M::OY-x4.C-ưْٓ:ZO;BeG0c{,̒m+ye40gM3lhѳ&~EՖNmZG1)ҭS8;CmEweSE~;[Gs[(ᤚpŘ#!h3C"{x!;mGk]ڔ:ϩ1:6$ ⥰]Nv0FtIx4)[V>Ww!4_/ѯ J27w?b b1>Tд$ tZyb#&ײah=VS ]}{L"AO0fC{3ҎTAL%^{(wⰿ+dw!\ńhĜbÏd=Sxs| MfN$UQ09B$10_ ~Z$s8-X鉤KYB:$$2W@15QANP A|# !CC Z F̤է=/@WQaec_|# nJq6\-u͐ՁC^h9!z_$>:8e-tIpj?5*MKC3RL`C4VnIzQjGI22ݵ@KH /B ]%;_n9?qĔwޫg8K7;uѠB &P2{DnUF`Q1r:6TI>XlF6ٜ|$bWý@VX(֏@qW[#u@ Rք*3[hkL;'!94<*LtWvbWrYVbE!Bβ=P“'Zr5slrw5sڞGnɄ~CBУro1~"#Dw,"/9fVpeTޖcWSp\ Cy;ACwEW\ӹ(BN-lG8!ǹ-ΥR+ڌG,D*+UNM*)hyZ:mR2#&7&ʦb&&H8Q/Z;NFhV],(ћ`%r76ǂ[barKȢndK{eF bb 4!uU탳 f !7W@lL͘_<w`O\H͹%xfZ8-sV fز(;b6Ӫea9gf/"\q՟+N 7 Ih,hm tf0ڑ?79 ԩ.^%/9GtZ9Y4ipk@cz'|@F8}%roiqr7lhNC)Hi?aŹ'e4=4N 1mYLez-mcX$9핬LGj`1eiO[]Y;請ET[i}D`0NRU?  VjM5ƔDbꕜ>v%Ci?9~bɵ8Wc 0xh!@pD<4tڔ3M>V)C Y1SrOhz&saY#֭ËjJx)Fq{2iDuzm=2`RЅJZ AՌiLrǐfVMUhT BFn:ǣn1 rUoգtdCE"|ɂ 6izxg6{vխCu*_hV y3"Fbΰ( N66s\cmy%eڌ@IIe3FvO@ax3)@'FHB,.m$wS٠dƼj_*!,jvCՍ;ہuS8gdS JqC#B4/ѭomdbe}(K _]9+G?  I{ 7,$CDb+Yb0^?j706wj;_{^l{ bfT=w̏AϺQ"c{Շtvw:] p]0[ /}eٲq{Ƙw]4Y^v*L291ylLT% g6A5AqǠgx=Dnuti$xR6ee<\i2aPH(nt"ٗ@!l\?Ef8[pOn ZPd$HQ;T;qW3j$x8'/>L|9/)Usd/#-ƗܨƅvH"&Ox94qYq5HNZC~t, 5_$1`]S=/p8YςE%orjZJ*li AJo/Č}ohא*McH8>| bΫEhn\|8}e'`dSZ" yD/[-gh w(,Rl{z#~@:6f+U>gy4TDZ='xnk+D`B1+Q܀,XclϨ=~4{ɼAϯ@Ltv2p*JS*$00] H3\ ><٫m?2-?Q fOb>Q m>v<^`[G 2 A/{d SFۜ Іw[ mύavl*7^zT͇Y/RRb#"9$}%汆ڠ̀K:s)BJ` %E&&葵@&YTJW3meSv+@Ya$l CV1\p^N2U![Af" 5T  RIT l-+g,;m~ }$+Of<rĿN*Ef?׹NPF@7+6߻q@cC%) O!e#L;EHfM^D%tMz}u5 e+{u$H |f1l^G8q%<9pѡqv2&yv>[>ª&ߤqe/zeሱp ΁C[7HOW>)ĢSάca5+.&|F!b˂pP|ڔu‡~`nFڭ(VPw SkE=6s[Z}R_Cs.6U!sLx >_:0R4[ Q#Y x )Y⁘DK!湇|@F3T8ğa|3 NsQhU'+VӎU@[o첰X[RQ_1d\4=+DSGt;`'jJvOgĪ5t>ZI(ƨ)1t-~;;J!}Wˆ{RWW> hX/y]QüȠADP6Abd%bv2 Dn~&V }/kO|طԦw>gÔV൏°I;lѧ"ܥC8EY\g)UeSLi ܏>g<:qxOf'pC.h!^`/udCKC8+e !{b(鏽>: T01 W[U.Ȏ(CbNmk<~ZBMKʕzRQKۃ"ln2JrHJcpwqPG h =11=Ђli/j'\BuX}"T``H =yu=GRJЬv6dr< ~)9\]Exm:D)'=$TN߁)`c 7meڵWl4v‘4Fh^KiO:r{ъ/^'l^yU~^1Щ P"Uۦ#I9dPCB[O Fo(> HT uo jYЇ;(m*Z_vGsZ*YLPup$ih,iЩs ݀y,EЃ*+")Hs]Yd٩&$lv9G3}H@dދdʢvټPN1]T4AY&աnjlԉ fvV~8=c8z@I%:LrU%ZG(RAFc%r2yNTC8hvp+nEXXs^0 3t2٨\.vˎ{ƣDdoL'.@ &ƲʁKܽE?-kk 1@Zof3z6f"44E8=3c+G?h{+{3oO֏]WGnn++mS*m5_@pu1&"KAt-MUƍuAE_7O"}%ʦJIkV@}ї[S *iMbt3^G[!q'˞y.^okNɳƀk wa25 `@l`?-U)C9 Q  AR:'d?9-9$F^u>gGw2XS,CP 4B`PF4]^N{hqj``҈R{TkR42\7Tmë T#kDV #x.* h@erݪ6)}>խtv6 ? F;GAu4=MKJI)Ug`wr4.fz Go|[&3UvG>B-,5+^pŒI({\uMLI2!`1m9ݑZOJ|*wi &CэQ&8&ϴ)`RcRl茰n+YM+=q-%u&%J#}CKU[sI'?Яt.i73{^sc~3Z@mXQBjS4OĠc+6:܂ DnxſسHR{0-J૶=(>'ak:[oᅚ%gMlNRY_tv>xCKԄF1^THXlk rfZw-CQzXWnhn]G*!Q6=ZV(|W/Kk}i4=,Uղ:8M%fsZ}z,5yܴ}d)_Os(a~8gs[DFUUpBYxkzTZGiUQ:` ]4GrzHxp\~ ㇅̡Kܫs#36 -ǤfCf2KqX]E;xbv\ ̐=/JF#I6&"{be\!uŃVx,U"9ޚv51kPKm[89 haڒd!?mgK7 Fn2 j39 D:MȚ+%Ba$%X"!B>&ECbO>!Ь2`$nK˃0]ݟ~j*\Fug@Y E֡Q+O>qaޜҺZk(Mku>Rf\T[fWM0:Z!NpIK%:||-@LQ!:-WyBW&ѶĠ, : bDN|CE1DJZ^S&aJ=fg1=4{9{F k߈u7j@zSEk>rT:2̠٨ҕr]@,b0`Fg;h @{]T(^"wi(ΧW>0_KkpiWiDlǎ.ĩ0dʰdA*_ð[Ɩ$moMb1/X1XCfKHSG#$/['dڡџ"wVpyI>)z/~)5كRHzgc8ÿvR7bCc_ Z:\Z|EW\bE~1c"/Q=ṇ;H Khj~8OZ;e7 2,/p;f"$=\R¨\b :4vWJ=Z>Us`]HY{YiRLѣ$CBۧ^HؼE- ~*w RwJ'{tmӜǮf^@5%q~T99R/3d 1bq~yټ4~̆*wupFb6c[eh ryg*+|wj 2AgRQ|‡sft<<Vbk.joO O&0u =gOG:~?*73'پo}`bvbrk޽ay(zTsa8XtC3JpkB0Qdm+;s`.&Uk.>Ȟ8BQ̑Ij!#;FN"AY< 7J`2S#; ]#V !enM}22&cpWTȷxN^hø/x<7:.""sY`""%'=D16^ׇ&2X(z)tO#PA J?eiS՗#Ǵ[h" (D'o΋cDAԖyG`OЧw'i#uBSl峁գMafM1Րbqn(\b ݵlRPx2yv: kwLʋgi}|}#t팒DT!GBp eCq隀{`>4V(N3UXƍ~(27*[F=G;~}r[7DJˤo19oVM]uBwgi8k3:k~*ւz; niqi4C&еLӓOҸ:j{pKKFF^Nd >GE*wֹ 2>Ҵ|wXRGSrM ϥUT28&tkЌ;.!n< Bs-|I Qc!i[0Ay;י D^,Ѳ `|)P⚒}zMcJj?ERn@l\qIHExU5D*[6D$X{оsXuH "֓y.+*c| ?-~t#E=ĊnW2R* nÌrȊ(6e%S>WܸfDؕWfߜ9LVdpFb7"%Oep*L3B47vd"OFp]?r-&j9:ډl,Gs.\E2}||-u9v%qϥ(t5Jɐqs#XE qZ*hU낹!ʬ/]5 l9+1 l˭.r6-D'c~TrQw8ΕSFH;'X8绚 $Q AYͯ#<:twhB`e\(K]anmb }S*'7LLw|-E;$`d鼦cDJq;=su;^s7vPّ8u#u; @#'? ;n5 pUsm׸!Xk0)ɷߵ%fG} s7 W;E&v1OF> jt2t395Ni޲U-+z|!?w .UV.xh8b4' #QY'4BcvOPѷI*ONf2^G!t?iNo߾VeWW"=0̈8ew ,H]l,P",1/;ce\'"9kgk_l%-d2Ph lU8)$ da&WH/ i^)w٪:W/6c@OA_b;1@_maW{r(̅y/8Ư1Yw~ZEꨢ}:O֌a{ ''e\p]Flu)؃Z@ <F1xw)fMn@qe7F\kJXq8ئRW!X$eνDp33ꠠEÙik29¦ƍ=:L:uP)+D)Uula}f1W^3ö?eȭ:V#7n A6'D:B} ۋ_S?]u?mFS.nWs RF4E$ vuWGvƻwwgv:~~[NPG.qk58Ƀ$=YUL)f t,E#ʎZ{>u銴˨#V\ dg=NugNb$n;KG0F$?gL6-MQ }j '8Dh΀1fMm L5Oe }d5"q)2|~q-O ?1np(8ǻ~ާJYcԨn-Tm^&U`s\ KK`杒[`*n%$gb3ڱ::{,!h幻+ hGF2gk,S}?T̐Xϕ]83;k%G^79Uq_k̽~vf0F3-*!k,~Dg,OI jdܰzysԛcGgTV;.cR1ٚ$~m6܈uQDPxEQ8[CAdYG0eyi^.*Eh-kH +g8lhI𨫝d xP˚ .kp`v^+U*5O$ᨂQ/y[=7b[GGL:rxmYjzqexVn2 !;kM@Pȧx=cse Y~cV}~4\a9޿_=K;’錖E ʵXq}xҚjT^3cA_5n 5'x79g{¦C6$RC'&dy7B] m=NdtڅI`bΥ(2yNX{Wksؓ6vKQU C p"Ogjp7_#ۮso^~8#^7I% !H}v:k)m)L/&o'tüa2*r40dMd2= hq \P۟ohv;B] {~A׹<S3-ℝZkO P2E֣mxg.V*x-TTTEWe'&8Ͳ ןFRAo"T^^@OaDa*Q=nUEqc[Lpi<$dsD; eqFZq}`O:*hؿʴw(94Tt~Ģ]cYu& / pyϵ;W9?pcx |l=-9$*O׾ jz@{ u 7QzzkK# 4㐈6oe=j=n9ˤH%O}J זK< `!y_7iU07n̡[k~/L4} V8 Շ~&' Yذ"!۸iL/TfWEiU P暈[Иl'u%2M*/םjKyJAaUYKAɠdRɕǔg+~G5~ <aW qB R{}e/ [s ONY(gq+Sw@HT[Nc_QrCyԨjـT{RW1?o#`h- ϿUҺ'a&;\i q$ Z?PvzJOf"4AZ9]H׾~Q\ƬM!H"ޫ#5$.yR4@YOt +T g81z4uɫok/Kۚ?_]'vlSEvHCۼ$Я19z nTHSO~_٦ҳՉ!}d B4*pfYH僃-Rar8Q^@b@1Ӟ3L4 J @x@cLd}}e f oy5͍^Q}b#f^FX ^ 9Çz' ,2ҸuY&%H*X5BS)9έfxp>(sHЊ]-j7y9y;H or0 ͕`S9sKhJ"/DQ_*"vki5f:zS)O%jY>'qFM`s|c ^3[rUo3>Ʈ{Fh'44<"*DiBKyE2\Y "Bx7YWKR@~?=<Q5d>^i_f)~-°xAUZ[t"\z<T08shv?ROX\ؑv|2j>4VM6tl,EͱfFK>ܷdӔF3pKVƋ{L m7VŽc4.}]ÉLRzn c @mBB"WjP"՜w~Z-zJՒ{V]Smq}J.|{1Ҕ.q_u%jHT)m̝n \Eb3 XO4R YAR^7J7ҩJ5Ft+Rv=]h ⟳"6QQQ-lAMc؊D*5HB!bxg78'&09^Uv#wtaRU"mCf+uz<>߱R aq(6/Zk*Ί?liA\;#sCi/+Rst.>u uJ*k=M ΄FUkwk/-t[qibpe BV秕σ;P>ugqD>'N̰'թ0In?azV7-FEr$cY2GBF끉[+ q>ɻP]9N/V ]CnhajuP NW|2x \+bg屽鿸gFvruK :]f!֗bb-3BVV(v'4qߧ•^ST[.wF'O)v5,'^ji)[kۺm􊇢sv<ͽf$rc(ѼHkmu|}4͋FSO@F\ ŴB!ޙyc*{P˰#/9J߹}yoƞ꾩*AW#۬P,gTX"!nV8SY]7FHI5۴.ΎͫjRzNf>E#!dZeYPIPEJb[1Iyyğ[BjklOPQmhh.gj¢O/ԣ sس& >wVr$Sl\% Gp]]0@6#nm-+ubiӟz*|utل0{8O0 ʗiCg"8hIX"O(V̪ZYY8Zaxp4I7DŽO>L:;X/Ĥw<~+$/?!kt0ZTu5bmZI Ѯ\&tiR]qG{Tda-F(bޤǹ;>iE9Gfu@r)[2j[S7S@3CЛ\ļɦc.+XZ;%ɞLȧR:9B Yעxs T4M?b#]%ҍBTa#+s4ߨ;6'DU[򼠄*FX @$[ `-/ LXc=)ͺ@scGx] & 43߸0Œz>2:+0 wȨ%qQ[I V$ޠaEd}F< w*,HŃ5"2]X2z\N&%BDo`"%;6!#;G w6MY}d/dҦo 4&\ۜZm OC^.Qoua;".Xޣ)/;{Ia:a74 +٥= k)E S*7x{z@&r/rI4}|틌84夅Io[Q~5׵Z:rA$vvv? 5zTF@!)n@\ȸEP"vNߛr ,U{t(3Sxoӈ pCiw+STI ӿK  ۹Ui,9󴅎E^@Gc8rt!E ϳI5V,  - mpW;!*S VgވZ2UᘁL%0:`L5C {~:Ԅ@¯eZkvcqs#.Fyݝh`Q_).ATZ|d"}qTPcL?"'|NVG`ribeˉ)ȶg'6R㊴>q(;Fe}sy՗_8hT{Xmb=2D-Zj:ZYcL(7CK MA|oin]ypu0R!I f\k@BW`ZGr(ɝ^$͉,D)*Mh$kD+HwH s+Th4SZk*?nL/_< /Xn,a ߜ(} ږM =F5D+J^zKޯՠݨã4'A'\:B b2 F]|z €@ ė҉em~^FN",. nl TPH8l!ɩq NCt`;_N>EbpEmY-DAKr! ;uX‡?ntAi@Cƥo5JaP=r!(qCZ/_oH* DJ7aElpַ{xJ|V!O(+G`}쀛zg1U7I4`rXWϱ V^1Uv Y*' v &[ $Xu"[*csѤH08U۴+wa؃d$t6W^ p=BoDs&[t!dt2 4DDvoZFT %D~ ^}ԘQ]drZ7cVL}r46t"Rd{^X> N-J'R!•F0ط3?Єmͧ岊 Zkxu o %<]Xaw[AAm(Nl?ژ\n3a"h<9Q$.ckjï l?gOxȋqܪ~\_.{+b[۲3NNVq4DM ޻| em+B{?BZlm-NH~v__ c ]izqrTt٦AZϼI$:mT'\fʨE.4%Pa1HpqS]hiSY,ioBDe(u.$q߷#g;v<уf`AF(OgR&5Tu*EHARfHwB@8 q.xAjrQ32;& ABݾyrRn[ͻi$_uE5٧:qzdnJ/ n(+gG OʧV@|bWQVuU!nBƓqb:Q.xtHvc{+"C8wIPA?Y3Qo2Wi㯪$~esVIzf7 <;q(5 53jZe "蒽濤2c*j֐ܺMtΡ++,2{8K yv2v$9 GKю)y,JsS /k-a8GIl4fˁIk)8=08^'`/>SS˥ åJqGL@ތ_ӤB.(vg5{dU ^:8Gkq_ /4TL;-TfC@,ТzV4^}2UV E&YNߪH:֎D-@[5Ύl:Ãy V\Є' mK{Ie"`/ }41Wl&9⽢ |baE;-r,È<ؐ+k>X7>cfm{4LUӆ iwՇ }z=a|2اI#TEG]~-bPW=:.Tr<*e L'2E[334K:rwٲ|Xr(,arȩ.3b'`K8 NT$INGAUse<̾YF] Hϔmٵ (HICr1f<}O{ sa r^{lvV2d>0*q5k\*񭵐E߼!Kb{d(Ap333e ]4x3 c*!{h%\{3>t~u*=OlA b)F:\dľ,,ö?ATZe);ٷ-?9U7b/Sl~ R,q\Y6Լcy:"FmXQ7uW >p[]I/isO> E5+AL2:Z6~ YHNпW ~z:v:=a19΅!]n$麐/$EClww1s#Н*Dlwp#~yqITuBOrNJDb鞀pA߿VW\ICm>]^ۏ1ZR!"B~jn/7oG>&1r;,.[Y pfNo mJ ]_r=as{@ZY`@ BTʆ;߈yo yv0nEc6OJ??,78_"}xRNn9PB &-5Ͳ#զ<:GJXp#wh<h.v3?Ӡ͢`G:îGʛ*i!1#XfNwq26kRcfςP2#.j9,c<6'aIR6MQj=g~NSոIBˤ3қ+MBLESVnF'kOhځJc-O ]}s~h" e&A1`jqrgHMy/oea(OM? ɩy{Lٖ/k#qm$T94aV)+Ra :n 4a=eih?^[C(%jD}&#LKy'r ÎÄ ve+v,_:DOx8|Bq5i{r/{{i6 쏁R F5y%HQñ⇚+>'IrH[DF [>@$k\g2yqnp6 [1 YG%&F a0h^sH`5 #e y }`IAM E@,D1i>(J0a:d3p{φ `;Pm/P nAkȝ(+ Ey&QLy@l0IiNNu7ԛ r#Jp S3HtA+umj Yj;m.þ|E[ ԯy |)nM2+ R0CjOtCWͱN5 'nuV1"x7׾ \;bEj}/,ZPJt{YA[Iv*C3yVQ };d?ERҎ)5>0 pYՉ>O'js0Wfܔ"&ӅA[OR4:b0%Y%Da\5mD HU`XXهV-] s;Zmva,UTJPp]_|u78 D+p#Xv \<\?lMVMiYA{OFE[=H\.!ݣ*)te. f"ڇ>հ+a(K\ a.W}UK3wzK*A@/d] o|3+_tq3NNp)Bl.,CQV\!,@cBPYUVeڇ?eq%fDޝ}rROb6?CyQH$Ѓ/ CN-dUmЩϛfWB0`6IC;rc?٪+[󒡼-;cF3f7YJ$GL t_Ϻfm/r7k[轡cV#g|k\b>7nD~mh \oUko|'_g?,ɨ1y<7[&Aܽ8y%2Ślhۥ~9lu-J$RuCegX&xΠǥ4Y08ӱs9~&PCDR3ÙY iKw7@flfm˖1*z1=;ħK"nh(}xOZOGkЯ \)˭fph׸ g>@/-@+ 5]2RfA`Y.xt| CmJf/vۊu5:bdՠtD)3MY潳ՀY / cp?N@[N<5lJ q,7_źÙԈ8O{#ޮ5tv]E }jeC!{q:Za\Br&[8[`Zsh?Ȅ tcc<]gi^Q8܎<#??oYDZWw'\ڧFDg -TaƵAEۃR<<x)\ L ׄ4i>+0̥~avB 0]NUQ ̅rOzh ʏ6HlCsψqfr*D>\w/O@ l& (J:™93!ł^]s_zئ&jLzn,;D,ȧ`p"AX]GGSV) ?7e: }F/rWCNTiD(SM:*@TK2]< Cp{"'Ds#e{v._W㊳@u])qt׻?LZ!3CyY MQM>Oo%5lY)}ކVZx-GFUߌY~_J븣m8-0IeJvkzyť6W_fQx.HvLۡ:s*^ݼ>x6#L$/7.a9ڲdvY۩)UGi;])GGE]+^Z(șfiuYɘᮏ$3rBUI|Vܒf'0c;]?-. uz*}Kc㷗\ӜCG5tmqd+Mk/ˇ Isy61o%3 JԹ 8p0R3hcbvГ"DP;rx Q]ib(Πŷ%X`35/ZCL4@"(XC6+ G$nNG FI( <(-6z\ZN>MٱeÌN *AG+Z^% VND#FOV f?o[U Ƹg]%jPa3a{0#LBj̛:iOhZE#o{'CRՆ;Q,:g7/ItTR4? "eM3lkdg.GtO)ʛ 4.;-j0 ^&'%1+ݗ6>pcy*W֭}݁bF;b߱o*)l;]ᢹvok3GHS/132z@9egG$Yô)4*H}b9siM}Ȋ2Ѳ q.(CwG .]zHmMqӦrStjnjb+VUV-Hh4jke=%|ipQmk2)2IQ  +:u7]/":(؍3dae',%IsQ*Yeč}_(&6Shqblm)ӵ703 VJ=֙ۘQ}"GEc1 L;(ƪF)(HLj k[5&ˉ;܋/ڪgHy=W(F0 >Bol-pTT;`EBh;Y V #ДܱtQ20,Ë.jEDTѢPG.-/@E4ʐ Uoд]5?6dǾ9iey 8{H#E^Ž,-_ &8fa'Lװ1}T42:cXrsϼ?ufvyW 䴧A%fta#E[a( \-$u5fcޝmݘV8 1S*+h>qMS (ϳC9i]~Zw" oOgjmb7 ac*cW&h36XK73m}\p"ÌM?b.khpN FRMdv|a/2яP7јaA8x`lu9s`︈2 0ded?'團AW ~a=6 hwPoAFL™Wrf!)zP_6Փw\M;|sFܼϙ9{#rh=&-25RPd*;ڬc"yfߔW hm.HK@Њ{~ T\W>P΄;a. 2X@&OQN%_+=K"joΤӗٸqs$+pnMfZ=8,MOjͶtz]VENEyoAxelkW˳g #׌~/9Lg1,pUw[sG 6(.J%j]|!0 3ǽJ0@FEO႞Q (H1߅xq^Lۤ9 =ƙvmh+W2.EL>.@X(>ݴVh؋8ߕUG;*y=Fv~ PIBCs^[Uy'rYLD,PgI/訵ќ Z#Bv$h=3dž6hih^壽ýg0VJx|y(eɇdVMp&ʐ[K11D; ' Y&?n>a?֐r k"IH[)ِiY}AQ(@VH?^.Q'HW9>,lX%Bf1{8 <@̏bӔvߛdH30\6c^X:[e@Komql~ڄԨpjVYf\J0 oȈx"`m EK:)aϻ$1;e ѕh?Aҽd~bPic1VurBfasd}C&Fjĵ{JQ q<%_s5{!3~U}tY`jչi󃸄IR4Ҕsz^S7UgBHt$O0ݫn#&p:*)Ke8{_D^)cYK hCYt}+%J;:5Tv.KyZCIݣ2啮l_ ӄM2Vkh7k^3OlrvXՄ@@4 tK ,^XN.Jm Kݹyp;+^d fs'M448'AH.fS8yqRp('daZQaY1wB UqT@|czB@ܨ֭O72;2MKؿLǑ/`79,N[Z`u%!Yr0(6I_k~mYj >6!~ l>T( []7$L-R $NCwJ wRJhCD Խ>EhI= <9:Ԥ_}foddj=AfjE!b˯U㭅dh^\6@푷ed * /zDkf~;r\6}iSc!l8Vml"vyQ+p>Mx 09;QoeU(*UOdWSGS&cu6,7% ?JߊX~.gKW`YOPk/ٍ`pi-%`%YlH[TH><6̪]*¿l;r^٥oʴ=?'4:0΍P{i*Rh{>Xqk i Q);f ߠUJ1?O: L;.35 <4NK 8g]-wBy]DʰLfo``%stD/S|d:HC9a=#=-N=Q9f:Vz^/SZH(kRH  Ѝ#xOHZK5$lc85NhIC R3U^ `HR.A>5&tk5:4hИ)k9d2eOu1\B=tL:`X*Wڼ=׼Hcg"NӂziQJrOn ȡooTviRb^P#']=)Qr黛Tqi֝}:}$2$8jZC*V!sPh @͛cZA#8ҏPc|?dI;'8#ecSf 9ei_3+zE _xPcM1ù6m5YQx 4936=JRU ;DKotJ:}N}-ymbXLG}1mHap\]E^'֯D#o#DfՄͅ*F^>.}~xKuDOS!o5{,VOD `0M30{lv=,,R0鯞A[0˪q4Iob( ť) wX5h" EZI-@6Sa51bQ]&3>/8Jӣ`H3D(p&Ƚ(mz`sjHzT"B@ `M,x2ugнS +}S E>QeshVz\.*M埳gB(f)xH@HыKS%iijBK]jC]q.Cl5kR!٭*҅ÀMz \ #WNH4U$DtXv@\# ^{/ (%jKxec@\֥߫ad%7;s9@<ؾWP>s(Cmkon2bo"hԒTuen"`'nbRAIRѢiDź.yRe*sv5>[%Z1(t &f{_<}M oM,B=R{;W# Ks!se[͝վѪ9pm1W?ɏqHuvJH0sQ`p-Oc6=6Fep7W^9NCq|Y鞧k~J'E) +S y2S}32m]*}a4ɹ[<ω`F8 'i zMTRqDo}u!6,*L,韐fIpzCv]p!l8!nŊcG`ek&BbӚjr'lK<-fͫD 0mg-\RpZ+#:LI4'T][X:l6C"/}K6- Ob ì%h"?-Ҥ@;gq;޶H$9FdŠEΚ&ji̱/Ոvx$ 5uL߼Wx K2_GYN&2ɍB͸KŮF1r>-z:3ǒMoM-/=RAPbL2ίc,QA[z&\BYf-6=Q̐Z`GS% 2D:o.&u՟瘗si`3<&tA* 1:!W+Hc| C}&&gQZ!вעE#CH:,i?iq17lN5C}7gdH bчAnYOq7{UMR;۾BH+Ay5WWKʟSzue[q=ym| orL$zrCJaW^L3'%QH-9γ+n/HaF3ۖνbdoU@>Jl@nq}&~RĐc6jLmWG#9ۢdKsp$+@N*8 G`E.%T$1"օzC[hfOR똟фILHE}a0Tэb^pVA+jZvJv#%)zN;B S]Χ)N4_A4^kbytEY` 4j_w ,__LS9S QFv-|їLL3C(/&:І"zIWU ,+!sfR`e{]*o7ݏ;q:z&5`.p9}%'y0OX%Բ7Hlg$sGuy#:պd q}}JTnpvI`U혗HdW9훐c"/":&uﵟKId:׵;ZYeg MV_rgVnf Co;hUe(HubRҺoRf+a0\0&E,!JWE4h$&;NfKi8ky7"®T9i_= p+FfZGk'D{d8rJ[BMyX:r2)I9 *Hwv]{sS8rzJãA[] ~' z NYЭ6礽#?йzi|!=UƤF{D[5eV(uHYڡ,qUWE[ҐYH=b[/ģ#gpY@d 燛D}s^/6B{Έ5nw0H@g+(S}^5c/b!Yn,ZIBéXQT;nR`FクuAU1ܗ^Motl6# 5>JʓarkWݞz ͟F" qz<~[ |-e^6({9!S.PbxS@yy%yzĆг{l>y sGMnGxrq'}b$/wMJ7oxDg#L_ɬF.~,9κci욂۽S$^Zk+\T~tW0A8:YOF')/AMRvJǔތWX\rUHq$-yڧ±~/C "S^ i nJ8F1aƱdaYs*`"]ZpgLDZyԌg+j.^I0 WPHu!uʝszKOP*Dx)N5" Ksh6ȷm4,%_}'٭%bxj{bgPT20nn,OȕԌRoa tu$4*=Vp{|@l35]7_sMgB z*xD'zj2mSwvH#qTq"ƊFUzn7;IzI>u2W&={\"NӛMNud"J ,(RWzz0%(f40N(/b!z37@?uR_TUEN)*G&TuJ;$PWd@0} @fTy].*6 b^qVʝ߰ __+Če IW/eJ)d^'VΊ?ߤK͙q#g&+'_=xg:ʈ 9M(X $<.^7 B6{P) 2J 7Ig:uJuir܏`['*^}BbȌ eI:+z`J(;9 f-b>M )7}( 8ؾ-NL{rN~ty#zF+Üǧ"9@hIY7'ROW vKĨu'1E:}ʃ iEbQ#kS =|W B9e}(k8 }]eAřpt)b._)DJ̊%.RDv9 sʉiR8X$C렍Q_?kV"PےAP8}{9r!\kpRc{}?IZK` {rsնK}4G' Zw6ex#sq*Xd;,S0sAtT({3>*ľQ ǩaPq{\:8ט~ wJY6 =z ov!g X9_"i%#8,&Amُ }j Lo#Ho!kt7N <"߄?g``&)2v:{(8@ЋϲO--Bu֌!H)$BxBґ!aC\p~pF253DerRWpI(f[.ҷ+Z [M R''",TJ{?_&!*F$0WC*bl3!Q*YJ$'oU'7IKMp2EO! ??|4d)t<Ю"?{H2sJ.6Ӻu\h}@m-;F4 5 ItؔN %4˜8IN*.CKh i!jpzc2J L{>s,8",q0 O~ 5*ڬw?r:50Fdd$sHde;VYV$Pi.EQThYL/\`!X3}f{V@~dOc-*JS3 `̆ћ9Kx"qj ϶s:kxv+=fFX8hJm\;Pd Ń4̴ai;J??L9XsbQv"vUn|ѵA:9n4'gzp Q$sxǯWTve*W9|B9Sew{S4***ʵFS*0w2l,Y91\h1-##?r>sShZ%6!_ʻjxJo)>yjgؼ@^"yE:f+hS+d+JS7x]J*q,00}ZW?uЉu$9󯼬z͒m]*&ko,KS{/Q;BB;u4mh]qzjG H`p[R~CQLLCҖ[u}w@;ycz1RuQڃ 3x[]yL_n*iZkZU{K. ,_+ n1щ|(;>)KqbVQ(oN@JҦ5VߜݔkMWSn,;YsqAƒވq79xmѝ!q}/ZDM3AbC*2r0u ^N)|0܊ly19g}ai v΃Aݏ&` SS&NKI 2_ۭhGteb0fJ@m#٪fM܁qv)m[\fO 5f-7A;CQc1l5ejі h %' J#!Y9J @ykS>i %+!?\rޫ?v9YF:qTXr{7,6-/YG:Ut% x:jYl;8V?DC?dȒ;P(iC)1ä` b[0Bj \3Œ7.!8[ppuG4f)Y{YԈs/}Zi"iVH:W4=z(>=QƊs[1:a52sRfvݧpoUtK0%"zW[&{cdcJpN o MtC|8T2]ҡ+>ˋL2&7=~r$5a_kUt~LvF =}fm6. #ap"YH0@=Vh9\] |S1Hvy8I]8sT@& :! BA? w4hF8н YjBXL+K[ wZѧ[ 5ܐdf5@6\ [%.9NNhKq)NCɛGM!TV?-;.mm:D? _F`Ifr2rowdf6:pP/^!~4TqzeFs0ex*EQ7}3r&t* -abVFYZnA;JVOa_ExlV P>d"A+|tzѦk)'H%jH Jn ~GO ’ ʊ ̇Fm5%'^o~&5)DA J:zC25td.VN4ű7)Q\iU/ f/Lx%TmEߓ&lчjӛvL$ BnY&BG^O ;qD`v4B"vvfE+&#OvF `K[ s;%:ba=-Q67as!{:o&o&0ges;l!.XP!9RY͚q7; /H1 eHc5(=}e;!9܅a_ ( *%TnN+i${CNgA?r*#jZߡ͛30V&T } :M•17ٹvɔTߒ#q$B0LkS#|UnLjͿ:EEsr̴<9yu.6t'a#!引XgCU|ūZ~Q/ 8 '*fJʇ;27B@%N^I8PQtxެJo۝(Ļe^܀[! n`r)xh gJxt!w/Fߥ멸RKIxų,u}otK .$ )jb:|oO.ChHcWI3zU4hBs~ %y;ci~ni Cuα2b4tb +fv[OY' N.}6,_`-\d~8xٰ a3|&k1Th'o"ZK)RܛA<_ ^גuo|N_tY.f/[o(y͆Ç,#δ8 wCFOkH .{FD{,ߝeʼ:{ )j<}By^p4EIR Г&~lH0jq|1Fl(i pQ7C 4hwR--&QgEcp8G吗Ϛ`l,ӌ! 0Dљ ?\TOb JMhxDv3$(5!5B6 ܊%sګ>A.+ \kU D/Y怰n^0DEff_NzU;B/`_y;xeEד\w(u #}Z[+ޞ7DNm#tn'%UX7S{Ά?giKkR> Qa )m˲ΆID ^!8.LLzsՖ"`6h"mB }N+`̉STmM9AxUkDo蘪ňd˲ +q K$_hK%O S.3RGxYN+Wy'rs$LGMJ \~4'XgIqr&\Q%?Q6}fHU1lwO!AӈVϼ0tD3uo2H8^dvߛG>sWɷ` K/Y&h.YevC孨DqZ>d(^85r] k!bT'}"5VCر.M ߉N=,J Ŋʺf5Y鹗H?eI'&:u4?¢<ŕκWݝrЄ|oDXď$Jp.10¹| s {f#kב H♲v9{?B>qOgXW^ &h)tddB5)˗k?mK ϲ˂B*5b v౾߅gW}]y1g\wUW^3z]SH=@91tIhZp\ 9Ezjďm|Nu)+*ւ#1T 56~YeOOZh~X %aF``@D/3 j̤^wx` W}zý)Ml4іx7 %Q9DP?z A]g7we1k싯dvةgBg%eEt^OCMJ+D./2i:!,:!,qo\ X]FfLy)詟߻@7 Eic~>[߬#!a$f4a^{1)9-vwL[%L[Uݢskb =E_!y359צlB!ڧI4Ÿ^ Ps.;>0)hv_ dVvB~4#?װ]ʓI[KN7T#yMNڥZ()q=g lڻn-^q愀7-ʽlL4%e"i MAB5k)H#w5OiXɡC{oH_ HK;#s9/uv1ZL]}zjС[PcuG-lP|$IDԩaͤS9%ɠk}w交g 8`{ޭ*ҳ͢o>>MT'y8t`~J0y ʭ`yeC>x&CA;QYu]"ƅGS`K:lڋiL$YUL'C8dDxy5unSڶ8P)A _Y'yW(ˎYl"gn5+1 z6σtIξe$ 0g]HciL+$Ϝ,gaP=bȄiD7(x_c6HCEXUJa5wǟW$9ݍdUZ4M3 ~Cg|k6Z[,< p"埁_U¬?-/{K\4Tgyґ;`SqgY|.x4Wf~<`l#@kU 0E@\IrfH%у5Y*sO5Ҙ-@1$[/2]U in X|YR550Pd+V=W<ǐ EOA]fUo{#.:agU0fj-씶5]VTwѱP)m&Z 7PԗizE|q)`iP-2%FOwYỵF‚bMʢF* YV#oՅxDـEZ$.؎cH#䲾hh#q6wYO} mR]jWXbcp o1zW9D/ f~/7͝OH{HM B\éSt'^_Y.TW#"VhT(kM!*? ~#뛢|ݦV)IgfkN,O BlI諝ik涷c" RjΗ = _̠ݼOt ?sMH<'"Jjl$]0`, ,]R]̻-jw͋ka,֊>Ww'0wVz\򢡽fFYh(pKlp$L϶Ǿn}zAõpSʟ`utUF÷p沄6hll, \l_3zw xEAjliM=-8^%*EQf5hXluÒ[Fw,LUlϤyJtoL`s3s|KNJ+KqUnjIIގMf(/el< dFg92-Xᰝ.bf^-'|<|/pl~H+.uԾshPN|H9%w :6 $ir̚QMu4 :8]( ![,5&ʟ3_"zM ?F]&Bt.ДxͶڭҀz-glNj1Kh}79:#ř!:P~,8dX6foAGħZسFM ]跟e@ۅ|EmkN% 榻{ 9'M1xjG'PY4p&ui8 p Eh fcTdߢC`S֍9,cjWUm "!7/2-QyJUCYXOwkJ_\HB{Zht\Ja+XӾ]][f P"!j/&Pf*e&eyIa5Iz> VE{F=A4|#R 7!2^cª^gٴfzJ/me]& M?dy$3#0M"+ W6'ɤt')q-!v!%3@z9@XUfR9EzY^  (]# ^W› +14A~*C=z6]oYL,So\XMdbגtֻ!|$2ҝ6Ӷ$pL oڋv<߳XFm[G2,!n|YwCO)u>SN4WcAPQii:y҄^} :(eaN?uD (~q ֕{?[z NPXKa>FhzC-`ʀ!PcRYf|Hcu؞x@$'tⳌâjǀͿ>;i7uRmyV?$gQ ͙mD ݪxR D;0t`6d]#El5y:]PԢBe9RO_7s.fw!gi.CIi8#XcN-u^"&1+>2(3̍Dtj=ڃ̟MH)P,t3MF)O\#B}#cS;Dr*?C{ԗ\9y> \/MC+)|%F2 &A`uhB(s|2] ڦ6w穞:ʚ2T+k;2*du"uWsM~,="dZA'` [(S"/D)2?(]K٩ǪsGoXs)s']\KO0G jgqw\gݜ[_P}ʸzm ֠&u{0t{8بH XAmYʩ8XJ]T7#dG0V2Rbv_|%Ŏzg vzkDXF_ow2˺ms_f gx5]/N.kfߠ( Jl)Nl.Ԫ MQB?m.D(!E`f⽂@JT47VvJG \";; vKE \̢\I6X8jqÀRM>G,` wE#vc)=wGĽ1=2y+2Wo,ywN;Egzٜ/x!tm31dͱ_uѡ䂖o?!Л\,TE9k((s1[|Ɔ WEw#+ܽ@r'M8[W&l_e8l)d & >,qL\{_ kX3!¼޾&0oG*7=TDο #8 {8RBnڅ=5,OZ] *R!6&ǯ/rOH+|w!XMIJL!r4iȥzb7tM1z**S.;>7V=_W [wr>-4z~7Y\FtC3l̢@慑f`p!% c㇗`G>췃{ũp&yZ]K:% `uYN+e +I?oDH'$+۷E :FҮl"Qoתp7u0yjsckm%q|*z%X-%K2ֈ0p:U׺e>e`]mV0~Y?by֭'[//͞>k:#NJQeq91*~PIb*9km|9y:Yy utm/(\JJ@&i +Z4T>XUwl {o7)#N}QeCU܈Cx?dʔb HǗVϻ)J뭋ni åP+/8`h/'"u􁡁!롛K'IqZ0b'{ $DOU;4dɍkt;s-Hky&"tqkd2j +BfZ>Ƿņw &UwY?:;:ck8mZ-xqmh`(JTrjn:p1eٝ\2'7Q|̻J7>@w6zeoAFSBy&{ߘlMKs96 1JإUm|&5"Ȼ0il5ɶ+A{? ɒt`4BM<>Syc¶x> B,yUM)!v9(x,2-o$,Q5WHIA XI%O 58\O}7:;=ގ>Ku@%҂TF?]ک͑[75Mv; 3`ۃ MO{7R]w rf>T%0܏݇sާ7dŒc;ndi50JJT!fSW`a{U J5Bt֖iyeC;_ē%Ӣ\D8L~Z+cB<@tEPq\x'V)%5$Jx NY8Cj 6)@0YeSnG{[q;nZ8r? H7tL?Yߔ3)aff풗C5I,r=D P>1ZF|Lbmzj*| I bJBNW^x0҇ydRzC 2w G;XpmL/۷Le$:R"=pVTI,aBv7'coHhTIpLn$EEQ:[swVQ6~ =44{$9Zn2hihŦTwlCqhƱk§dH3gߏb ?#? >yps&fJ'MȵLYJ ,VᾺ9{xWtn 4 0l wqɎkIw<.qs[v d@^O' =`bL &"%i2+o<,"Q # ^ K@.1,'_I ז -;ր|BJ"Pz-/~-DXA/9!0u7<XŃ:lAt 셅8:R+=@vNa{AIoQ"K!=bz-t'%)Ú8%gzcx.ZV2 YvngB{O5|/ٯ)2[wv[Z5`HCÌOKWvn:PX"Ex uSQ `gk#KrV͝XNC 2{pRUhY|c`1<[{%8"2T7w_6Vtm#1 )4CdɈGw 688Ry)Z2MV!ި>t,fX(0+P%HIZPjb;WK7 hvb/"iS' [luxa&n0.p g{)mJ'x{,?ҭPm|z^|Ibx2mȤW%6< ҡ c(m"^HbpUl"Uw+fR;|fΊ;­8jh8W|E %)-r0d6\m_AX"O7;c[] 2,CKtfRmF?JYj"ɡ6V,<9ƋTUrb ppdɐ}#Z* 4%M+M9?O lz;l|Ͽ:)L ZI\!硺$kR!Knjmf@7@4=rB~ϻАGk儢k)+.H${ӤǕI 0%fjI|t.ztWwJ#Eoù6 ?n)xs#:AP8,"R1C QM.em;½ZJ>T$;oX)ѻwf¤\H>@vH%)fHb+1!~8SxXj̶3q<$iNIQg4w|≎1+8_p..9FeImYl(s]l?ŀ:nƉ n @TWNY+uƅv%Si{6S7NN%C`FF+xM#;d_-쵁?O7zy_ ? V@܇w0{A:T& M-ٿ5]~1E,{#w~3Jvݸ]h@ObJXYW&!$…>z@zb=ffܻ>\4-+cС ‹Ope-,2k" g' @[hb6jMVizedڤАFU7c鄀;f1`0tEs %k-QÓ֋ wab" t'{.f:8~9LX(5J@{/ {R&,DjZI RQvqmTxˡb+@R=G!#3Cnkj D $) umQ/ 3廠%9;R֛%)jo |g,nj].r:oX5)}nNnzAU$s̠tJ|VcgXV9XğDw"a`8c?E¸ L*@nP@ 9X0sIԙĴ(n!|&r)' &_h_$k7z{{w>2%5`pJhG~g! n)uqlW׹, 7Gsxb(3e ;*L,>w< OZg8ĥHrhO4I墭gt)-8Ma"m:F4b}]@&{n%rDVsIHPK5w:$ݱ\b/LkP≘?u(EAn%Ki 4F[a3ӼZ+Wz,HSfuQ)G,%4Rdj[FZ*xɩ{JLZ\ 8O9 ޛ!]0̳aQ Ψ)lkMRx^#cT DbpWW;[]!1r1 D$F춸?$֒zftߪ7L̜[> »ڋ9U,Tԛ:{ҰZwOE{A{MX46q~j+RQs2O&Pir0$],L?g|(Fý1A7A4 !ԸL[/Lz(l[0Og#6S/~= d>5:9Rr($ZdoDkDao՚ìw(vq?l-I[j[lOaǪNxvI:^j=ɳڏBڪd!6R4N'(?tA!ݲ$%  @Y3a!3S%`V{pg2xd@!.\Ĩk8hE"qJh1`0}`wի/,,K k.+HhuSҿd1\n#ɟӅd@Mb4Ns9]ӲZ/{ r̗4Q P QE@?0i*Ң i'Z,.U=:(;ŏs0 \*E3lAtDdtzneF.V $T#ՌI.Pt~.,\v]V%Ol]{f%&\1Ϗ@ծ!W;*O B7_ ì;[uiaۂSf%fVy6>+%.2CjqqKI8-$b>7>a-RIa?kt5dhg){XR}-4r{Wn Ǝ_]߂%3B lI 㭹QDLt< 3HYO5-1]?ʒ=޵)2=45w̽)<: i(8_M(By9NL^Dk+USHZ B(B@SZ í9S߷ P҃jwBG`X&sUF\Q{ =] &sY}M8c<1qɚoп~1o@$h.nK,ccNwv` Hg4:V1laK]r#CW_%,$sn$\ΚAMWƜOW*3m0~fH 9KfҮ-cg{y)Y{ A"Ӥ#DٷFslR;I{(+6ҢV̗pZ=P[..%ffۧ^+r}%k-. 1",%o`$/,[R7=!zB(n" B-x{ډi$v5&*6Ić~>:&ݳ)c(=IJ$ R,;Cq~MZ ?~v@Hc?x@/c#OZ֮)dr`^ mYrzJavXؾ5Q_U3;E>bԱ< )}…(.|ΐQaߝHK\ ̊w@Hz*\pnػ]MO+vܑ?-IsI ڂŨOW`\vR{q\Afxv(Vxg~3Cc;;/Htx/tD"h:4Bkj1kPgT9 e-3Fdئ6"[:)骴@̥j`gN[JSnY| #u ~ 9 .CAA+Rl\Գsr,93bN6H~:ȋw:`^D+#ǓPx>@,U7]"`WS33bV;;81fvo%.dB8)G)l[2}S@vgnZ>,Sewgd>A"0 -آSaJ;ܴZUBp߸Uv#oCNR(Ċ͐V+R(aTQ挣#=r vb./y!n; j1&u!UEG= xA-p)N:OD]AUxg9Slh蜓(JT= (^JGG(s  ϜR3l}J4zm@TRjj/A# J+vfϾu1V ug onm踚=Eq2Wˉ.i/DC!ssU?L8:\_..Q=U;Sd6Y"P~1)ҭiɥ=/}ܲrӧYfvNv_7WbyDV==|  5۹Dd<)?Å-]~a ef:'JT҃iv]GNЏanz=W@fSfs7tNq-819S4,uX[ D#dQl»A3Mŧ>Γ͜MrQAA˘ >BM.d&N@c@QIOaiȡ^Q#.i&--53U i#LHƴ&HTNZ ?ټ{qrdu0Xqn1Ovxu Uy2#x: Xz(|2Hat%dk OZ73IP ]R[N+CsĨ,1֏~/kSLV 5r9#F :eInIV_>ERZv(LJۏlRCc>ZP}爛CJ8 )3EWt,Ek"=UwƈS)Ѻj/u/v Z6!Yml\&˫234INpKqbflpY V̿QWIiU-V&xn_eX=]1gה&:X(f{Xl=e}*ip0_s-"?MĻ7νWZ&`vЛ(O"jW!= е zUiYi\/ؿC}"})q@ nb>.+9oX랸?7$b Sz\>lYN\ g)ڐGJj(g.& ېU:qr#";wRp9Zl^6ENzz߁K1o8 [8\^EK?.95wYƬeslt6΅(&\^}߫"ETM)-e 38?\b)o d+74}ba }խ {Y…kΊmET=pR&eZa!,l"ғ8qW6W,;>ap+s!]kQwWC&כų1ˑlIk?LC|и&y䗄5 +$k7mk?}*&~+C)%aV߬E¡~~!(w mw>s!y[E¦/k*0X| iHBfه6~K_p?^5FIT?7dz~q\'|4qOoz+ h#9 Wjw g>0MKXjɠVߎVFҳ Й:&|vEiۡZ9(x9d.I7* Crc6S`.늊.2PKxȻ7U6dS'*{) +\z;hQCpY3#Tt*D4L#/坸dCLjtXgqIfyՂѬ# ל"лS񣐟 D?svw߈R!f$[ _\/ A@kq5~>xIMnYrW9A?|urH_p$ q%IY|KZD QdvP( 6Hp OE<;0:c>*{" Q#kkO6d8F>(ߝߊNO)`8{9tj+;qAS+Y %>O=dm >.;ťwM6,K_D X6;V/PY$F^ GgB=ۮ> YTMsdD1%6i:QG%6^eD@ZO1[kɳP|'h/35(q(ݮ kr ;r}d~V#=pZ#B 6e۽bJNGr4=C?3{d $~ Ѧ{9VE N `y_ egXh yYMY>[M: }D|~$#0:vy]X8;-V$~Yc,*3\hm_&ٌN5=TCO/9.΀1J< ݾ"^aJ{t8_xeG4 @ C$]$+7Tv)~')B^eBI,g"oÈ9J 2ǤPNMXˌz[0|Pɏ(YP'WL5# _ߍ9uM៚d@#D01:)#i_i0_C,9pwƎH:/'M^F=/F-fz H4ɱF4CdS3+b NB6\X`_GN)B`E"B *$y}V|esiId(M%ke@Sx&urBaH띖 [2{[ i8f Đڑ3ySooP2rIiGX*a]BH2%9I؝@ʲ{ҩ RQG&Y ¥I{^b؍)f?$GX<:Kx(X:;ELXzi"Yrb-PO9JC0E|{d #l"|+> (@rdÏ@qő1)_Pάj5~W<~z 2IVL}_[nk[lZcGV / fsa{yǝ{ȵv B5϶N}FT&xJs7ÿP(dujlCavD=?w)'0OAqy+YwKٿ]HcR*DxU_U 6[7|wu>G+wb)XA?{~h-]-K\zU8U=Xn=h.ϼNN@^QQ99m0z?Pì^ydڞRJ!>gR %3<@>8F^-/.)]ipSTOЏ9h+eGHf3p6.I.WX_/xS&"Ea@ƄxZ[łQbb Hh˱f;b"fnd٫!({;R+jڦ%FFw9&̣ 7Ve^e֨¿tRzJauspZ2f;-m8(b!dwq;+ tM +WuDj'u(jDD6Oqy@sI;PrGp0'A(DO%7Yt3yZl^ƋDxa9bJgldټo_-ZSe݆Eky<]_D MA}mZf5:b-AbpqНO&0rK#NCN X\^=)k'2Y3ֹJD/#?,*^BGkn%B r`_8v+0t{&Ov cMe5֩#ޤrHnϮ'lOleQ?,$ yX6|- f LUcˮW9 >dM4YPwNw6+k/8Ɏ#G\_,[ !qO-kzb=H㐷 }]dfeWjs :p5tߖG#)ƇDȻɻM=c!c͌Oekhp -Hе:^>jnZje$ByiH]ͻot *Пi۳pu=%8-΄;vmn9T6'fK&N1h#%ma0'.=ͽ&*):set~|+^Hi.d͇o`D%0WV&#]PLG Y( e/`|C*H_qke r}(@oؤ}̈́7/7B!L`pNyȁ^->xn2`[w(28]$yxЌ 1:T}÷5NĊA eUc$yӽ?/w ·d<~xo 7l3*7jqRN!z@#W:ȋr"5}:g6 R!Il_0&}: a`b Ӹe:y#3JW_@ή!iQ(ػ3XX0exNggiY[@A~ZxLDjshmĕv/ǶM?:zjΞ|!ubjJ&9ѳL[t&6pFGDžNVNZy]vpXm877C$*VArfsrOP|n/Zd]S@ˎ} bɽ:Ya bӹ|&f 6ש8PF[9@i"&(ǶY;ƴ% O\+3sv W2ΦV~8iͶ^N {9ڢ6}4 cYzԶ_b=}vpvFf[H7aI~R@T2=,RgkB?W.[$01|kmxj zKnq!91dߙ .׾ʴFW :~j. ߉r VN E8InwY25 lͤhTqBkEw#Y{U rò-rx94ߑ>?|4pa#ٛ*yZp% -Ɍ{ lWaaSZ _{^LȎ׹lɏg^Y]NjԺ[/Οo|/Ogx!?n6? x^os?^0ퟎ:PYg*O| "YcuYL]Ya(OnEB,QؙH .8Pm2I8!- k{r,h1_E8Tw p?3-Uq>M"\4h)D9KX#ǐbvՖ?ږ!3۞[c11DO8éI0WG:}3Mgu3~;|"<1)yRA˰V?էn$ W&"zg%ЅE3W_Z0|$KReBU6i@'J}K"oƻ(*_a70+UߒGF@) D(B 4Fzeq[V"]B*l#%oEUuITB)ipq@+U5cq`!:4Ґkܰ'dGs+(VM_:ۖf`%7"|gߒbStE9lT6"oby-(!XkJ Q]pR-W$"##RPe:p`lT4bƀ9`7gP\Fr5LOѲDheS C,ǽT7"fg01e!7;wAx"!lvB"w 7OФpMw1闡^cT^hd54E%um"N./{kRSi: d]6r4vhfh\?AA z3Cze W~b5S h?nױkj*L-4 Bw\64`ѝ#G6)bhyeGuNꛍ[fj k D)a[XzD瑡N զmE'Wr'pY>'ǔp8VJ  Pz528ݬqLytH'd#>gRj4I2-QU%}*i=L=^*=\m" Fs!"8\?=i>%^TT`?mAJpI!KH(Y` `2f(ЊXmw#%ڒa}#^'fwwPQjҠGGqgѪMnaV0> ToA@f'=Ati=')NIrP$Y0Yc]g:Лj+5wIXe(279#S'9^b!Q䓺9fҭ&HO͗z6dSpڕUދ4\{=27_tԼyf2t;Yε~;rn_^iK ]ڇ~q|SdZ,;W\!ص#Mrkw99C琠<Ɏ UUuB.Lv@cwk \Ʌy~=qJSm=G G,ky,sg&S͗CЅs-WyySXKaVhFd !-"k A\iXߵ*PcZ"NHh;" d@鋌v} 8lz 5xkkf MW Ed)X{`raNLmDtz̨c[HBD\sst3$WZ5VL@gEIoqJ5w},V)vkpS}HE&moOUǃǥn` X֚UGu뀚 ]]2b'w4>Op'yPXd=n3-Ț=ٓGKvjBhfAyF&OMCCs`EGB-8{WN"[$x֑,8\1)+(-/r'b{/BiFnkuU14[s ox>iЕsN aOV 4{,!Ϲ]O(RX.#Pp0/nc/m\hu掸h(I֘ a_`;_}0c8v_AiXX ͵5d `&\s\p  ]vYqVah֚YćMXm^t9r>41K֏]A/2@M9U8kj _706W)˗3Z\bi]*q(#7g(ӲETYƼ]K R,kz'0DOQ|ͭ>#mpd`rW׆D0 !33aEt\c62$M5@<&['.3%9ZAE^Cܳ/w5)XuB~ `QP@H &͈ Q[4.z]7㴳` *,Pǹt/M뗡xzظWNc;|xfӠSB{ }r8k!{xo(֌=QGOd01MJ 2 L+묬h?),G_l(?ۃ@ jj"W}!RˊʲfW-vmǣ"ʫ͗&]mRh^ZStX`_fyW}5(@pn[QwA"TKw;Wqf}CF;R{0TEDJoB6>0NVɤșs9N|g!ջ##lle54:++S:eU,"$b6Y*]zmR7 hyr $o&բ8WG< zDdO<"4auu /HR\`8m:˾; eOv(óz e{L;WjLs}]iW}Ȯ3Oޅpt}%V)$x&C'n6 4D)f[ز{vi7tR ^j.ϛcn![Mϡ?Rbhmi>R-&e Z h']N7QZ&0k hE"ٺ]94e5nD1UƳʌ.!>:y(e/83um1>uEU] /;Te%,Il']*/IƝˏEUQZ!Vn$.dK=r79=S=| 4/14 E%SWcP4q{ Z4Yq8>>P-7g5;b< É3<|;X͡nrT)ȟwM9㥃 \s&@̀ą4s*&tY̭<>}Z5+:TLW0wssZ՚:L/k@t[zkd#Ja[jQ䓑&^O+bBx4x9"H שf+ԑmftӇ K6iY蕲@)lΏj<*$l$?򆬀NU#] P ˭Wi.ٻ]M)T޺ع'Z ύ`LA8c<4Yy~ KtxA\^B]M$#ztR8ؽ8؎K {d˱luS÷\'j7J}omEݩU$ b%F A{ ;QG{r9A媌u +Ö޷Oд%WGZklԿ*4liBe7S)t}kЌuoѱ ٠s훀q`W0SXFοsSS\wy1z,~΁A T kУSh)2Hig:`sj]ϩ!t:@qo\?ohL1[5XRvjZFHq1.*ul]S`}9q{.R-"TRΚyJS =ד⼱;FWOP93F6ƝSV?o:iߒ9,d֖~\jHdf2d=z;C;>r|ڙ~8A R3sPnUI`+`%я-MǬu犙RZr")OH`/k&>v 2hV{þ;FIqO\nv&&o2#n4v zyc\oA_`ss8$h<tQ$Nx[xXw:8~N6kdl1Yʊ4t|xjV P -dBdC^`!3fMl7aeM M9sPm(#{}ޙ<ɍvydXZop. XHюIMԉkY{ua>[v*P=WUY/=`&et%rW4cmR/>? Jf0;|#'`!$Y>7 TZ[^l4۱!R3X_DRZA!#=7CR:jcQd%rH`sUçi IeY|,Xe5WY.\e8g+`*q;t" Ȧj1`ԥVipq> aKEdb J/@wnnݮ+ǿ\2!y]'0 >r'jx$lޢ,/irm aVuSg_&bS.۫cTvN~>,=miJ݋楜x|i ]R!߰ކP%ЊF2gP3 #Ev(CLJz0_DN۽FL'Pv0| LY[{=A  N' ~'e_y)eb)D)kV6*q!mn.~z5* -Wl.㥇 Cqdec?yV>QقG|{O}ʗzT 4-P>C j[K4} c.#N/w8Omn=bn+A.7(' \*I|~ l4Q9s)&ڪ\)1jL+$}OLfR{{Y?z`1د~I|Ѥ2?ɺ 0{f;Mym? ˽[|HI060&ˁj>| (7s>tg򊣀1귓jĽ7ffqIy6N3jd#;EthͲ,|.:/=F:%jƮʷ,m- Qes}b|j_i՛38;:m98co T_{k' '82yS"ྒྷC2B6w6^~ۙqRZeg)elaQwsvj6DxJe҇+߂!L14مAAva3;×u:vJ~]EƦf-ekDX 'xθ{ `h_7C1ENRQpAgD_ q]J[nAkdxŮ[:y>+MVr!fjVut,#|W.. 3Y>Jmjn[L__{ot.TgpqQo]AJ@Ƀ~ɴ'~Z:cZ,UZő(dΈq5>27YܮvgRT2eDf( !pѡ(7zxBx;Go[QEiļu!%Bݬ vw׫fR)?`^gjrGhg O)Qd#}U!U*!kƎWJHt@Z]HD*?#z\<*[H IBU'wԝ }KDE-tqDWΘSGg5JZoz9jpvǰ,-{ZzU( |_ Fn:QDoh0s:Ǫf榻Yz/)'mw5i'[ yɁ rio^4pdK|'[ew}7pu2QtJfedґ2|1d!'Fl;oRMw+,@7fz}iӘ9§G <>/X7  bv@ ~ob_[ciQS[ bK랳geŀY#Hp   9сɆ;lL`{X-vw (*كE]>RIA-ˌHIs]1)ˊWccӜ( uwڱ2:1(@MܶS(gHɔ:n)R^v9~ dl4Xw+mF@S,`1&),*Cz9`9=/ajzֿNU@k)]k *ɘO-bW.ق:aͻtqL2O\ʗ(O\En 8ٕUK<"%[‚b߆ }u?'H~A]{i0P(࿘ ?.6ɶXghu:}<0+\#}c|~pJr5 lz`V4u'=rjEjЙwG`U87b!r-uuPQ\$) lGvcԔ`gf54y*||MJ#`z " g@yYKV\+#<nI4C'|\Uxx:?#b\X3dUUTtqq&YzG㢶lq%KfY!0D8/K[~9}}]KiiGOKOY^eDY$5%|#CVÇp I}NX8MҤ4E3ˏpį[(,eF &BCo݈veH(I;ՇD8;oh@yl>dÆǽgmKr4? Y7:[&h:^k{$B,}[zPȡ] 57Oഠooİ7hYm]n׹7mg E_/FTP58e$&{[Cc'W5}Ӫ1$d\@2~xٛFVf9!-{qdl(Pl1<좥(AYԶHl v^\BתfM4+@k,<ͿO8_ގɈ8U=vxEpu6猕7xW;D@g5-_@?eQ͝ZO5kt)_/r Ip zOnG>eluOP*b(sO3i#> DJ,kq)y?\+J'.J)[!8nK~&/s,{<뛅#)?F d6<[kR@3Ҙ:&-M\58_⹑Y&E9md;` qf*BqΒ-&a<~#l{@/beֽkMi~e^G\?}t& Yt;< B驹UN~<>~0o f^|ŝ7w2&Hc{+^uQP X!(/tzzTjF%L_7AaTI$-9;a + t .3K:SwzLͣR>ǫ3Y ٦C (?Lb`r +KC׉y~lbv|N:٪uD)o!O#WY4՞9MF}}"1+yk1X(Vӎ4M=Ҽbhc&{fq)+Becs]p`?ŹVG9=ٞ `di˹>.g>>5|* Ԃa6BB;XsѷsLEPk _gg^iToi+# ,%bbkty$UHcʳR= sa])ێ>,m)RnCY@V\%-8 >1 -z*I*7h/~mwSzV'%=}:[qRms~n;2ueIs/"K{cwgW,3 ֺ8\ʣ8!wE.1,V/ 0 ;1 Cj_,]\G֠a38BZnT1Y*?L$yS4Aze| ׾_g*uC~^ydliH6$Y&*j6F94wX6R2 '/&k- ?ƯG=|TU!&(['ivd\ jߜ^b&a7;_r|r(|/Lb@acJ_O*ޫ # ՝XV)ӷ]l]X5dmV𗌊Z; Yv[ޖlrAg~Wlz 0Ф9n8|BH& 󱷼^-ᮒa/ƈl!`E]= u,q݉4#tQr.R43wbSH"5}1 -\KQ Y\4t܆Ƿ\d1`KhY$R +dhi,cl)a5_E^\$#3ڋP$1! jV81Dy+xF ]ƊhBB;qŁSS J?$L;\UE4˔8b@I3\%iqn2>Rղ%YKu"$xgիGۃ*h).t<ر3ze#kXimmM7Ȋ;RRTk9{ҷ3xb146~)u=G\6[|'6ܜN鞼(b]p&x` 1:Sm(+FI]L ma|s`e4:ؿ B 12#g-i+e2iTB~M@k+'_VjAh\r2 C-D#6^W_u|=0I`esS vw<[=]b n)ӡ)K-" ?H 6_A |qj$*WGz~י+|`5c*[[h &To1*SvC:+Ӄ{{e5 Wk(\!9,q\=DvT@UNLxn1& CW[.yo1,c%H*f(?? fa-s rL7Hp%y'UvJ &hy&ZP|6Q>;'>vt/ ,.ÜI i2" 2 Q ?yNsȕ'hUAz9W4]G/}\%{/6tư0PW*~j5#[ToveK@ AmW8Y[;2ͰbWpfS2#cVsׁN tP2ዱʒ$Ú252OT|=pקytD3MF53DN W*.hA: x>wH1&JW@?1)>TީP~-23~$.vRLOT" 63:*wVsw2AV>_BXx":l?ʛ ¸{َ&u+v( lY/!!;#(}IQIRn2K&2AfV ze*XwФoV#~lt]Uk@b wQUS%d6.#!N✦M?݊R}~@Zu9[uUH/P:z6,X([cD}.k6?#l<cj$PԭD EA- ({Ckp=K@TYܠ(*R^NG9ȣuWpMET4aGӝRULJ~)D1=Jr?MYJ4E*+5g zD 0ɛx,6SѿHkv;wn"ykWϖJ:8^ v,GnJ@i"Qd}ue^ӧIW2%b*©}}KL4ˤJSL@ .-d 3qz{ 8PmK(u'%?5RkBt&;D*$Tt@GPqnmS"2'={nV,!8ҝJy@paQøyrݮ뜸-i#Kws T6<~{h`HUOS@qΗeu ]eA ,Ɗj06"k5UxEmE{!tdؒSĊ-h~$`,Tn㫔58H]e2SHxLͷr J7p~!@H#kPBV掰 ?:Kƪy+Q5P8p+0s\FMcRڹce&x 5Br2zWJ8["|x 'T6X H{k4`}|OYLf.x 9:Y!ANIn=ˈIU*z,QEH% Ӂѣ Ŗ;8Ez}- X}7#E#ъPV?$gFB^}vXt1'h.4Dfs mLfV%*~cTk3Hr%0%a,LQ@e]% ~÷} $<1l3`lɇ1)O< ɤGl&0rx+Qצ؋Qo69D~[v> ^> eq0p^v(ܞ?l虮Y ?N=)ˈT4|-' D$8!$ewE\>3Zw&4[vrnQ 8l .4aPeR ys;^}I댥2=Or6H(Z9QA|]pVNVg ,U ~K PVEkU[8'`]C -WLE&>5AD9S=~A"9z_TpP44lVGsyKߞQF6g*ǤEdAC Hxiv ync>f)=+^ȐG̵(vVhLM0[1ay.Jr#2nbvjT:zBEA L믠М&Qbn SH3zrՊXc!ZD#[vXH"UVre{k2,r"1c _{&jn"*۝p(9.:r`qRKPf)J 69%гmIgFYnٵIhVTɏſ0RuCi/GG+c"gV1uWXX~Y Wԃb<,yx)wSGK0WD5 ^X&Z4"ܱZ9(w8H nxӮ!iܧ/-k #ɔ O/ӝ>bXe7kKQH*ku߲RIE(q@;t=b@52H_Zh&B~L[wrbE8[ ^3G@wZ8 'Ҍ[8O0$N>>gDD YKBG%9r8n)n,ˠ ] {]xJWYo'Q|,jmO\1"W8dcl2} ȍN U@~I?*$@XݖzD`Q}5_ 1{$\jQZ t8m_h/8W8mT?W<9z\Do{F, 1u|ϖt\iṏh\ŧ`?I:YbX"G\Zd )]C|5 tWlw=1|ˮcmkx e@{QkXK[7 =l)F/ez|u أ{%), })k+.{LZI|[T`KB P\ɗ{ 0 !. HM#@&NbZ.~MN@Ʌ,1uEXTZ^+8L!`hM}ڍycu"sC_rw`[a. s8㢽52bI5zgmjHix!~C8;; Ƶs,xBh/o=s L,> =)]2wRR*=uc{n`fEOdì">i1X(Ajmpgy#J`'_+j 9BhģKE m`Nҷ4<Ԅm '"@LY(q@Yδ45፶QaLG!hޫ5vM-ϙI}EI"E82i K#]4ɓQDALmjMn88qtK))op-8>x^A8Fy56hf4iiT#tE 7z҅Jd,Qw_P=j%$*u-qƃOjQ4Қ\/ tdbm9=Ŝ2܋H=ttUPq!O 5hydڗuⴶB. }wL!WlRDRRPDGM>x~XRSA]W-9W]ށf?-jyf|@( s)xWcehા9dr枊0 f9һwBeqXZ* |ӓD,> 1 Qb>ڄGCrЌa}ikoP&Lېh7KjMѪU:SULІ<ӒV\*DP"AȱYQ|gODCĚAqs}Js^se4Ji?os!kqqb8DXGŖst]*aH8Og;b)Uu [ [*.\'O/I(4͡9cB鿷)lZ.%QhoT ]L8w6(55bu[AJ'X>!:DK^C>s939[.a;UȤ-b >B)dIcZÛuz[bwe6c~}. z8lW+>t|h ds&n%Ϸg ݐ yp#_fkaB~j |8FvwfbC.i|CԡAG7~ C4pp džk#{~d \. huAնU3~{8Rc֚,z-%H;c;0ɷX7w/YU1z~VëH c1. $y++E35o< rEo栖:JULk 6Ţ$!PZA v~` U4{h&N[F"?belހhwhWߪ|pjNr ܮKKx@1"/ovׄY<. n3ڿ^ N2eF9`*MS@{asj8唻*|RrGG_qzM.>P?F, Xr⪠9(#A *1u 9;F\` _\!dۻ)).o RĪ=L:0- ' 'oϾ@s=Ok쨬;ZRÖ{-àOY zq7#>xOtHhYdy;6?gd@e4fYQ"0߱+odl TҀbcW9.ҚzN5 hT[zNN 33"sI^YKQ<[d&+FhIeVdZ7o뭫(0` |0B@h*=.4 Z}sRъ*HHad7XX2|,/$9%跢O"T/3u>< hUq ߸`7;tXW:u%aMזswz\OT!o[LBu&# @&*-*P!T(OA{z/-뤈'LERhZ;fv&R*TeoE]XWg7)O2eۙ#VˣX$K[W? 1 |>h߹27\U}_%`o`?@(ZV&Crnx5Q7sc)"ЄS~!-v}Z k)u1>9  Oσa a%y1?gt=#8Gf|]ʔY7#9s 9HbV`PQYɝy8#b]+ wpCjlϜ/lT@)' Ȣn{xN@pƍ}:rh= +6Gy3~u6Qn*#a !_&zU~Iӣ- ba,^].:m0ٍ>G6“ jڑWC|!'.KAՉ7+l{"v4_KjLD|YwSSIxtρ.ř_e{P4uG^܀5HO!)b ]:;@l(\!ugP[yFCN f#^c/IRLb[p \W`f \|5HB $I gQOP(w9ĽGC"`uFhi5HJ)~B-86pm(}&.sifZ 6Sf,s6gdW;;;e~)o@-_C ޥ YbbA4qH͋/rT, > 1IYHLϵN)FFS4 ڰH@±}8>ÿ3* ?(r~yD|_E"=Hw>boC'}KU(NƣQG MFBY«alNFL.s‘U^ ql N`5л}L]EX[?Tq b 7O9IrJ7[HٞųpO+r$Um}[YsaVkd"Zo3B]HcV3kZk%#1UP OJX*㊊z2(ԺwрjeC>g <Tc  NNM6`d  ~nT!5"xAfЙ,+>ަ^7RI*FO4/ xng UMv(8Ӊ̹5#TWW^xt:B%_xdzU>R%xBo\ i4_ya% o#ϑmHi3YJ,Kj*s ;/A6]0l=c@T{7/Uu~! Rwr?ĝ "vӺ&ò%Ƶ}qxqmHs)\42ZWŹ+%L67}ReooqŸvzym#tFaC5X? M|*{vfH"|kU6m*XחZRA$vF@QWE?jYeNR7;p6EG.7j.=K~ ڰUYnR,r*GMoOLeDF $"g%IPW֯Pu-+_LNp# 쳠_ ʌ$066S`gh`0ޯ=BVKn{>q능nx> =Wnv3.KWۖD_ dY/lP2O9" S`HH'LfŊ9Fvo^5)m7V肽?a1oY{>Pdm5 vUn&am, T9߇&f`&>-n=U`wd=WfC)UqrK5F Ug8twRctd%X}:` =T`ˢJKNLAxJUuI<2v5LBߗtq%/qb)90iT+̧nbxP#3VOk@ΔI5jd/GT yʱNd1n@j3">gRRB1BuokPVqwq$m0L5)??g>f[mGͽZ $V}^ bag2KHg&afmFX \{& qz8FЖkeڒ <]ì[oҺ>V`a0U@n8\FU_ ŷJRNv8GZGr /˫w4r2"ARP"ge `hPlQv2bgqyʓHGܽ@IFlj; %%<㤒BJYr ^C܄}\Fsh⠪Eq n`5չԦD|[Yٙw~#9I}[O6srsݼnybQ@z A*ytLmz]ݍ<: 9i k<ܱtobwyPzAȀ™ݩɿMnGM$L3% *oҊ3F^+Tz}J*a2. K/؀uIN` NkNjӜgOap~f`[2S9 ,8il><ҙ B*j9+GtCX&( Ž5l=xN ,?Sg-s;sxP겋hº~{A8V↪uԩ/@9VN7Kfէ AƉSsg3L]P'M"k~;)dV{t<0?'Y]a~Q$ m#$I- ND4Mtg}*fkWxI-Dzn#Ax5\<͂jTӨm]XXi`K#$-K{t!%v؋2a,) 5,?UdxN2Ĕo&ƹ|O|Lj-u>oQ8y*VG~j.TYo/>Mrbi2W_PN *HSz-&'cgŴ,Uh YkY|cx.?,<Fyzu@)u}`vRo{1'C/HxY)`z4W]cpPl'z$mƒg.ưAnh%4hˆ=Q4_"kC繤-O=⏤Wńoy}uP-B# {l&8Ѡd&ԝW,^&e;5s ̇djA)axR5۔^Ǹ νGw-Yg38T ;L=z2T%Zk?tPںjy~E5_($lvPt4e虩0ۓ1gعe.R9d:1qʬtR!x+ :ߡ[,^f\K| 0<%j3)<nLՇ”IEI h. F2z+h5aE䠏y Pc~AG@=t)S,N: Pթ|O0zzysoT9;i &NIZUqM2I9{Y w;D0.}Xױ8+ARрLZZuhe?Gi $sx8P:&\MI$0% rҺ{:ٍvK-r&h3Q‹mcCvbɞw@%[1}A"Pg`脕"P&}%m 4"|(tMk?3M5C8 /\f;H^KلSml/ de;ĵ+`&8amHZS5l͕G)dfѕG",p!ːIkeB`b w-mM[t`GW.Dv.PX갱 .¿U^RMϥMuK.uh  UT4=K-xtO1-O({Ղ^tC V&.-Nшڳ{(t&Hv]0:*sjE Ou|\BpuZ4.08u)۰ޠ-GQSт:Xf{_?@j{>d`5) Y w oUZ/nZ6TJʼnnj{QÞ;r.m)p$)vVϲY=u% hpL:ÊxJ o`ɠ1j2 lsV*6pX ȅ Ii*B5m249}?hdu4G~5ejzx#d2A *%n7ed"յվbWڪszkD4~`О fLV ,.@{X? ls'on/WYzSՋCJSey0e9dq { >,-)*BwZO>`B8sB1rtpuzm}2/1FG =-#nV%tǃNH$TO91W:}+jK9Ǜ!ɦv.P= г}3+[R2D֌_[/6; ?NQR 8Hw гD=KR/v5Qdw삵1(ݗ\ 3ƺ]g@/E ^-n׶ei%w;'HXLhӣX;p;M: 3W3~y Υ]j(| Onl`rEqrNGl$}l&ctW­i=ID^9n̖B  bITG=#&Vl\uV.-,a!6eXd|_M9 fɳ԰\e$G ]m+^B‡ BW -]iE'ܕ&}DJDpp%-Q,A9ԩ>/q>p~`u`f'\Sg#/vNY'% q딃[,4dCǯwTLzCG⼊L8:al#? G,"uŽ3#g=yM\ᴮB]ɆJ>jYg!]ĈMCr׀a!m7.aF\zq'Zb+8_CciG ROq+ܽrh,x˹e^"-Y0Dr Bi*,sK9ZnH2u07z!k-xq.f߀CCsp)wqf0L }ȖvR'T>(ᔥ 8<Ҭ'S7pb4/Qvef?l0?0'Ů\fhRowMNyc#]q?n*> F 5?{?c_][_3${1@4f7?ZmY,$kf0J ,,nnȚh^y7&6XaM@,M#TG"g^UyhۺPYvgzpMP@m*F] Q^h7ϖNZSPfٲ0bh OM6sXw.t_ЕKo—_~ ~W𕻎|`xIx!+`.)!Oe"^%#0mT WgT cO;+W!5%ZzR RdUi3pP5^̕~j5Hr*'kC}m QᵐǕ)!KHAvN~IY3?B yECY)4S54~) @v0_jQ50_FJmѐ QDԐR9l0-<V\ٛ$ൔ! hycp}M?Ǖ&O[ȌcA[wib3պ-=#* eg{LmIy怄;F'ioXed`V>khl2[ y1_aj'Lci买! >:{ZF 2\>UcQg2@SuX0}`v)*wNbDFCa醇A,"d~y{_ToIc r/% lQ'RO0l9ZLoP| ')J$+9$u,?T G~=WUD jd^П g~sUmRN \D`qnFG3,.'TY,*9PRփgguD/{QqLk»>_pB-Ђt+C!Fn^L/QF7U~"~$-U;(Vy+ }kCTrq4 j;:h=&T{ 4V-c쉮Iӊ0~STeEe+7 IQbX/o f,Mˎ;M&$V,m)cYn{gh/11wql8o8F~|##Nk!#|0⽂W Z;vqx DK"D3n^TyꝈ˜<mW]ic^]f3Ի+S7O VIC@roaHZN[+`-(C9WuJP{8o?eca%SCϡWmp/F35h.ʎjk[g9v]XNb˚SAu NsݶټC$3N6hw{OfbNIX@TF9LwZlt{xgneJ-".?Ӌ e٢ykWy)^G7Aʾ˟5d U69׷d. uT%4SvCJN?/y]oVq8kI# bLP˰&!!Cٷe3^d5=ovm)}ide@J_oD?dH*~3Rj9ӥc?؄oNIXH yLWZtZlmR̙+r@p1#k|xuq*5235QCLLLSb[>1fm0q@N|,NsR_Im>3z]W'FHTq]uǹrn/8T9",(|Qr)/e1ODW6Xij9t3-왏[%Ş^ψ݌9;@gRG' f35O Gb!tt[˺>59;MT:"Ԥ>ͥxˋ:vF)r4(Tݽ 숃76=t'bZ8jp]1_R_');;S{WHxplˈ/Dv0K1PmoL".aIf^@< ]CYARZe~z$Jy qs9~[0ۍߋ{|Wi 9X, )" m;1+-+aR3̗}ŤrW@ܘ[,KqA'=ͤX2 H$hɪ³KN8?e>jb{,}p+p #n<$`'veeZ34R ?t#ω}[-r4tDNGyH3Ÿl "9"ҢlSLʟC8{a.Vf)¨67O3D84A`7XHon]veN289|9(&~X͎i;֏E|'ʛ0P!*uNbn^m³*'b=7ˁʸ_v:LQ2e ū2utƀ,suR_@ZCQSիb48FM7 ʳxڮa rm@CCq{{ϯJeJ:' oA[%4nenJ_\I ދv3?ybP'QZҚ .HR|kM|έ|'CBPS]sa-[gU(g_'Po-`+>?fxm@HsZH~pq/a=r*FQ2 ,=iϾ2/\4FO` X;ȌLYJU#UB}k(ѯT.wF+f5Rjx -f']ܣ N[R%1y_4aaCzSd贖6=mm\+1~|O' ǝZ\A>wA >ERiRP_û {hlsy}1 tp::A|/.!U Mq hy`M[ 2jZƳKPpxvؘ|L!tFyk2S$1ņB^E%)yڥl*iAr>n:G6<ڡ1QlXpPdItag~`24#gZx] <D=6&>`|nyDPll.Tr^Wg2@2I8V3pt0+/Td 5sfCzg/mĞ~I6#7h?̀5u'9Mef@t4Pj# 9J<;{ܒ+⌴+eùE'0 sJfW, 5vW@4+gM {&2<$XAڨJ5 i[9rKdM= 5"#l=rUX7G*l8{DQe8v y<Om4Pʷzz[Ƙ Ꮎԁ\qnW}v "ЇT}K EK[z5:嬮rnN\-FȇB]\jt"_*^'t?qOCTsUe*DI.#j2QbSD OJ\nvΝT[uuڦl!XEXr*5]qX*~2ӊ'61N6u`% ?B& 0_iIA=T]5_n(b? z2{g+?oW 7^< PFO1fd pC? 6rK c/iV'LƋw75Dfͽ=[DV#o^`R{LEnrePVl f>%4c˾^-_{ {O̺ !yJOosn@)1Z'$!2C3'D˿+gk^,y8?):P9 g v~,N \L9J>_E foP`a&vkk-+l @ej~<d~y.xݠ}:a`K?v٥{|u-/pv! `F씁GQ=KokS = k;,V(:~2( pv,S̹w%1r] i *%HT<td46Usnrwp'?"V̒5I(dvtFb4SVʲ}r8).PH 7X 7c'Aۮ 'PR.{ލ%NyNjTi!(cF`̪$"Śi΢LaJ@Ӗ/!bhZE1l= 6HxG]'!0DV6>$8@`wb}lJH\9ijKE;h*ۘz8!l`ކ]y2AzK&q*Lj'g b iƊ3s&N*5r R"lL_*;wHb9q{E17oéB2pCMQUZ2;fa"k-Z[֛zGhՀ[ϻǞΩs"L2)l&UwYב@H ht`zMVgZ:KTý?#ٯ'=ڟd@Qkt߃Ӝi@__iQtjy|QCOFNsGև۷1; Na Rd±@U5=פDt]AXU@i4(Э\WY @ ]|߆ Ms+XRzJyz:Ǭo=AG ODYT&p3AmiqS]cVmKej.)mw  s1͍ᆏ/_[9Z |P`H9]!:ؾԦT0Pc>6uub Qn>+懇;*Qc("*|%&fɡFZܩ8ZbQ&,}Gz\=HRHϿy,uqⱯ H]jY\Uƣ ,ErРk,K7~%x#"] 魘E! ޅx3*c(+MGy$6\7`5~闶 ]#u9GQOCx;1˃PRĿeDQFEa m%V(nj"ʚ~;ᶨ+}"OQa>Q>%bN[8"ʱ`j bJY>xM>ݘ-_AU# #qb͝2=JgP8]]r:};A/Iio_tP(HD[ r<c}yILԢ@T 0J6Ej!7Rmr>)nyyTjD`$aťJ\U3-З28= J1mL]2XMDщ19K!qbfn"ID{'kP xtKj5E:`Z=@C]:TdPU#ʃf}[{* o (h~CAA1ZIݣʦf϶/V{H"[>|ADxƌ䗠LeIEyiY\Zu om5WV $Իi4r u $R/E療z/#ymE#\X-sS)w̺SW tUae/ms⭔;ĐR 27-1JML 8NCS&DYfN*3+v'JT-.joOKZѩzHMo{.-Vݬ~F*uݔft씘Y0X9WūYwaz@hɎ($ ." A `_@x\GR+&GNj~!Ye) ?Rr= uv=Ff]hOPyh/6 #2Ԅ%@Ӫ$(z)CڔL"&#gQKu]-H[l JSׄ 6',m]ѾDU b^;8yO»hDBJ8t0}uW_XDźAF􃳴&f8O5VFB2l8bv i~ZeoܾW怓H]!!eVH7$8/U[lY,ѕ(q2 M\ȟJrdcf@{.բ܊͞1cU ȃ!CCKd21US bމyu-:&0)M-B,_]i;":N}-<&iPIj5{_.srKehҜw lbI%== W tٜqB*x1Itp/aQiӔ_ d2agZ k=34hg^\.(wR xzi2$_.Y6kyY;e$' d2Ve_m0%7ok.(*y M:j7uGY׌0³[U0 guQs\gUؚG=`sD6PǍ@W;%NE|7$[6`n$HzP4%x%qw-jxKև;ؠ|fxqF 1Ozq ;q̗;m8ڂ;dw$|٤#e" - HՔlH&G^ -V2Q^krRf>}7hd2^Se~SɂcJ){? SL[k`|MA'ύծYbq>G/6Cfmb gm#jGZHTP$K8ٛK0#FO@`7gBLN`oCM{f0y/~O<ە+[תfj WMeHq6۪GRX"^(nͩՎJŨ Z\kZ102ta3oʷ߮Ξ4j;4+[$u9DS.'p (x;=!ڸhg2=ҩc:g؂z`:rs~r3<% ~1Db93;=xRw~ͱ@ׁ#Ŏ!˦!sKBAhw .1Vz}wBx5 ߑ;C~yҝԩq&d8C9E$5y"zzybv%=dPԋ]&xiv)c^* h#\ůu?׏?UmlxaYǝPK2Q yߵK-%snǖl6^/72gt0;QQ^ۮxBͩ*pߔNj4o}WsM =N+1EJԮ5̄}K6.p ׬~`Q@j9QQ ehlbtԃ2 k{z 8_2*,@#r\V=[<W|Y'm8>vc ҹ+f (k>n˙YVAۼK?H9KŐ^:Y}| PZaǷqo;p8XmV_ -+-YQ^͛WW!%kbte8 ^7+!ō(t2fȯ=Y{@fPP3c1+$cѹ+ڹ4Tn=8DJEvCP4 o{!(u2Pд 8 0Yti2{CD][oe0F^P_Q}hUt(}mu80ȣ6D+x캮ipD.W4N $צF b0ARG1:i>,Acyʱ_ IN}]BD?a"8aˇJ}% :|LÂFYTYӒL;R_\a(יY56NB(o} @h2n s'ADwoL;gQ]ўH.6 ɨ' {Cri"w+-$VK*18H"wק5Y+0b1Ix$k^:m~Cͣ,mj49ƴM.͋rNv?y2໒SMQ'ikV *%Mk(Od_mZ_r/PEn-λ'оc4$g8O?BW/!3؜!XR罌vLB- znYgRߖ*֍L`xҏPAqo;Gߎ;dҢZ7i*5`)ue{=NO4sws$[E.!6*&+BĤF?o& U/ Vz@ *:6m~)#lU>;([J%ۇRg*>?9pV-z]Euc/xf]P 1tA?tg`ktZrn *Ґ~@/dy"?PI c6>L 2歝0&&cPpcZ(.BB3^/n<"jk:ݪ.%`D݉~b_^?267 hIJ bC"8tbtpvY%igҷw,sGu>kYؠd< &@wO>0imTr_/\l`5zFX쾫RT2d(ej,iyVm89lr?ii2{ݵ݉R7>RTG{7#MLw=6_91GkAƾҲ_kVny0zW侀TU,}D *vL ro?LI~+1kDs>fww,ԫ .odwo:ulfC^~I% N]vy,D6*o+sJ5)D ɤdz夻P[GQ`>k!+au#9cKm49XaŒ5 c-vlruNjL2BdUʗLRZ5 rM31z$\Dt ̟VO|?~oA:PjF}E9.m= !HKQ'm{svt E{3cT"h&WW" LM.y@K/ fKt %1Á=EU"B%$>khxe#$G G-;:ܴzedϙpB 2E^~>"q^A_uBڦ($jK?TdJz aV6RtsNZ}2uN"#Řv{} |""*9 k|C4>Z n0V.V<4 m.u^xg6,k|>-W$F8;m_yA#A6=uw ~|tX*06B]QXEB͘llੁR䢿bTVresS5guIn=ڋMTv^q[2x/DOP#|"M̠B0WK /gd!tɫFp1}cȆ@FfQs|-/n&E.c|%q5b= 7p^h 7*[G~ LXь9F{zh8O@`.z{rQd6;X~_,R\N I-`/LvHBD!;MdG/ҁ# n2]:T(^;Z5DiV+ kWy0HBHgVVM^{\k 9q2 JV(VD,YF$֏?輦LPM [iycuQ`jA v~]DPEN ="4 y}kR ]0,*[idk*BYҳ* IKD0*9PTr5g}̈́vRsm)}bRY_|g jo O˰ez=0Bt G82r,##_ ;Ht2!CfYK:žst\Zb'^5%S,+wⷜHD-z6 /~{t 5_8eiP[=Nkm\Y,ӭ)\|@f)f#M5h(,)BSN<_Sw]\c],RT0GC6YD<ٵOoD3Vϩ-f[f,o&7MV7݆ ʜ,gr #sݞN7ȋ"_+ksPOLֈkSphHV. 0$v}K(,FՊ;co8Aѭܷfnt,b9Dg?GvГ~a_ә8um9"~Ov@*65t ٸ ght3Woj&Ѵ 0 &е>|ɝ5 qъ%V#ZD0ÌFo/} g_:϶X5Q@76~t"n7mZK Z#V[ ).K A Yfb䆅 Jaό/θՠlX\(zc}VB|hTw-mݣI½,Xfn0MX#uflfAwO)Q> wѾ1ws1-{L{_dOEߢ7&ΖgʂO2\Bk[YtgqY6Ye֮g|^rJvҗYJc0& SkbM Iȏ[ 34]:鋥W ~Gie h@~D*v̻{O#&p1A }۷uT;! ڤ5:J)X&qx}7!Ob9h,(IW#ɐ3SGks4&!\q=/Y|.w m#|>bhFCcSEÀ>+d`iF')D%6kI cߤZ%:<̪=y6V 9k_yb[#E*~ƕ$BE@:UBSs>&-`2U/ ޮo6ӴbSL1XT)tvAe :a+!ߪ^ԂVu_]e|V!LZɨF/69=%ڬ9ew+wD|7&aW[a(@3L&R5cɠw 4/BgG֒;Ա_o~Fgu2j0QXS)] oZq^k)3zp!g4d,fX1$F(M$^81"Ro3-(djbLFa0d*1Hk,'=X~3ІFK-JuY6x=Jj MOEl) ^[bɁ:O߾=jNIU;3{@Onzb8<8f֗mLqoyh|_y&C^>capqȊeǝy@*/ 4;(lȉFH:N涛6OZ>߻X W3B;mv&7p9F!Kecxh?b4\GS3{qVVO8Z&eeڸ;!il#D$ nd=Df^@KryN -ku ک9dpABU!FX>T.D0eؽ2̢Dޗ%рnɐG |#[팎"_ Rd7P:h4LK~giSYлU3[fF[X7(K嘆B*,l-eb#>QiKe ;8K p*0l:3( ܺQ6kjR;w3LKCf  E5'C |#K[q1L; d CvU0{ 9ccz v77O y|U&?~@Аbo( s2fJ8ZBxbR7?Kd;%=$!V?HWr9F]vmI|N#B~:X*j<7*ofp!Dӧ[`y4 waގO#؏\2Pk69WR"JS}7Tl2#9g:ikz@B3f6_=Pܬ-S!$f'fLlݠO:]G<49}}[nnX.jOu[kJE>!y?E*((^DGr׮[\р}V9f}zMـdc;f^sB"$'b~3āI\h=`Js-3#pʺ)W )wo'A zkg}Mԟ5?%p^0>7_oڞ=x,Hj'H!k`?s r{ \ t@.6j*L [q@AFM;MXj]Hɦ'6> դ)Ga5@iӫ\ |ļ'Z_"ecڄ 2|d3 |oPtD R V]-$r5J4Ģ˙ ݙ8*;g ׬=ĎLqkIS '#h.|µGL箫: 9x.ՍƵ7CERNZwe7C{8&+zl֮r_]+G*NӳWNT ;!l9`ec9B.(\ nh+gԌRAO" :6 QpT[mD\" e]þpoGry?b3+9 gXā3(o="w6)O^ \#:"Tb9 +AIO`U,"齻-GQܰ3(ZS+/E^QzEZS$Qj96)EΗ_]YRĶEK$J:LVzs*kE8ܣxPh8uI7k;HHpf|LAYˈlu};.9}eK륻_)JIP -R|Z,%RK5U:x HJ_ !e `P<s1D'|@#ۤf.QĪ"Z%% 1Sm0B⨮ }S'h7XIq 82"V0{;x<}noM۰߮pǹg Ćm;fcd\ZKUd n4C8B h4?Ұ<%: Zbt@^eΏU*5kTn f8 3)~+Dc{"gQfarwhr=ckj)q ){p/FhӍ%A kl'`!an-L{[J'A/_^J؜"XL8=??IfrbC u#t_Zb:c  @ۜѝƁï|1ɉ9 TeBYaC(ΒͰqkue9b!YL+O+9/ij[Zz k`lNM5*w#~uV{ط9kUԉ5%㿝GXxY$̤ ʯP}{TLTnvH'^DMtwWjھiGc{,`]So0Jlc/|" n6_4I6Ĵ=06v4h/#%ۘ H$v{簝+7 SΕ FdvQ{0iPus0«޽ɴV#;r uwtA6 }APlvtzv]FcOCowRhOn_-*o̘ؒqr-;7]!#WM఍wBw}.0ڣ_uǕs,mχڍtMH3DfaTͅl?°_z=^A 8䃦 LjЊFApr{˿3(a}qV9ŷHԥ7Ts1]x ^Z9B+fN@&P5T eiF9jrž9@VH>ۣ'_Du6fGdY忠a-}RDICb&<þeJ>4!r_P} QK4SIzkzbuGlݪBxA:kA&f-na'k(V]Ԧ֩@5`Ñ܍թJbVH! pPZ\A"\4| ֢p]HٙŠ0y}& A)GD}n/I[a=ǎ'fuC2S[)W/<;plDL|)$6ׅc\+]gC"^ 2]#p%߯O|m0 ϑ!n)>%'7Fr@j w;l΄wkşjj({1xai>` Nw@ԠW$Q GlVHvH tRg7H R5VwGWX I2Z`ݼ#mʱu{tpÌYZ%6n~Nd#߀+>R\ݗ짗~yodF2D37' + ޠQ<%LViFt~?O4gַgѽژYwp +5I/¹vݬ쾆\Vz*6%ahiT ϸ'ɵTVx %_;d>"= e ļ- g.71q4xL8#lY_DTl?"GT֞CK[vFIv3&nʹ3SKt>gVjv}cZyt+Y؟1._l_IP]~Z]*:e0yta 7N|M˧?Ц}0`YqOuQCAQ_ H2%#J}QL-n,4j̈́շT H!obU^/'+G@#5acܬV' wm AW6e<ì% k"&ӍUoLoH4Ơ`;G@ ?"ezN'[lc~d^5ӯfs̩k@cKp2ҷCeE c'js1Ҡ"B`di"FQ#+:?~+̿b 2:t9#*> t:whkicJtz?u 77mӒE|8ȌLJX=Ʊ\ p+c6AiG+0GmR>%tC0G? 蔙liNsDr ,#= q2; + 7zĭ #='T" leO@ W^,a ɏ Q :@C014m.|ڜvqM"iQ+Zܟ$ipiz96U;ROρzx5Ֆd+9Ji)>}uE[PhPɹ+9[HfKU:|,nB2Gݍ31D[N-CA-^[*z+BHFQzL tYiV'4ŜLxOˑ$-<ѕ?o| wc8g.+ gtyp$ ~%lުa# WE6LDNi|Pt_8 Tհ7)!H(0|v-<ߩnG|\| 1+>>$ϡגX`01'Mchg;J"EZJs:91Z/X5Ґ,ȐG`5mp`&–) 箴fpvO# ֆݜ#s5z5Dp)o ='r2ѺVxw)dJX_r 賊CP;$,DLl"V#~7R8*,ۙ z$eqDM`Si\z{#{IzȂUA~. C$I ]G-|}A9Mqtay'j2Y9+9Gr VtD w^ 7LMn[CM uk7J,0h]»]"W yyAeSܕJ!gl|;*o-y}\=\MґLώyeb=Orl#ӷ(?18W&e+@Z&_;wfkB(&aISr y*#'YbyD*˨.w쫇f2bͰ 0ѳ ᯢiWx11{pƥ#}6&TTeΣܢGnڶ}CJ1,]Muw&];`ްYIϝ҈#~!٦(a\[]Lܩ~h/S7fvO)o= 8xᨸ 0`+IJ[;?s:$ɹQuё ~<- XBـM3Otw=6|o) 3}n!e:_:3@n`lQt*fW4I"U`{jTF(d]kAh#H?y[~;任]` %f/[gWOaVۖ0.-#g:?+ˤ,ax-68jcTyh i<{%I/Q\sAJh8uMͱ}'QKu w1ҫF.B]8^"<@6_;Ǜƛϲ0^i2pLaC6uԘ񗸤0`zyp }db+] &W%ttX%H}Kl Er/J'[]6̔1RURogW) PwV0^^E[cKnn4;2sԬ`qh\؁ZSNS|9hS`,he */Xgv^\ug~,܊s_ڤC"73,Ueeq"d*lY'l+c%J^$94[ԇoVg6?`=u0V!i,a0)t_ Џ1wIgOdwR"YwzC_./2e;_"l*}VBrL~R†`GO״f6q6)2~m}b9h;3UgAnw:9-+ZP`X)_/+_Ľ!M/J픋|mJ o} eW"fGQx@%S0;דuMzUM8q;gw؋l,. JpKL,x3/ky8^ 빹Ӭ#^X ؚU4r0&E]y{& =\5Jӝ$ q5Ώ&P-kI!LS ~ gw@硁J{jnx.3>nOY\Y9ߤDYq o8fWmba,H#B[ h#H3N~eN$Tr$[kϧ VjN2]'9+,# n3wΕ!UҍM2 7pZ5@_SrQǽCWe4WzxλwEZ1%hbKصȰN.u+@-ы0BŐ v QSu{Ҕ[,c|S&d284d(`hxYLθJljD|t}}C { N }YJvbOn", Lb)_: ]RO6cGNLB{hIW04,5!9<‡n Zu9QG{M؎^:S[@yz|]yƳpkY%Y@g8DpJrQđ -,+XǪXZO{mq>SMn&EXՄRC"q.x.n˓.`})#]iJZy0$oTX)a %^@w:3o|F !P-&aЧ]FY&Kb>A ҕ>}t,G@}"k(!Әbs< ʒ1jWhr/[S( u:vӢn2嘨SY-7\tmc DԪj`Ӝ/K8@Xr!X%f /IG˄e0"{'ƖM>mG"%qy+X,W*\§Rgkqv{VR*zM3Adcwi5ީM?qȞsrpY݈4H 600KN[x!*4~}Ɉqr|ҩ OOlHzk)|\. {Nw>" *o{\: M94ן0su\-mS ѡhN 0y.}r洔"MA8m^]&5fg/Ze7O!z;ۇ | n>AG^ad6CINV;jҿW>v~@Z tCp*JzcA-_'Y34X,aMx|Z9HNἶ^;k/%&<|b[ƚGحBrHvY88aڎ\l>XN[QyF AydC2M޾hS?|U새 aa+v@RRϷ3OG]5$eu+uwlfRpb@t՜AvH7j$rF>w|/RT%cͦ˷"%Xhp K{|ΞKKsXd Ly`*b$oD;K> oIIQь;6HX%hʨ&_yɏ0bhzaO?$SB0s$q 0]O+<Ad4H鲥jq\^fG)Pߴ _V ƀ(( 7k [S'OxFGV|sLKA*{tlīe.-N+Dwۥԁ4ds>SYaEm2b<kAcc٭D)ɂ9 M X<}O&E[d0c2r+za1HȮ7`NMLW8zRh P".SbJٴaSD3L7Ufy$QQK |\?)9|'LFw*GFbK:XX?zlo9Q?۹6,{~fg=@a{⭭0TFS#h~{g3gN˦gGF i]WN4rO( uNzn݉7l:G>Mms@ΗT`63]&Y't u-^C뮚# LI, F<8QX)| *R%Fb'KxưS#_+g)d(h$-d'Stt(fNoLy{0DLdiqXpTM"5 9fxuv ( L7۽]*q'+DUN3R2(rF~5)%!:y..p껡t9l HALaPPڕ'åb ZxԼ}ff;XYʩ4pv"2.Wt!%{gIPZ qGXU 3:5lNp/Zp9=Hn19>_*=\=.A˫ytqi0YU{;ͭL8Ciq{qKe<:q{Nc'*t%26<' AV}s]S J,oFb <^ 9Lw_gT>uhQAj? ,!4#H A aI oZT^{fߢ,Qi*eϮbJN) =AlK?gc(@V'/:9TB "\}HwL].$WĹrO4pc.D@jm'hkfrp`'5)y(}9ʸ7< f$F zZ~b{>7(chtt=2V}6! Aj*vIL: N[K"U"))a2{72EY g͏8 yw{3"sa>b zh)Z:[ϡYQM 1Ҵrj`Dn0pFiGe2[Y2/,҃tn@q5wUF\!E´PUUfZ$-_StYf@Lt5wa5gw VZ*Ah'q,GT@gGLb)J%[ˮhW0{LQw3!M>1;*^E`&$us߈(FDeD_;)dU<Xխ":/1 29@ u~!U\Qv0<# ` ys>P|'ɿ A|4u F@ՠGWS|Bs6Z |55 *?Cwx}ؼ8ȆbG̨JuC(&i_k<cqցZ`Zf`W?b>ucS& UE٠yF"1B'F>AԊMX7K)֞ #7RX9δ~eylˋb_4' v(W>gHGrYq+*Z~z0kT 8Bɧ\bڰz,?^q})CȁJmKfB=Ap&FdCy ZG2_KD0NwsQH0G7E<\~@ƴLRrgѱoq88ӱul*@JV(C2'0jjG*zMNʛK#bHX]S2y'3gŞq~^'R^+_(HEX' Dy}FZv sHxq*<]4d]xf8/@Xq>SMzrSk}X.vt./OMh`LdSa1m8ŷW/3DsXuf뽡f#T̗]GuKtoIѾ#dm?Gܴ1}υ?xbB>wlԻ/eA.Dgo'󇋅 kr"ɬ)2FAvr)1J lP\O2ܠXFuTmFѻ[rpIW;~ZW߼DJ BX7dh]p%?'h +8M3Bl'-q CㅱAˢ0slX/&$/q"ud@m)_Yͻs? 8~.F@lh:dz^>G iqM99 mE\'Ru^zpF+L364L#SiRדZX%F@GvUt陣3I1 !TS,F%E*wf;1c\rȒӥ+#`IUB2'AV zO@b HKCҟk>dvNi) /2uvvyԛh7$XO72xݞ i>8I!*ϨQpq8 󣣍*2FY=W1mːtҽ?^*ERǙdY?h0o&Hiۗsz&nÑx_؞7 F?U J[~6Xjub>fqI;NA>BjUn&1l5D? x/͉gFg/ G{[7H)leA+ /~,UVr$lX| ;qlkt 9SؕέOD{Pv-$1T){sn:v&6vfV zRЄ`?I# 'P $"(P"rHW>*A" `je5 s4\j8F $:3K8}ENzj8XEw$ |FI:cz Ⱥ8{w2+Vo?mH 'ZWa8Goi( /!{_ľ*D -}qơ_k&kd17)Lj-1Vi1@'-GY>R\< T#1#K5Lo ͘T 2YNQ)lH~ 'm|5y+;?E#<`L-tXY>*#1]g$ qX}.e_xO Ch6*Y/UJ8g +&Hʆݓ]kW=+Ri C'4Abrxn:Oi"&;q:Mmk*#oBAtqHPdK(#dSE):=άKókvլ>?MwWHj0{.UEDS3).Y`"S^$+oGΠ8(g9/.a`'**}B*rn 6Y&w҂mELݵj=HFE'}QƜ¥ * ;taxI=/ ){ j8kJ6dB=Bi)l:`rY7("㽒v/~ 8n>#+1L1Ȧ`|}%d,\^9nR$H'PE.97ɮu%h{/'2KvSFo%C䅤:$&ދŋlX·X7L-9|-0v/ZNpp+މhq{?LG廻WPg?2ׁG\ITHR>ևp>D& `6i5r|y裒6=f7's6f']mx!z^J]کîa(}0g8I⬾"- ;"W$fSF/oyPDa-IZ:܊TL!fəD BVrI{ pnl Ʒa&[uMAڌq({1I cow]e&ҬUM(_+!럿Nߗ >Ƃ>]Tcz`N4e]RQCe}DQ+Κ`HSGn= bsWeTXC"L6F SI,K5 tF\݀A xCi7Gq[Ț\}ُA ZNWO;2,hJۃ7/cAmS1$y9diFHהPk>#o`ŀ~CA'ug.)@u!z@X1 119S8`]XzD Oӥ`W֞m٫Y|V ːgGej? G &B3+"0mCYG[૘ PYJw?Lktk6-ou8͓,Cw+Cu$36[i#L肭~pZ;\d0r(5NX3 Y Ð9)yL6R]Rž42)EgXfBݥdxXPrE)6$eoW{*6կ)naBO]3]teZY.Iw'i1ja7;yNl X}  9=YAx'$Amܫ _4"'EA_~B) ҅ѝ,xO?[Y28ݠ 7Si`m){%dW}_>/$韃DsIQƇ*X|XN!7xN<+؟ci-)1%n>5L*DVJeZȮwR}1Њ]>O {g w˕XᡈkK;`JX5_B ԁR)%MK;DR{]@dÈc^TJީZȚLI,}rՑS9.@V>@܀6"\Ww8x卫wA1 p4פϹS92Iƣ`(eB[9h҃,˝P" i9{&l++! |?z.WV"=8澏ckH,bz2]۱ j3>!Hlgzv\P0I?$dz93֌FA7ݿf(mze%(>LzOf.P6hwwD,:%iw<FJRBѡdnjQ{ċ4{z_F8D^itWMS4˭Tk ۟DI9 (y01͡j6Mwe, sLĆ o. {M-q+ozV8dh ]NI)_yT-#7_9 _Of#fx?#pcCnjk5r]g19E9=b6 A {ŤAϸoe&؁%qbmuEcbZE߿bHmogچ\[/_0␨gGpg$nTbV˭À.-D$pY3h3DQZFS I%1h iԢW3 $BAbcG WS!Z-yLhN -_v{jMSڅ9a8ol˪ ! OP~vLEqIPTu6P=ϳ`vT6|b  wq4L x#J/nۮ{7(*脤ȧ`w%:KYT'Ɨ;h"#'y<1PͶ׀c6B^pU%}k'Ù'A!GΰC`C(ݓLyD}U'6;BDQ +)ko=;niʏemTl47C񂾝p%P]Ld lM5x렀6"FxEsb^M)9kN1e;,GUs1Q2bibZ]F258W%tyZn#xkT t;zW f@ԝMŲFer5G>i9OwQ6px".hl ҥC'$jĉ{;ZpdqAؽȱbxJo,w.&娤S۽ğ'tJoW2ϡE&x3c% ]εµ+#I+Dh:i }b8Hz{B`;Ir[4 _ܪXm~5ؓ`!GXSBE.! I6sh;&jeeRS;2amwˆ$-xGh[2B*Fت}wA*#4}2^t5:h og)]#R 7`&ʏ Y[B.v!2ԗ$ u%S/!rXƒ4Pb"{3@CY7JR bb[,rBp%!GHC5g֯ A'fU ԣr#t*rvEUX:piQ+!@U|TW2 x% AC~Eb<@i1.E?u 8MhЈ }ި"P^Tj+p?q=uM=UN*6P7 ߘ' '<{ppXv> m8} =ɋ!˯Y'H 7KU[gqg9l'(PG+9#Rܜ2QBE 3UϤ!QrMӇhvDS럨9u'PL}2sFLE(ӕg8Jb=CL(p@"'*銸l2[%0Rf?`B-/ɩO9YDIhu}]/DV%fB }wj{8RHpp-Zɰxn=U\wD[**h"5-[I0|,n  g"@SP;0B<&NH[Ϛ%t+4K7mh&L10`;ttl3W);o^|xm ь&ADz> ZPW!_z22j@ƫT 7#5FfՈ ǚ/ &U.D?+x:æ6ܹ s8};:| +-ِjߏOeRecT;pdX窟(8}4:}c|6N ޢ.h"b7Vk&e}*w ;ܪ^(j1FKkNƎ3  Zg~\hG! &`&hY;|߈fzۓ/qAFXT6ߏ,Mꩂ ɻAulnmpOW;Sl=sOj\7(^"ѴZy#@W/3T癢P+2; OEIxwT1E#<3v ^O~|3#; =TqE[*{v(/WiK>Ϡ[ L4-At@]TIrR:yxOL/R3)x"TF7hzޠf,)p=m܏ѠET9BqV ^{8:k|nhƒt R<,TWQ3u!}t2`IgS$)bT8Xr*0?1V|0yae987XVz6Jb\ˠRB86'9.w! &k#RRb)y9 566$dgh ?0=D~lDa/>"^]/.q=Zʘ09b &?j\|I!(1zv]dC vΘ(/3?faᒺ NJgѪ<-M(ɸ3|԰҅ORLv_ a<4vkJ}BXp-[&q+f~'")_;Rx8 0nªASBYr2sY*+TZQ5=G"/`$+!f$4}P!]o"Rm$6ȳf#H!d͕~򪲤#G8G* !RPL%Xƍh 8tp*Ѕr~-`u ?Wg7Ő=cohzw&"+5>8f. ޺VpzBHN{wnic_&%(_|mF3ύ, kAc42[ON:B0Ald;?9!>c0kO[ySفvEIfprs76YeYc2Y y7( K烤ʳйEZH?lӧ8ʁkUb&7o ekS0y6ަ7s*68'$Iw:ŭe 4ޱWb 3/qiyhZ9Hn+yPϿ_`:1QcLMxD>5CiaBF)&s@AA1 ,ӽ.*u|k/nt*$WXXX`Xq( 6wy~w=,9%QJ~7  D;:v0T)r8GבDzn3lԁBڅ9_ȕo=:3/:ݪhR,j+wq1>B0cA]egQM('f#iB}RF4Vg2S}Fl,~ر%,3cr`s'jhiWjBoa 7_+T/,WJw`y:ew%DIWs "2G"s*6nl7P MpbC}2K"+t^ڟBiג#owt{qCp83=L&tDJjd=6l3C]9 >xSև]‰]dp}HjX'!yt3U6yz8\$۔tRӯ P*qiϿ3jlscŋ3Xxqfw%%IFum)]4N%DyR٘utdȮ](1&r1%rDp&iMIG/\l<ϋ*]vDeQ$/f\}"lwY ˜]MԎ<'-eV M,R='D)o[9W soCfb61?yIoa1.qsIiҹp?1Uaa2+ Hu 01@"ցݼ';]ƢL<\}) 1t%C c@sxk2*Dfx]qYzɌ:q'_U;e?QVh}%m^Bv> tipZ)rk>(=Ag{^";5n{s5B^nj4>T3YMUޏSvݏ`,W"NLf:lk?_%ɿ&+WTn w|+X8(UlɄfGoA^`)fkߘmX|;2{ 29؆-z V>͊ o0{W"4o#zS'a {s.iIE.%Q[8Nkd9.-zա6^`$R^t]\׬\H֝)h%? 5\$9o+ FH&}5p1F:u ʌ5A?4,IksOwa#>QYi^'6^1w99^V{| L۩CeIȱyu(\LW[ MvDn-}ڥ9({P2VX Raē4=.T⵭)k5k y>JCY 0`TP{ɬb~ y|'".MO&ƺNTͬ'dz7J\<=>@3@?pg7Cor4Նwy3+n!eM!4.%C~жg#^N•+d3Uai׳QW7C L/t-Ҙ9UM{P 7MPe%5a#1G,Lc"p"5r6‚f]N_ރ~B} L4+'9s& 4o՘J74~s?:87c ;ZbbaäWY M|UXrjvƚd}lQqqCE++.VWi6k(fܙB-uE\ՁCp-wLhzwžW/Cl'Ѫx7Չ)*XYmѭ!^O#,uN,5cRG=s<P%d ;1]It>y-G O1{lJC]NHWkO+Dc p2[ЊdImOoj~ll$Bļ{Wt(WJÕVx>u#nNy(+b}AJv}LJ32d2ϊPxo}&/}qk'0JzCYk>,5b,WZy0+]h68Ne!{nSh/Js*gk)a¶{lXz ,WfuxUfG,^r23FyBATk(q8uZE -vϕdHPSPWݲě ?`?hE 0ubr |Zj1:ib}X "O8W!3 1F˶-SD9=}Ȁi"/mwLrlv1ql9|b'ۣQ\s*[9 ߷8Lz8/IF*>Q8B;+O )y, kņYe}Y A< f}\ NXG03 ȮEإxvWXs'yoLʅ Z(?eD/K7c,DF?E(8A911m1B?] m-o [90[?0?P{xoyo)HG~YM4= p~ |I𺁩" Yg$K}?I,^MzN!jT>THm)35x8a+(Q 00A1b1OBLyփ}'h[o$b E|v)j0\;|}AUk/Ig$ti;~- j)0.#Mt| dR)YE/ mLhBaTcTǺi!R1uMznh Q\ȐT1;-a/f8aj63 8( MPxylUc LsuO}>ȕ$LL:~њQ#Xq2 }'DtoA$o8gf.t Ƀkp41]4j ZǠ 6~Ft7cfl2Tk5},BU`f_: !ABBX/4֯#~GG&DrSsv2-\6 ?(8uES]NoR\#Uch:@cS<#qt}@ A_2/qHeWƷTLBʪm"+̵qУ5"Xe/9_L1z+;Q.jP xJ^U5kp dYڢ,c|Jĸxazʸ[Io![$iԝ ld3 5AOά87hO]<+`JTkq>aK=ޑ7jvBp!R!Rbt0e[6}qv瘛ML2t("7vgm75[vFM2\K )\NOė]թүL.Y􄁸{Z+JUn m˕Chs}M!VUQn%>vd|$3aK;ll;_ ; E4WBaŻYKtdVX/UP6F&KCկ !>2( ͝TeN+s}i2JL{O Er<\#;Be}46z#:܆f4ѠQ/? i,Y@kx_x-Bfy;4ұP2%׊//HIS+O1sZ*_ J'FB?MriÿTa#ua=FdR~OIa7GM7'#lfRӵMKOϒhl`#.e?wP/28C6o+e@ڥoZDIS%3ywVSO~/(.C8ܣ}~Ny%֍mq,ZG>&q/t%#a>x9ī{Dr~tI/!l܁Y9v--Ýq8x^E>= 㭣`Up19&@͓>mƕ2;VV*+YM/`"O8(sd˰9G}cXՓUn@ؽ=sæ{̈6~[C{ߙ7|lyBʨC';^ ͂@voʎ|m.If1\J$1M8Y\=n::|mmJohP)B! ϴozi%-A E~l/GZp ݰA)%[]\cD֡ڡg5'ķY `WߎN|r YYt}V)p%%`A#V h(S/B7nKn$^͐oKTsF,1 tEz0V?kqϭC ?`JjR@[L<(F8iI9\OKhereL٩`p:%Bz ^+tVi yi):Q;~[ "g5˥^Cy h #PB)M`%jM`#1QW} Ơk+.;٭F(k&[yTc"BkA^Y%ӜB c4޳~̧:>f{>J[CxɄuJLG"mVoj7e\y,ۣќޡ:5!Jݤ @y̾tI>tKلż7: y#7d _}I=NLox&%o).n2&?ax: ?0n߸W[ANӂoW 5}Na7z'|큳1wAS|ptR]AFS\e\ՌQBAgŖu>ѹ`ԛ8=|]f T&oqI߮:X먩GM;SVx4mQ|(VK2]$Ġ #:b}y:\IoeR1ߵmCEV*C?Zbo7*w鲘O;Ql,tBE';`L+D7~7q2?1P~KTBM oue:/p%h0x֊@/^n][3Hܪ y/ή[ AUeOM>l'F->{Qo;[nyE7h! +7F4Qڴ('|̃{][(<e.,8?G<;eV\d"AqRգ2Qa2ŗkk*zOR.*:)13K]頋nT6(1y&zapm_2% < ѨǟxhAO헳sTI7(ObhƮ Mq%Q1=*(K$0N_-4osY$1-%@1juzHخ|Rٿ}H6V??~5 qy~VcnC6rq\xD 62\@Qn ^͆(''&MyFRn[Q4oDcMQH'f-&F:#>Ǒ AW\`ґg^(V8.VH,vݡ/ ga"`oNW>v^J9C9jj4zG49TV9KA}#@0 -)xputP7 D>GV5G`R0jx:'3䣾Ѵra]C̎ =Ћ >yG:b|\ܼZL.ҪH9.E^&RlމqYc6s3a6 YP>[#͜,Xm,-x qi)s[*J&wq;M+ -<{$(uGt T/!(O BR}&bgk(M]vpx4|%nݱ Ƚ+WBbi-OPD}AF^T3Xpȣxw@࿗qCllj]v}m[3/Q2RZ>Ϻ}φy kpDE?} Mc7*B.<Q΢?ο n4FYIu>XyPDCuʅa xj'GP: ,g凗΀,JˆY.FKi ⻪-*띒R|Pw%@BJ,;Lt't\~OD>vWz''ΧJ5R$;Ds[B@]D@K_)0I!*]`j¢'՗/-N[쿍86&~OI.瀋Յ78"5l]J1YmB$X816k%/W+N ęX귵"c}}?"n ;Uφ@LOV;/x7)faJij<hyPcBΡV@8HH`Ϟ g((֭@rFi&c; ŘjT"K76~+@n6}T2zX utEqf?c2jǃߦ#Sm7zP~QA;0w(PKco2;& %jsg:NhUyTy{-bSƕ9X?pCtf%ae cS;o|M njԫ\kX.(A6n?F~r< .KF^Q,aWkNf/*)+' IXyKkE8\ {@.ĩ].TLc"A¥ϙk]vЪ%ꗀBs2rH~j h# ;qj6<%u]triѭ ݉7gKM2 H1O2x1ؾ6df0v,5 ܉}"G.|ç:H]:Ei.ٕjYqR A}_RtlR"Sv㤷~rmY-+RUp1bmOx;'@; RI/M\t_n_9\\=LTeM݊Kq,^PO u5]C1#FUmGiRD~|igTZk{TUOh0xpfpJh/48=8Bn|L@տ lrI}ַ2݄4c&>.X"P<|k 6I{#tźtzQT[dxJ-Osp~ykoznbTZ ?/jt.Da3;PA7RKůUs \F]_o6w.>L#<^K ^˵΀}ΣZӘHN/kr 4?)gb?}*jx7/~/i~h M@V.l,sIX&{t/NLcooG"Ҟg;aƵN41nZhZ",S*7hAo]U(b*boSiyGGckeVR Ż%(\8a3k\=ƀoWu^*,Fe.jG=THH7$`z݊nRu΅I]0RgxJPo!4E3?t˛ˉw2ӑK7LBUAb|%[1( =k؆=h+%o`u7I6KmR_Vn5{0w6#Ĝ{21#cbv+iߡ>Sݞ yfcZRDoA^ ,|ppw$, TÚ2gj~?y 4AI*3 L'&kvߥ\ue *_mX>sܛ'YF7y]doWpwrNly m8bSqM“JU?}2:}3KF v\E*z0zK#kVS4W`aS"( ]oJ"]+N  ru5wb\R:^ p/ͩ\h2cM1хIY㖂:Χv؀6t Q(qQkA?^SͲ׈Ϟ#bʴұ۞v7tQ^Lx#h\bxz_"NJ; I}v'ʣ?cެCiM=;>&R~oH[*"FY)nPs[.q.jhM=ҩbel{*5 TV?͒q;u inП1. 3(?YS!EtnpLCh3VՀuA=B(E0ӆJ n>wh"z;#' 0!+zr:>!a붢cNR0,d66y*shbIIwJ }1]yh\f}fcSO aJXl3H k`'zsP*JU׽JkUhnufNUR}昏z=ěyٺWPݕtTA ̈́ap" .k fS?<bّFI2x[NU. &FCƭzʪC1( y7Ɩ}|8A7s|թtABO[ tx;G'o'ź 3DTcIGoyې?2˘%7hr )%»X+ǷQq?,m ^S tHy@GSx-V(l<ײQ8{gSUaHuA&K fz+M6>R:< q*V{HgAʹ= TCW4Tʰc, KIg=;A7 *IeU۹c<8v{*ӕ2>/j^F1uq-sWxQh?o7r-wX;BL$`*յ 0/_, ךmlzo ^sk0ajy-Ve?؞ݔy n2H=ة1$9jR+7S: Q#XMу»̦1Ա%6C"jFr7J'foOu!܇w@|q_Oy=M3̤.6$tQǯk JMܩK:5n/Cz5 N< u5wb–m1kr &lF?"2I3y Y`Nꉌldx:  |u8i;}Qa)s/-H{kH$c 6cC~%TSC M!9!9L$zD:) `;ܔI1o6^U = Wύ 5CנV+Nx˛C@eTF=.sc8Xߺ.`K Uk1?ʳmFI98(:f B<jL5a$9IqKҳ*+NƼ.$˥SJRMhNu?m\ _x:HXa7G_'Uho,OUޮ/j5œb@6cj /څK3 1pM sA݌/Dhr:3{z#QEMb%0۵@ 10X9%^q< 9uU,ƀ\pKZaTv=_be$&T€MxZ!vŒe5MۼPs Z~``ta4$_4n2 ~Y#K>\;ttUǯӞ-9iuO/:#ARb0{Z@sH݂^<|צkmeAA,,;b(Q=N0Y/˖Q/MP1 .AҨg+Kb4.Ʋ sI(Ȫoԏ ݲ-$=ޢN?1PC3z!9ˀ \*PF4^zErP=fHiS46ʛƬbTAocYz#eHsO×p/H0A+|&+2tq/gB"dƲC+\1T4ƊT-S^5#*yў_E1&hBTd> TaPyn$wzWL4Sst~I<$l^,%X3~i( Mf8 g~/@`OGfH ]3b TfXQ-.X\K0݋UE8RxkK|WFl%qk&S7mE3^:Mq4?:'lV>6}hKfi:jKspN,|ј* Ljxxpfdy~6fm}\uD6zld h4bƀ7AP0$8o(mdؑm4CNޱaE/Cӯvhu v?^ښ:趏/iD>ѯfkM7KD$)aFS+8&sf".LT;%6ȩf{;dgrוJ=h% qkWBԜ^2aމg;,jD? ɠٰ| 4H&O/@.hmsR5?DTq 'ّH6yo%dlzߙ2_|&δTRه#?'MBN5I8Pv-+oeJJ5))DwDhԞ5`O:?DemH2K SK\G }ǴtmMi4 Kc]p ֬F-3"K7,6e}@G!S(,% i؁$AbEՍC%z9$Hֵd㪁’5G;ZQ3#_1UdwgXs!xdG/F(.^کRFl{jis$m|7m-dS9z1{[5[V䑸i.55cNȜ/:U*^kdGH* ܆ 4-cR}[cQ ""!@AYþT%h9>(IjK1-bT?6zW TѼ}EbIWe > NұBn9:6;1j6,>(ZOWaq^e/Тm&vSWYg]TZ]U.so8PK W1XwpblΤ0e- 'lզt&OE+n'.ޖ9:)?]3`Q_nl7.,y*p䓤xy[q6DulN=VAs#@yXI^CKnwtJ-?$o.mED)hZ#"%]Ů($UH|R<"&˫~S\B hQ^F]^5fpXʚ?Y {%fd"pZڟO99wLoRڗ7Ry}3UϪt\/UhXȘ8NPZ zW℃3}y0 O}D3L{Vjȯ`W)#-%2\Yǔ*Rm$fKExԻs,YAZZ9mlvc<%V2ye0F)%Lvf t;CL#IE-2;>}<^Hf06U:@6Pْҵ*ZmEө2)-T (nho +EԚBR7JxOIF04 z#r꟨{{1jG\@ uOرj0FNh]&:HF@9{C+w'2-,V;ZROlrbǁa!AD}ck gT|CA,ZL9^Zm(-(Ӻ5X=Ew[ܒ¦x5h0wH)l] 6{r4"jvLшX$)׮\= [kL"U7J3ql|Gu6܋?QYg&dB*QNT#7f@D!ƠQA1'/a1uo8?xnBۅák#/9qO&^}'%)A%P DTabR8 \I#hR\7+jf&57QCF&y8@rc(:DG98|YЄdԜ%AA~`R캉޷%Q,H:ǖVsF${R&\H=c;C=9$L8>҄dbS"ûr3hYA`Y8eW84kHS;O_'[MLRU=^{Q4%ZĔA pG7'͉6qiVDu0EG~t_n[S/6ջMaH/@S*@+Jv唅Ė̟FX㡧{\b r'z+PRnѸdXr'V0w Hō/}C .gY_q\gq:Ş DnG%HRb1 {pEA$Jw9LoaѨ83wPX|ι, J]#Z-$M>&KS#v+ lN*ebd۳Oh,}ΜSWn&h *?&&K8 zL_OnK*Jf]x{KӉ\@K̜Ia_nAfXVL3&s^xKˬth9KC'v-t[ῙDG Ob*8Y{6 3GU^Wt3K |vDj<Ub?h[[7b8 eXPf.0^ZP$bkgDJ?/)TގP!:pRC 66c4aFd'?!M@EL= [p2( 5Vg&xx!JMoS_+duǗGAlD$j4%U~2:Yx]T_R3YzGp܄E\mϊP㑽b{Jq8p)ˆ3-f4:JGp-/"HA yGo?V`^Vf_喾ҽOb?@ }@__z/<:xq.r6f lПKb#-*w^m5+VD(G`^'cSN:7 ~pA/cJzlSI~D0@d"K_l%7շtE`[%\O=LwiT1Tҥ5eŋX)vttAY^eeXW1յ^1.C\L!`ҜgFAJј]r08=/l oN9cDhL+|$aFe͹ qܤJ2sAkǘ^*Ox~gЖ)A8 ?eo>C5S108i=r<Ĕx]/ʁu.SR IJ x7}d2Ч-݌WB :ʔy)A^y w0KYɟԈD#; ^yhdCfVat߹;@#q4b<{g![>t0hfL)6`&+yc7m7i'orx˚:( &;AlźƟ꾅>Sl'mTˢ]wjP]Ie}M 9?~ku{~4>IVY^q$w_4mZ5!UN`uZ<Mp}M~}S6-_g[ ̑ Ԃ;*z Ha /]}[0HqE?kOYƼ(iKIhM EX]cL-pn _&%fF^2>6ҀNՒ6^NR1>DIIJ/AE?c0&k~vMy^Jow㜊xfm8lAzR- N[=} JIrs G@AsP$J |';>[ַ 5RПkƇUz ډoD#묓,ʁRIYukj0bbzn-*BxNV;3cVR2]bįisLIJp/ YjAw4اѩj'+tpfz?L(Ei#7Af>cВ=hxѧitk[W;%Z9g#!S.*h.P(*q@Ն(`^+bosiW\N)R"L>d'^ow[oP6!2Zb2 J _O39p-!Qdnk[T'2ʒ. w.}yh@wYԛ=kǗpNgNɶX"(µj"Uh[jP5:b ܠ$jCŚ6o膁BMrLk'Fwza8 ]m-/3,  %y7[cL<}jSE}SHxd.ugl "t"qX`꨺o+=`01+D,3F8tr1mt{h)RK|[0Mwa (]+ P&wn5Fsٰ`'wL\.+x&ʹ+'08.w,\2wxʯ_)[,}X׼SBKHlÅnUY 3D_ \c< :/JF-\eWGqQcz >zgpk:-rYpF 3wHI-a`JU?qyiOkiʄA+1M\,$FO! %`GCRB4]{M @iYa h7P g|t-ZBkPNU#sfv3ݍ M-*}34ˢUQa̛_lm,`х_֥NQ/bÏ+9s;8c <an7->D[T4.YHMVƋ~ž˂5 GIAIRNQDвv ї^_B΃$$hFԔ`u$9q>o4=2[{˜P$A/5Կ&"83or 884,Ex㬷!]b0^?;'y00+ KȔ`~Cb 5bBПλI1+]U'EX>]0-17$bZ$ɹ1r1#!b>!_JtL }Zzdբb.3C?f% fw wTdܼd{l9az(fZąNV^Ox x G#1ͭcM.z" 1ˢob͍ JA:'\R]f]O,ZUu4Q o{ ,br }'\~ صXFk7U|fgh մk k#= dz`k-Kc5z|x98'AYQn[ wD,:-S>61J*8-TpWtF@7[ٽƩ<`L>=F- O-BjѪʬ:S}S!#*P#c +O܊֗b{V5|{$%V. 5Ұ 5yίH^fQdaW&LRJAL֙J,sU_5?+(KA^9e|*"¨|| x30A#H#Xc=#*;?޻XP81x+}Ze[gTx5 `FAة/Q˗@PKˡLRv 6u.G;tASk'}yj 6ΛE-K~|^(DӦR^ ^c.ͤ:`>Kx)'a1~[׊˞weח>,*2w0}v F!}@FaT p30Jll" (h῾lk#eO2VAiW"ɨ+g QhA5$Gɂ*-:?  ;o d jK/a]B0?8ͳh4&g{QRqcgbN//,SZqX8+4E Ȓm2G8|"JaHq ?wˠ-jh{UW@\"e%*F0:U?cuҢ׵m]Jx7`c` Fkl*u CƦjؓH[w=NT/FRSB ޼W=;2DQ &Zc)[ڻ1Uk(RQ%i~uigZw O?Rex޷~"M'-^hzUrsCeܪ[Ἶwld_*M!rs6L&:T3xW]8HAR{oQ33 -$M4^b^)@=,;38*Fܢ R_uyڡϒ>ί n. eŖyrÁuS0]/^Y|vӹYFnV 0mתa#9UMVn2ӵ}67`9+9}hu'9C[fNpioxr9Cb~(;m*GϊËrه [m–h,a+ӌ'癳-s<[Ay)p :hܷ)5ZT 1^F<5q"R 4U Åϻ=\lmC2G\! o῏h@]͘Nr6=|t9hB Y |X#ҋ40ARWtzwQq T2?>k=3me8]-Sah$8?N ^J {^ ugҳD]?֧3鱺XW1?{|jxXK[}i.9&)Pa+$8Sb獃dtA0Pkf#+;?nF@_wQm:%cJ|+E[ۥrF7H6v䰜WǵJwc( $R<lv oBboEĵԊ@v]:[(Sϩ^H}Zsɾ347&RBR912֫Up//HFjHiЋxG& Qd_].?nШ 䁞[8}uC}`ZJ y 4ڢyxJj쮘IF5vN6D^_:,Q:,݈)-;:-WiZ`Db x.{Q3֖vȕ7 =GK抩0ƋN81˭- LseGT2y8#*-)wG,C#Fe)_6[Xp+fR>44fEu =Ti?tO1k[ RK*?ryHø1D3awtc:= [{SK:Ә&_|P%uP 0!;~<1 u-&]Tcq%;%^9^\ōXLwKжPnwv>~*@<087OpْQ<+֗YyzeT/bD{HShz02(tW_sŮi_zX 9ZkF[OVф*=ap":Hc$E88vG/fZL.*cHGĨƒbJhۊ>{[1Z ;~V..FE/;C%kSƾUqق`Ķn*7m&-41h-__galS =b?Ќ˟q~EV/%2ZILXe;})1 *p8n,˪.bew@(}C5A+ąm1uw BR9IJTjc~ 2kf"K]uXJ} Tv1ΡYA|4Z(udv#Xj[7 6j=Z%p7@fs1=|RxHF;"#p / f``-fg6p%f~ T_;I,zDZ]20YS?6V"҅aXZc\w;Vڈmqk 56 Rlմ %1rR{|gASr-8ppĠQ0b?Zj䯢 3eS^;n oKK,(X bPDғ QƿOjF ̈́o1i*KJUfyGݑy$ s3ѪP!cZmP^W22oZR Uo!::2ʼ~1k?4,pn9Z+w u}s|ZJ_^qXçr/pI2"* eVO-C統 ݫOEVʨPN#|L;sەKhƜﭓ0iu6P ǟMf:L BS`h0L^Ev:N=4t@ xעb3 (:z|ǾD0fu=pĥNANt/H6wR!y57bvZ.%`4\q Mz{Lj2Wz\U<3jb!!D>A ķܰVƥŽN؀&u; Bg>YmXaF>Q'7]zaƯ F,*~uOD^bQJ 9A;`VQ+WLh?]umu._;ӐbާYG.AdC vX,*qR.e̻f鎺6h! yjfU³Xz˛1E7:ś "Ej~~&kw5헭< cmt[,5c@ݣ4+>C T~DK]Gt XVM|;v%FZ[3i&aߡŃQÅ8--J|FtuQeζHعuդ"Z~ *ljT}v 6tJҍYyޯcc@C x<{wC Т (DŽ#mϕUDl霕( aw5˛eCJ-eQ7FjYb3B%[H}(UHt(WuH jtaq2nImASUFr8 mUATN15HUWM-o At?7IG_&~3p!OBz|*.`P^@xĜ|$ѿ]ÚTYǪ(}I_$ vnw?O׌c܍v:uw('-GhSĭfڛ#ş:}.P3ct^6o@Y*rGBx ϚxlTn]<>q<@6Pm(yn"Q{?.^y7#>0tE@Ĉi|4ߏ {#0ApLo|`_QM-S';q\a7pchPߵ?}vqWʀ稜oːp]caTl;e`˅um<\-lu l4Y "Bs/}g A{RE}k-kqVO_tHw?1KU2\&InppcS,5|ÊMn=өf$Q0ŊHp4pgPC~qiWįg}LM5 ž9km| r/G(Ea̮㴅I%D}NKn1ZK=/*^[ 1nT|DG[¥鐆.k0zbnY-188+Y_->'NtMT꒔f f#Y1[ FΨ?ϔsv 423(*I!:ų:遵GD<~6 Wh(VC,*/Jɿ'Z Bg% A>EK\`*"Em6?u L!c0oI,G _kw0F*>6IXulLlmފ*ACF3 D̔2ϭ(ܥyTeE8eI  ѪsuSnqY)s4V~7$m$;2ע@ *V%cCu v- &qih8=u5S%1/-f!!2m%BjYڗXT&.\!<6 Xi]+$(JeQattX)P_E=b)]pDnqSQ2O-9G/P,|&F-#0) +2wc:&ѭ0:,Z]AFPշL'fBxA6q2X*L>K[n/4-9ɺvoZIbp MHZŲb\Ωg:AJ״ [. ~"Ea[wjg]jNWU\M8UvZ FrjDc7v+Ryrqfa9!k>y|Aw{_cxtbQI}-)ڱ2TLGTx \NJbQgX8b-4?ג:eG`7V7 8ctŢ孂h; V(nVp /-y.w*fL@FL, #F]VNAC*pH*$@(AW(  ШcqДqx;Ԣ\:#F@߇458aV:V6d ӗ%yیn]@`ʥjNsN1}l'O"Ų8`1=)G邚i`A14V-*чw7MZӦ&(KNO`eb!*&ʟ;{9nd<eWIU (ˆjRau+%Bj?u/Z'V5hS|FWY0/Йp/?RSu^ jts9-87r~Y)0}䆠0>~RE?p`rcBӷUl끆.8Rz#Ql!ώ0_2yq6?d|F"36)I&,2HzI+HU qZ.9Hg"&\9 s2kn3Z(,vM6&vlhTOSru;P\ uGPUJ~=Gė37g|pAFր,y],[rLq۵y 22e1⤂UR$~2B@bjH•a%i(`?$R>S?N;etZt|)6k8)ᖎ_xesZ\s.q=Q" & {U'bdlH aU(%?3fpN@_rj}pp 4-RO# =&kV^O"̛ RU >h^8R>lka#* E |.aQ,ǟV"59 s{o.۝OSQMZImo߀h7saN/k Br3 &+|#BS\xKBԏ7 DmxdXd]P)]tb*m(bAr0p܋淝gԐJ ׭5(= {N,`Q"RgUUQŋg:fzek]_%B|g68dNBbMV)ooaqgZa曡L2qZI[:bzL_ q҆k 9SIQ)b[1:%1R4/Ff[/^~\\Z?v'^xm ϛeg_ίjD⩰災ҲId/KF%%)6)u, Ot9f}aBwY=TI!Ûc8_&+gOsY"kK6 jL)=-ITQzlr-Li.-Cb6;Z%}k' GWͨvK)&$f&RG3.؆&DsGwN Y ޺äؿn( Ct+QP1Uņ]vc wiQ-#Av| io7tVe: e=u=yzYa[!-WEfZF!9fP gƭQ9Q1Fꈝ8el5LQBWkgB,^aS8sNh27ԅC> A+aW3ղzE W vْ51M{% 3Kq|ȟucV0!Т^D8Jm5p5$FVK%K%m j%3#CEܧ`UT.d.gԕ$_ʿ⾤x i8ݣ̧l ^ z )訐4Y9t#Lr 5TWOB@Y-2UL/,Bk }ф95"u:+I2SJ=7_Hp] "AL/}I"PSp!It-;]J]l^߱3>[hCW8>dsƒ?_rQ88 I͍S\j~ XYn2ZW#xؤAˁ͕fU]ŇdQVuB^u$la9 ]ҹ䬜6f dU:Mɒ5Va%I((%;eH*Nʄ4E~ls,н~SbʺPj"Xwzy bw2 }(͇׌ٖ1h UAXʕmGAۣ/ݕ~ny4j&=1<1&MO}(1KX]&t\gc D"wB02+?0:AVlTf` #7&6Euvii;&H|ϝ\R,9g3g9Zb#!?V=op4ZA2GH ؕ ̜"xqƪY]ZTZd6UaC.=+RE@۔^GfoyԔ?n39NR߀Rx8feYElnKBKBӪn7% \gC7Oo^#)c3㺧ojp Ȑz'Kk(O:dkB-qv[2-Ge:o>@K.O>Jc=Dv~_3%,qWDjj)"4 qf@9=D?^\eC|fzۋ"Ks@uB v﹫kض,ͥ0k;ḿ-a՝TWĎ6PdEn9BUh6&!ɓ!^\t 7 4Ж>ig*P`W9Ԟ*$/u`mϝ96S?n0y朹ܽhH x:nթ`cY6ԸF|aH^F>mHtQOQaÓ1=s[fj50xnpkGHI NYգSlUZS[bǖ )].8=O|? x,*ijd:~4?k ]Ld[plxOxϮ%AvqDž 2ҿ_⹉6Qxb[g 5(8Ui\zGpv5  A ۟ܙ%xIA{0eKN7½G"X3TVk%_B|ZAlkF _]Mf?a|IZڻie&gx?nN\g@#`wm>{M?S$/2NBZ@_ē܈]* XZY3u;"U .]Y;ld)[FcQ)߲9}X  UF` G?!DyRhPN<e:P@W„TNg,?ݞ֘L-Dϐɭ#Wvg8 E=$yg*B_"Fv}.^| ȔNs&eϥy]aSI`D:A ES持453J;wޗ1=0? 9sz툏x2 tW8@(| |)7an E1++q q#q$upr/+Xe*]KUvbT+ZMwIo.ϷB`.GW"8#ǁg*1Yդm)Ժ͋>/6y̢\<HڈCf]C qSL#nX իjd 뢨P>:G'%f@xy?\bTp1*7wohPTԳP)K')R_ˏä ɃV TTAe qys溇9 }#WKt$2 .Ka pJdKkSQ>9{>QeU}7Hau`{wYf'lC!S+SXbC,츀=AKC^,(nE% N011pTб!2tQaD%M uens.nS juqp=]XCbt Hz++ѐҦXꦁ$ય/35&LFt 7OZunab+Le|T-ߋ0KsDwufD0FJ<0H>p)4x@xX"XNWNDkQܗ_&A4ȓ㍩n u)p~PcQ;XuF߄Fma8dn9FUmRA%L$g'b G: 0oCk?._'O`*=ZGfyK_O)Pׁ}/35`KldaUQƀͯw$O!uҮz>qGY` vH#q[G0Tܓ?y4F`1},x77jÁ){8`OCR2${C#a8o$mJ|*9A܈,}ǐێ(|,AiabK)j4qV8Ց}?q]ղ)_! 0ϵ4y<x:݈<_}sQW/o çp47j{.Ѝz~v|YfdgExWuܴ_G/uL]SSៃ.#cG "ob/e>"#qdޱΪrǹO i)l}L`c\":]1%k1цZQ۫]Sv)2K΀TV!ZDZ!yP@YCU n@cb&63]Xf+b'`-)Eɳ#9 ,`S}M 3pLxu-uʃ'aܬ3e2XR̩p}{@&{yYl݉H$++fBL\ʵR|ʰ_d1 Bʻp׫cRXg4\h W=bABIB 3o*}l: Q~6wRV8q`A0 FD"ўE3BZş\1{Ue5;,'fZx  [g7T5Ȃt+ v0{[^wAo|"4j2rUbGfw(] );w/a3|&&ok(f}GGN0B`̎^Nu2۷aF0tKXw |!tRsā;'gҒLL}_x/NӸȕ#ňWGLXIQ繍»(~4l#7 ^I*LC)̋c=j1=6H!ccG[E_jkа0ևhrn!9uql)HHꙃN8ӲWWeF"TnL!5 kt(HkcN3Mx6$Ӎ<,kẴjmDŽYayGâ23Cz ~){js #|gj y1JdHn+`w45#m'յokWՀ+7gso5*ظO ؖ5zQ;dp]x_"W,|#DY4RI$+Vvk; 95'[ӧ/+Bt <30ܔ_SSVB A++Xz TR -oIyxYaj7,je[Oe|icJ(j}~)԰qp̙~7АhZq{/p°Md࡫'fq6)dѾai jWB8T\+:')A} z[ED:)[+i?^-Y6KjvinQ*mSl &a [cryZFUŌ;!2!j<D햡*ۅhJz>xyVxpPdc[Iϱ@}{`f < r`u[qS[Zus95N.p|fEoXD$o{zP偑cS2Ea$dD;UھVi?Zu.uX9H$FoҬ0 6Z2ؤp gFҎvn%0i;aMZXD/Y@[woxz{/\*n-MǬrz[җr& b[ ^3Vo>E[QZ듍a[v3aBD{DLKc*rpw Eqw5-Z[7'HTi͙s9飏 X?&)pU̲JM ?"'|MVHuj7sY,JbpSx}O@v ,߸TE%ٯjv?8:3NJ#E|Xi-D\XW r_I h-zoSs>MNr;&4 vwUдHDv7gڸ{B=QZf2g#5vSnzi:M;L)ڌ 3Cm}6'<my mvI >K6#{=s CmI_ h"7fBpv f {oY&i>29ؤRxzb K#eZ<sJס;iF 3䭊iɬ8#QG)r( nfKFd!A:[#Ա!әQ2I!&>̨ۖOTY#ZxYDSC0?R. \Z>蛡`SC~eU- Kb\ZQȁT& q!;JTX `s q+DWTlشϟ`.;}}?2nU9D 0gZlj͢=b݇V1l&<}%h|N-r DnZpcS5[U]\ MR֞8ElbU]g1uS^kz>p7{\ *?aZYBxu9ti+q([5wPB~ps5@;;̳V#vxc3zU5<[2V/`9 [\̱8w'i{,<[^zq3,2{jヰioY.NU8i9^Do^t#SE)klJ0ʆ֮LRw/ swSC§Z a)xv^P=s"580ȿq EqkGjdԄהvg여A 2VvEk\ٗKFCT6bJӄdfm\SPI,0MaQ)#+c; לίET5Q*wv-@Ν5O)[^۞ Y%V\&A1,j) #Drn,sY;Z6XzNwC;Qv,8I)˳ėVm+ŅyPp bZ]`H\'_Dt]1kTi鈆1w8dSx/؞V@q,9W-bUM&w* 虠q)wn߿!E%)9 S^CDw?1ӌYUN4* [rJcFs_6V/fu*>cJsR#Т%_}! NiKu#?4MҀ%K-Zȵ+$xq~p1s>) +am>0 %\WRh.1-7=ޓo,byMgY|A`ƿԄrJh~,Wl_*N W Y-D_I>m7ɖTPP1ǰ%|O B[9 [;=[1oge=߶i(iAZoEj {yF$T|B 3CyMCϣ#l&ct,5KŏM hx۔Br톧ʭ&"NBLӱ+1;\x1#v!/Dr 0uWKњY=&sjO#,L2@h-VSVx|Dg@s;Yryo=<2ÓLO$tIL3wSW㣾`)Vj6P_fhuVdG TS[WM^EJnK`H(|U֠4T8R kݑ*Z?: Hؕѕ=4jcXo'@5j%D\T-.#~r8T.GQ>މ[*1 ٌϲF7:iyDzQygWѧ-x l[n> kl%,=~kh?'RxPN_w݇ؓc+.q G.2X!ajv(-w.Q{_pynXZ<ӿ+Փ_Ҕ!P5Pr@6G?ı7sx>[}~jBeh:ylײi[GcUF7r?k=_~~rxX̣eiH$$}XG'f c*R9蔛^"t[̈.(5/*_P!W~|mhNީ6C-e` &R3m⤬ɭ!;)k1CwkRޥx s~Ų <pYؖnim27iPَm_.SHtMc/ z-F$P|l=Hld3À 2ܔV\ fTYztv Hxr>GqPkFcDӉ+QC nu/~"{2Sng9O"捆N>&KZUmR1p{X<5_:B- Ѝ3~稃3 s~|DCPeK>'X4"V(GeAy_?ԯXMܫ߾w4"Mեi`gbCCM FX7DT[Bq4%hzUb*f{Szue$,-g]Vy61ts׆S "\˚(rR1ˈ}ᾁ-bQ&%Rȸ7oOWO0u&P< S%rgzB0Dob)"Nu:'[V1GHk_ 1NkE\1PKՃ i_+$csUj΂]/No|qaQH31OݜLdQ dR+"$kKۈQjtKzXݲ|i]+V) G:VM=,kMԏRɑ~.[oOw#Y$<}"{I_Iby]6AHծbVe#T4A59KXR*z$%RDpg1>O+}Z@L; ^ױǍ%#S,m`Uͣa'*bphJxK|5ݝxJ|umS21zH' W êOv1A\R]:fHWy‡5P y3-YZ {M&C /-;Hxqb8) l1y2Qç.7yh@ހqXf?ڧ3T`_-?{ JkFWq.9AAuzY%BKj8rX-6wk\ zH*jˉ{e|={LM4B: DM^SlS)KF Ty o'(l˅ w7(kXY })81684c;՚E;x85l#EUC`5zgX%NГ3(<26U<<*B/ JϥkrAj&Sg4{%\(.\pSa P3Rnrθ5&C̀vl>pu lJm('\A*d!b; 1pC*=ôK'שЧQ0=qD970k);sBS]K\PO0H' ACsrS?Ǿ:yަ-RY6_14sWqn58ǦU\јN,ŰmԚ~WP uDJaegMyjjouW&M]2dv.AI2!V>>n?h &wU+8 ɷȼƸRCv!돪_$|;w|uQ-JҧeNcpI+&\%e6r&bpGLDGBQ˺ʼnG9&oh#*71UXD2';~2b!WDwOQ!:ݓZ)W"w<.ë9)gFթ*:δF*! J,dwr9-}JaMec]1e~*+aD4/|s1 4OMj:Q^4C?a=J˨ބOPpW!̻r3a|]Opà ?',u$w(?~Rrb5}-[L7v߈EO7cǗU1)ސigv9*mOJ+Zbʠe`2>Dt̶M6_gbY٥3{ t7D0ӆbci!~O?nӨZJx>ְ*7kR#el*ʁeMJ߳,2ͻeh~3rkQqQT `XE%ruļ@:<(4 vA@1 Js o9| pRiݳ3v.B|ќ/{ =Y䔰>cծݫ,4ߪ_{RRQm"Sﰴhb(1\~`2+a.W>=M#`T$ QjfƟ;Qbq/-QP O7=CYDzh 乕TCj<9 N>N mv>n(U%s6+Zԣ,*uژ~Wg`v=q\1bj7Gz0O" e4sK^7_ł m)8 ܬYu s,nQՂp;pNJ6ei8gG&U1%HEu0?B]88!F8%}̔FY+jdA nt&3KŦ-!}t^'JTw+  qcKPM;ע&)=-%=E_]5U1&\Q}Ybw/H4) ~ECyC?Jު[_rRN%D$u_⍭IT@P [=TBr!OmTv_(_Dh iĈlh&uP(TY 822i|PI7dȂI` T7 6ţgZm1??!S%c3<RR<_ix%:ž/9fX "ۣ&M8t\(nx 4; +b>NntY3Лg(cu_1qna]j(ZxEb:xCO={/$dh'egxIl5:IeD$c"xkXv&dUT[lQrf5)P#K6Ob0V< COOlD*z%M}uz^ b2q?8%=!^U,+ۯG(N)ҧ͖ef]1,7;rz͙.tv&}Vx9aC_etYG?6oWh- *!%i J,@3TQ^P\Cf=vS0m?*>(WCWTȡĂ4 y̿|lyQEX*Q@h0Gt3=2c4{F9'}?'1"5|r%nIIf`jv iDv)?-PA"+3[Ytx $] 5E@a X TUtdIwDd]`Y`%Uws䢮3 !oD0P:ps΃G!_#a:BD!yᑈ\H9ֵپ<s/m0~nkB]0R"9GrF1d л' Uy܆W#!VT( s /_!i48/߄ tT7[',.^b Q32Ɓr V.oK Jy7DYI2"֔cKmj_d-D[H҄<Jb֦{~V(f80}\F6H]QҦ/7P?"DXkIķzF."nba0 Nrn'X-x;Q|-#X4xD8 %9raYqfy3Ⱪxp|Pd i$Y( z@;!nxbm+W آ7B cMOy®+"xdzd@0hCŖ:Dw6= Rऋk{nCvЎ\0;8j@ )!6O7+ l7`R #FN06UG+b2]V(ڞ9qC$*K{0@`j&t-XJvZZk$((43( !\04r=2iP)L)fFZ1ѾigXmFH9Mή%[!U*]&_Ǡg7 =ȥ# 3?]2`E3^*(h㮺,W1Cg<, VCc(8ћ4C}!X+1 'e3Y4HQX@F3\˺@8ԫMU|4 *Zh+/=(!#$m ~Ӊqe}DL\̲KW8>!#r '>ҝp:].A? M-w~k+9xPtg-X?'1a b6Ri fP;6;0D,z9q{<KfJ 韄<ɖ+G=}o]FQ}HM &_b^v!;:rmŞԋ4!4Hk˅f $slhO6: F<{H-namse\^+u+IՅ@w}JP)p|$-DlkG[Bىti:,ylp>&+ʎN PaԜ%fК7VI5E!F7Yw87jpX%iLJ7sreie;wܑ$pe$ =eD-H]Jil|&ct9F'?ɡ~f^x ֞]Tӳ>=(nAV L{/RyFw?E໧WZW4 Ǭ`tC'} Q-OSk4";AcAv@:I05z#RPvv TXo :!bXr=pqcYb&#t yrz!v"TQ*dqgϴ=+d4$2z/Yjf ?m>e%۟O҆[r曡LcN&<<-F PvXFJc5 b5(]g|>(a,4ؙRvD1| h/JbWF\Ifh坦D87ɻl-Dr*  9oC~%6)ag8^M# ;ÙS j4FB1~oW_c̿ʲЦg]\߻Y!S$I^"幾v2gp=1D9qfGYJ3؋(]3eX/#T5fhG8VAp/M,iREz1uʿ= HgSۭq&+Ssd6[ .RFTPvk *$nf4BpN߶Deqz 99z`"aǖ:b'Yv/SYAda`@()yd3{`+eMHBǑd0;DǦD-8uFC؃3%!GsJmS?b0(ޠcc}P!IbGA6uiA]FZڨ?6xNGtI$T;)Йzcx)՝Z+X&Xqڀb@{,jZ6gd7ve#IvۿYĊvtV ec 65ؖp(6q6S4tBܹRx)ZOw٫t5@c$0҃V]6ؗ`*0PMg`湮bOP%9~|oޚsÒ \Gfb`dCdOY7|~Ni24 4f3Gyv _v;}"R4a4:~.u_m l^W}\V>9I9@IE<-,[ H__1 on[ lӍ. źoZԀ$N{=Ss?n8D!D|4_@}'A# G%8Vm߉dus o':M_+uǯIFä̀@w$݌CA=z_,ڬ.k{O/ Fzfu;ճs] _vEW[+'ᮩa0iW>Ȋ=K ´f|J"|=QLĞ$[pP,ClhscH{f)I3qlGj} pnBF@vWULJM 3J_nD:8ϩ\E=8R*³"mfy8(j0 8A_ 0[dp sI#t<:#YIQZIY*!evIY1h{+SqGߵcGkA^3]ĪUj 07FI,5K4q~%>+Z@ Ϳ4]Pb{v!YD(dUt.u:mZGCO$O7fNq"rMtϚQRnEj3bىZl1LT ~8ªD%]>}8n񀹢!ϜO[K ͞Hϴl|N%/<>~MPfAnkX7O e.4o5k8'FK؟6UdNetC59c2lcJ9TY.gFYYl6p7ݒR^k$oaN{V]ӫD t g,udNO*Tu{A, *V]}fN_)!`ɠez^75裰$PNBu,uYӫ C+~XL%cef?goWvbcXthcV2&;2C A4_bcF@I&WǪsam=Htuyٚl=zKÀ Mb0)1ÿJK?xcon쭖VBS@B9rnm2/*xÖ\'Sf1==c*JWnEO|l!xXc LաK|Xnhp6Q7!׏lS}tɝw]lEY9)~4R#Y-^SғabKP-@ H<|9,0nmV GqK zϼ}dą Nj)KV("xGf(s,hFoరޯNS`Ųű)Óh,YPIBx'Ň?&D,OUE,kזPd<#))e(œ57{y!bmMVɊ&і[gb\R5TAVMˠD9Q8 Ax<0{tcU|eb`qgѷ.?4E7) 𱛨z5. Yˏw̘!k仠ܓ6s}Wҧs@{[b; ٺ1r?G*2@;=Ӳ[!0[r~e Ώu)fCQo'^/)K_]KzNq!wlC6Հ4G>Mbo#8 =fDp8udbÜj9$Z}ɴrVKD FG1sXaҺ\5eS IzYIɏFH~u7w.l9WdۅtksI7}()BnMbbHǛ5!Vl+CwBB!eS|,mۘ@fU(+{`X=D%C:!ŭk ` ~qz'}vQ͘ S^$0xY ;'e¿N[:v^sAy ugJЂR 4^8>Ne92Q_8 [ofR/WB?eK_'|#1YYS$Aj~k[CWRn I^Yl~h=*'f49?< IX;51Vp JJ0Kk2Mh.cܴ-uf.}XE캌8W9* c{q=Dv*FY42=b3N];틿:ǿʬUy14uuc0s1ӼwHᮎ * BȪ=n)[s>߽C}wOf9ؿS^(.HPAy E^ %F_D)HӼ~ߞKc9P/!),{(F K,;J(v#ot.JL#| lS&[{W\` n5k5"1ɬQ}wYBf*31E/oY -zt 3h:{wi+QܐgwϠB;=DqJ{_'X!*B%Ʋȕ>Vw7c+} ~in~ZNl -5G8Z Khgf]} c˫-&~<ފӞǁP]ݕT% iwz*/1h%$Sa%о=jXU>7 ROC"9O@rֶ ѧi-dTZ Dt"ΠTmHⳮƗ+Av1)u(qv]bxakx/` 'xbD &.Ta?j`[vi^jz;aYrOg`SZ2qb./ґר +kP۵XeZY;w|J-`YU"4f´ @Rpf2A~;]}E+3gsޝvWpefieZʃeTyud&$YA׵'R_ ~0ol Wu~ 6@B* 2yXWLB[BQ97.@?Wbw$l_&syʻWesdC9% ] 1AqэՆO7mIx\KlF>LU2W K:RZKZHvcک?ԃ2S,f1va8R-ױfk!=pwul4axƂ!%1L"E2T ޥnWΑN2j?y d6YspRN?A&\@RbY~=JF~8}Q?&4ZzB9! Y~~烼K%RգqOMM̨;kD:3y>&"8-C.貘8>H (Y- :l/D:ތӔϨJI~Ƭ66ciUN44 E.+u1FYwHWhڹ0@5jNB2X n2o+~jYCP X_V}zw8&kҔq=Եtqj |a'}JrG4nM۟ z'#NJ~L0ރiKx# w4xN:rp"LbȐ$)=Q 9xJ?cN;.iRz0<YtҎm/#5l) Lj^oHpP\gv-󱔽aS?vD@Pvq]k`T(fƑJ¦OdzHj9m; 0vҰf?ɚJ2G G  "{|;T*8tg?@MWl_x?%>/E&LŘ2)UUU }28qm4˘<: 1[PN~jo%-w%4s-ZWV{Sb2c,bz3YL0h?, zfÑ$%5 %d?loñ: {4r]Těndo3>~ |׻tWQ7WyΊ I̻PŸ9QI]4߿w[:Ra]~Nu"t:rH&ZDRX-q5oݬ'7PtYwcL7o viH(L20^kD-E^zP6eaKf'"5Rv=UItο+B "P;F̪!Ca IߗIA_e@bQKXcM=DbK5(Rnfw]jx |t42 !ĐeK`&WENJrvk]k%k\|y2u)`6&^ `3:y$w Jw93[,~$b쥸0w2(DsI^IFdϱ;Mt@SJWhYĽ mE{1B.e^ߜ6#׬ugN9VvrJYk(#) mtgp賱V=HF/B(8nvs/"I$gt be @_(qAujTcX0wP?1r}BR(uzF6/.Ja"g'V㏟~kTjtoG)(H2|(A „(/O]UHtU. APR1>k-yS>+7:$G [$>x56xgK/ܒLXi{бq{oh٩JFs {O> + 5^n8r]Ӭ8$Ybb[&+$S`qWMx3*~rІdݸ28Di1,O>g> >%>R;y{&w)k#bqRؤ_ȫPBMA~:wGrbX>_~!h \M#W7X `0B(l5άqĖSR~VlbW< U&BhШJZfm+5tȻ͖L<_Q#i+h"e2OG^ "L+e%נhew&ɕ/Bm!SV/-| O*r+"*&t8!HK _s]_ )Y^0M =÷` GT;+LLA"W2/+ C@; "\R,ji{Z~f]h裍XCҕv C}Ek$ZK0R~*A:o׳R~AqD3G1Vϑ&cZ i`va/Hנ O_rA5u˩!w5G/SrmQ^S'=:M.zxWQd`@F !=g;.z#: `l• ]o}R|GY:.mEFPbqrF@$ V̹vgcYU: LBhRK3W;V* o(CX!UJs6h}o. @x;Ap-:N5B1e,:!GHHbmyL}^u!N2ؿ4>66S*@-MS $@Gj'.靆BwnjeyIުu`k,?*zE O T0࿗0?R^Ipo?M*otcN K%!ff'ut~4xKPq9pTK~|XȗkR2lNwg͜ڏg$:)Kkއ ou= P/b YnaK`sF͘GVR`l& 7#j@N3beJ`Gޅ@;,~d31*XC^au.;&BnIw: Z^N8ߌtK_^ڕiPuagv u$U5·M,s!lBI "|Djs5j*ı]f B㻯ޱDR)i&1uўy7tUV]lLc^{Ӣ(4iRB#|+O 8FX[?M"T Ơ6 ܘ8IwymA#NxllJ0:JO/uik$_}es)`;=< td''I,d~7C6ɿ\m4{00mpQ eJ1 Țr &}Rd,팖sk+cue}p[62AzPb]̎xIthQeZ~Zߡ Fٟv+qGV{ \S+.g Pz&S E!c4-(˃z lR{} U6U`j TL3'>K7b d^uw I#\-Sh #C)m"ٜꡝk:#QIXaQ\޼Qx֊k+݅$2T>J,:B.A gRl"o6޼1Jl/ڰzX'Diej,t!Vp3 35[8(UT> @x19FbK{_a Oʀ/ qb{td)caJ&cIPreřh>8>IsӁN߽6\2BΤE =X)W X=d-1$<%Ch/~&w|˚ OHGd"*!bxɋ ~ݟFSN/TaĎ=ǵs_qSb]6f +//)`_GmJ}9T45}[ĵmBS\ ށFx vc EE8+?wFBZ`ࣨWFYsA2s]9 P:~ }W] <Ş8$) 9dh~:_3AkW<⇃i:qrX5| Ѽ.١xt6 xՅk{Bր߿>wr'6.}4"j=#HṼ@?? !綥UR80KRY 2|T%6t_9e;6uV l?c\'Ku Xgԭ"8TJHʒ"V676ܔxaL.s.>΍{nT ѱ3D6sVdN+|ҍ(;7򥸔9ƫ j_:طsI+:KN>Zj\1 \/(w[QΞ@/¹5?#xi(d0_UQ5rmәGv@kJk.F;ri4*e<'^svm)+Epw,T`b@ڣdQY|%GaJj UDZ{tEU< ipN7HL~2 ' u@D@ Zr_W_7%2*ʁ I<9=V \ ˝Z)#9&UDeL3m.wҩ2̙clq5kN |7uGj{7Y*_Ѳ5:,*Q'i,,a*5y7PME$n|$UbodPs*0:'DQ;%[7h6Y_}3#"1aвpkFlV wz%&D#jM"3]s9^Ea"ch^EB,vZJ (v,DN:@. m_#g<s^ew4}Wl?k}:.'H&o[X3ߛE!vu)]I1ah rh,z,Re[FEQ " N+CmO҉W %fژJ O28bP!aV1f^j S: Vm39I:30 Quq5 V#}d̷\1cV C}jn$iip u_SWr/x#)Q&Wf8 Z)S .7xϻ p/p_$Xp^u^Lyiϋw˸ d׻7$NՇgcc!bo7;MAd&JGʹJ̢*#Of]W( ?V3+/Դ;hz־O \T, [[O(89:m8ݿ:?ixeR*E-(sB5̧EZarv},隠I@kLnbr fm>ԘKu2#ڑ9=Յ?<"v7 Gɦ NB6=0Ov4Nc;4=M <8cDn߆Q*vՈ;by>j0{j*O"|1(K2[gً_6IO!;F,KL)hb>d벏pjf 7LtY~ X7j6}q2k3):I58m_ dz)ps<<iXNC&qöo9m1'1ú`}f" Ԓ"nǥ زsZmv3Bʟzd;ZL7fPtd?- _De Cbk ph9" K"^HSUVB=}䄺69΃DCM#*Ic1W͑Ux aikgIyG4q<No>S$н{]YW?L@9Co޽1.tFŰgҰ&`0C^ Mv<\a_;;oH8swv*d—My^_*_#Ju*'mt#g`p1l*nSQOܣnK6fyK \:7A7"\S#a%:Il9> c`??Қѷt7ձ' /*!{0J?9UTM|DG8̜!TQ (zlVz% ]N_5Bl_Y>, k*R['4/~C9y"v<.uy5@C9˳=4㸅h:Wf-[v1`x󪈔"=8ղr7U72ee 4?W=P%i(dĎ=NDZNR|n1n#HEz(cxrlDd5(ݣ.":/*ZR)76l^*_M&Vh8,]~:#ssT\zUc*P?vy+䉆cpvv~,&"N)?[J۩/"?ۜDxԡh7מRtr;.飪XI#4 yu˵ei lͅ=j;;ebwАzZf{K CNۦ:):vpAz偼JVu<  g70B ]P/zvX~<m0a4ƄVS\B p_ޭtRbj/)VH6}}1!MW#Lx*IwZEz@N.%Wsꅺ' 2W epXgNϞGQ0yq3 xh]q<ÓN[0Ӭ 9Ԟ؍nNQc̈́E|0QJz]:Ge 6"b.yg}Ε9tcEaf_S-S.@Ā+pL9StN1k'~a~EF.#Α4Q>?'X_ wbr6 fZ1#RG%#6*4#QCGϑfd8Mbd&ڳ6ֺD+%\ )$NFD`VNʚ6P!Qg SƝ.x99jTf1t<@fT11 H#!{a=a+jFCJRD(b/|AKmI=[8O;,:J Z7i@rU5ǑG\Ӂ78\y2WlzԽ>qܜq0h% Ub~;_JC(bY3m.mVu~e)1DU0;%0խ7}<IہDzoP%d `aE2E!'՘`͹ў{Gsst 8~g=5(0,9fY_d#ޱtll+xN4rEYz-~ u{w/+BvhYkn6#|xHvi4R3d_?~;,Nk 4}>7 5Uك!uŸW+hf'S~ <;mNg")*r;,XDr lv[J#R`&nȮ4xo&S&[IwFR|AT0kq~sTJ^.7G5/y/Չulu"M G'oފf;wtb1c^ 3\7 L6FwhTpPXhz31dZ&S\?b&A4"s\Md黉v 9ud-)gGp d@ 3r595T?JЊ`6͜[$ZHK ~LɄ}Llx L4!W)/H="#!YpN,S1^BN>%hL0SG MPmM%*Gԅ bĆTy2&@̀PӸ@跋 K.hڄk1v.g=ghUECߧGѶ\ڌѷS3: җհ(28PYQy(2S:2Ɠ}ko b3 TwбHL֘* Z/)\Xz1D¾=Ol5Vu e5*8rq _5xn+f- + NfMxXl#@ S ԖǶmqOn[B`XQNftb]KmuwO,56F,)7g$JCJVI5>#\r[CSX;oHs.ưeg`PwdXu3qA#["M3&hKne΁E,"J9oцDOŔg֑ٹw GquOZ|kݣ*b1bDF uCqmxLr ˄yih}9رzȞ.Z 1\6-Bh!(C`["=o`~͹6Tz˚`(Bz1jfm~\oGc$K$Gib@>y MX*PBD,%[.3"CAݠXE%Bb:/`4pUP֐.TI .$1GCP]Ock-!V;['5QarA}z.\ >ʦ?zIh$?@W2T@}KBǬ:p Jg69~E'7;@[:IAfW:\$6uĚDN3LϕohyTByeU[zhHp"q1EK\z8/in<&Y8xF5BfLSqp(ŖJy@>GIy2:;ADK3*aT  p*RMa&$hb%:NH# έuplGŴlc~5щDŽ}g7H鹮/w'[TSkrBN #n_Ȋ`fBM0!n\Bjt R7jwZTN^nBѠc㿺\hiK I JR!o y#G{=EFG{P ȷt֋f>oO;u|FH/#:u!υ*̤q]h,40Pp X6NöB(Sr|um豜ցxJ2u?1Ǯce^>0!ur,y FQBq| +1 g?W@wh?W IPih&&  HR TUܕtYBtOƕ"k@.H}A)hxö mĹ$'1b^Ij@཭_E_ܾ5ٰ8[6#x/4[3JxM, ty%z͆yl2U۠ƌ@axM:w`AcVƏۤ!O壸'@U3#F=ްtgxIְAzX$$6n&y/OCU/JYK3MTLλpw(u]CXCbg8;5k$R,ԱƦD?궪g%.z*\0IlU?9ϸ4,Qs(.ᤆ4MRԿkT(c@?;;&$BvZ"TBQiгr(ImDiyC*o1HDd~~la~ \O!| B7׷q69l4g>_2oƜcKsi+)ZkU2s(m3՝Y_Uc3¼?6g1Q $= Y5( ⟜(I*[-Dԇ4* |Ϳ5ȬQ!ˈrϝ-ձG9"Vh%+ o"5H'2ZS!> yw.'Wz]_Ta[Th ;⊥~Yeg;ٜXexLr/c)Pcs5Jޛd ^x$!MUŰ)s7Qҿ&Oxx h }|@R$xdg'%Ay7Eo_^~XCPۤock!ORI`2m" iR U>"Dqvf* xN[j}Biɔ\x_sn?g?鋄s7 ˪ܜc YؼPBrŦ3# QgIpuhqoJ$#哥D,٫L렄"mk@ 3ԫ;<,BFzH)uArJnɴ3hvږhYEPx xu ܪItЇ<磘Jus#Id#< t :4cxT6)[RP,B%rȿ:6vR 䊾S?!wtlT%:̔oƴԢ&-3.Y:[ˑf)>yyn çw^+gnDppa7RkԲp"̨jU:+Y&y.Scm^ipn}nb4\:.$/ U? #ŠW4ZT2}PtzuA$/-a}dvv.t.7?εqdR#qlBv"Qu022~^: {D16,c.u=m+ F'영.r$&<'WD8#Q_,2fY^=+ gZ4v_Vxf 0C)Ag[VZ=C>Tf,2j o}d8LkӬq)3K zW)&t q3GpɍhS6}5} .+MoJi[#6z))^Vߝ`]KMd-Kwy_@~Ê75}mƌetV0.]㍴2 h eG`)&2'ֹuD(UJы8GfZIE:D2$>0,u#C{LW$d gbs9ݱG=|mo!X>y>Rw T3GPAG~>^ܺ%)3{-W#Ѩg.dQϥU7UhQl= ~}*uZ>]rY YAY|8[O\$b:wU q`eubIْM9sVf$L+Ԉ>#;W43C4 ŎG,hI3'ˀׇ=CK^w m|uJ`{!&~iWXky'LPb g^Q *C![j9G`rXZY-QgO<"b15fAU;\Sc&M5ƐAƵ.i4ыiWɴgB-'ٲkgҕ#E>ȧ )xZhbvܼ|$վ go~m̡0_9B}9$BZ) F 9a/ 8T-A*VyтF )zEޑwf²#1-A?e;%|yIݒWAA? s .f/o\ayae8^̡5G}-0` 8;Y+ɡ?Lf%86X7.?s/(#q%za7F8A򐡅u6]ՖIХ\V5\ .݅zD&'e!Ÿ 9V[M3==,ԜgFЛ44[Y ߔIGo NZ;ܳթ6ygDPôki-TwLTS)VHjs>c4Vc~Ț CM#Ez$h22iԁ&kg"z8`<Ӌ=@1rsŮMAPXm|B!K3 ڬ Vler09+VT}Q(wұRDbio}n޾ql#G%wIwL|;oϸ ABW>VϽnݑ cG$,J(N K\j-8Blcag@xLH T8V޹fUP7g?L^FFP6|MQF&.;+A5Zң b3 s蜗M'|(FryT*+Sp}cZ%RɫT5Fm`G*-UD 3xDNSI,O9鹜L 158u-o+%%[ZI丈&I_qBmG5\KZ w}lTrݞ&kXՖ%_2#/]Y>-2]Z.K]UDПJ2e_܏HBG,)Ae5GCz>A Ǹ6f|'B^- bEZ1xt́N*H%Q)Qé_N% o/g-&=CֵEr0/i^V :M~œ!1^_ucw]-\?&/2;pq>R`{o }ɰS0uD"hNTfU(/,$9E-9>i%ΘIb%X7\&ŕ'>Ž^?%orN>+V~#;{-v"X $X7v#$p0!^?{%&PȰ'pHo(h{J|#ѶD QЅbjG" ^:n8b[C A [/&ޝd;_T8->50X =5G^Sɝ ouQ)DB^.;Xw! z~̸xca}/ -Ay[BXu =ЮZ޻I!R>dv.L|92E>"l*SnV:X"g=ř/j3p4 <TĮ߭Đ<"4+>>?v68/"X@,S uTiaC> T~ހM.~G7y L^D5ѭu;:Z?2^~R&<ӵJj ̀=J?R gȹO ȉdΜq> Rʋ.n((H0RLb׌w|=~ұ7Y6Fz m*ZBIN;ϨY*bHwҋ(M@}4a`gC%Dz/*Ӣda9&3y[l2($'K:)7"п= X d7(-`Lb*w8LC@l?k]{ ~L̺e_aY"XfdYHpk*A3}6/?- :z}Oi;\UwZ Vت}bkpŮ HA ۴t?xlMdUyױlJWg܌..8WM:*t2D 7`25ԕW2G e"Bs:%c]:I O WL,{05K,+inqǢM-dҢMoRxҷdž0(|[Z9Vf˴E@κv 5.ְ,e61 2\Uޖ+'﬐&GaHC\@ɳݴ!7mo?A21m ׁȡSQ$g .՟Y7C. Lݪ_nxs(i'A cJD+v ""[b5z  W/fo!$2>JaRW>f4ϗ :ї9T @W/Ir NCP}YIk4Z 3&h?8Di89a}&Ϙ8CI,yΖ D6y/x FSCg r02:2שD5uuHU5r{%>sYH1Ϧ`m#-)o }8yl=^S8yj.K#&.`=: MIQA!W({oLYBXy%ɗq:T$[Sv렋6p?,/0'ޖ*VH0Xusä/UʳZ ϥ\ОAhf!ojH0&B1ťz%!G<DfQN4v)rҳE^$+.q į#͖A׋6n.뼾UyJVY~($ٜ_&r3Z 23%Vo,HtI'o0wh1evGM7P3O..yleT\\\J_ 0|swk=|z$h-E+NjH!ѾQG8*tg}-h+zMɽE^=MQR!}Epwz}ĨJ2DB -ʸgs4AٛX[%MZl,%bý-j/X{p6m41·)Lӛءg/CVFM )0glHٌ Y0[ 6^ʒM,x~ SCU| Q+8+<:'U^3|^hYPIojx)-Ko+y@/i^͆;1_baO`jB=iEUC,"@H}j’"sHaUyś+|#V=ZuqSWfe"^qm'ڼv-yEwn!ౌ;|I6_ي5䞇%VvR=yVxII4pȦaf[͂k/d0-.j- m]A˷L=N钾<ԯ犪 " hpZm8uayI3/N%SK Zm+fv뮨rxJH//^ I %aqhSYwvsf:u;\7<!v!=ԃpK?!}O?f޳ev(BQ-"Սs@nlD7]y r1ռ*댵&x+OQRo9VQ@+ Vzil´<|O(s(Ar&h)(p >0S{Nz>ɓ~"w>y&W4q7Wįw*7XWZ`:̆g$:"6kJ8w4SaefpvJ?A=02 r~,@jEG_JU<;|2 Жw{5ܣD\ڰq͍&XQ|K3=qedHyF/ ;bplw^:[?[HS9qCN >Xfɡw%qᠯ7rƂܴX؍x1Puajp* j Iv[O\ BLLݞB'mx5C٬A Xq`0Κ3W~G&M_UUMtiW:z3,9QGGZ$>L-M**HTӮr^ݺ Y'+.|]\L>+"N֪X[Ee-:͆?rIH?n,19RH؁S¦5Sbj_{XQ!~'*Hqj#12}?oPsi|\ZEiKtJf{ryx &eͭK?Xv״Ͳ~̅L_$)ܰI\huIeC” ?fƅkn_1Tt[׏! 3'VJKWo;ZKXFHKǎ{wDTxzTNqjOz`;mN!Q(XoG Ns/Vߌ@"&@WJ9x܍tK&Dyiۼ]"|oZX<* $OXqF]FOe&oR tĻ dG"6kWFl.Y@^h;~"*ܰ8-skQC"{~9VX~W7 lFik6Tr<oKeyW#[ұ/2͵nm8jD8, D}~IBP/g|L匄F PHmW*]`h A4$Ds^8]nfB= k~.̴`uժx_I?vk`ͣ<tS>^zv8eѓµKHBN'PynYpcy>7/^dn!BIsvײW sʈ/)6zVF.]z0PEKZqboyGwtU1.r){(|~Ĩ=N4}?jm [~}Vܠ@-*5qX`Neχ}K톢Z\+4 9xQ|:qC .8gdE_HX|t +IrT*C"yhS_CnI޲`z.Z[.~[}xWW #O@J (ЬiJ_o%Qazn5нkx_F3 CŸhDtt 򵀹C`<Id.SR'_cMdS#/*=>C{,=0낱g:{*))D \q]NT>@ ]ar`)&|5BF%Q "T'dV/J7gtM\\0In˪ボF';ֈ#g0o 7NtM#bwMoSkfQ!w[4?"4yo02V5"eF_]HDtf@\+"?y6dr+&usQM]l UFv)tB#ļ`CʬJp*&#_3] i7b?鱜xcabR8`A/ÿݥ#T4(CZ9ir!?mnܲAl &R?Z0kп\/[ yZC9"ITdh͋ DWV`rd* QjSgB:d6A!^Ix;|)g7 ڭ gKyv,Hh1o%DasaaYjZ2OLqtqw3Wȗ }OmƖtA xbe`n/A$L6{3z*-DvhnSiVq6jke"86,nAb.srT\)ou1 cJK,[.zh:HN˨NCAK9zd ۽Iw~ HaK‰: =t:I ܛ PoFb'3";If(6C܏wX8<gk6o&@^voܬ25H,8Է^57h\V+>Le z}px o"Z@yX-oFkxQHxv*gT'iT>;lǛ;UE~Px6ʼeVz%s&藦'c'ZKDkdF$G"hL oRg#住gYT=F&W)@"V]jBЄ'p/S-t]ߔw'ˁaCS$PW y(W|K>BjmՋs azK»G.1IUr#Cr.mm0a Gb^r'?*CyXVG7vp?[,zCbPU(SҞ = ~LŷЀ0l  ۳7җԤ-GA!3_YԋٓfF1XoD |Mt:i t9mPg>[݄|LyFhAWJ7nNvM&g:a _ոu|o^"c(OE#_-ȿ12Oڻ 'IjR[s(ģƩpc ~ږ,)1Ӵb B;Ve)$B̾O (gF;ΚpZW=#yNBis>lA'ܺ]y_Up,$&HA[#?dߞ H1D̖Ǔ'ٰ(U[>*EENǥ*@op˙y 0 A)A$Nby1BJ 0_?>XΦx 'GxjξkdGy@w9' Y5`} >1Ȝ%.wU;IRs֫A9|"8]H:n͉xy/@+kpMz(yL->2t|v (: vgp3xLBv;2XGQ$n5:f~ \e_\L`o5n43&.uH7oq] 1"%AL_P.3F7AIҗp/lM)5nCӣ"FiZ1b+3bIFw/EMfn͝G2c.i6 Qz>% F.obD1҃9s^e)•fڭ<ˎ`Mwܼc>Hk< l—fCc/+/TehcP݆~KKH_gӳ!HcdM^VA Fb:$MH|Thd :i*WbQp#.K/"wze,_Ge2)!KH>c'^Af1U9BU.u4K\Wot%܅o*:F9~2(̈#x=We1r`y͟ W/7}SE.*O<7՚ܱb):oHhACO Wwo$Ipy.c95w<Z?Dxi3$XSdfR>D#g xP,?|Fojqiu0P9V(xP٨>f!9 ~hȪَrWOX1Im/-sK+Fx*}2(*(j!ؖTI޺i2ǡ(v#舍ġ4sC)btB?p3ܙ!!O6GZrS Uյ >BұCPyi.i!91:ċ9KTl$!7>\Oj zk@r̲ })w2)|lX́*q? M"zukMPfor~?†.Q1-o;6DaahPIx2|=QD]%S M* V!c/,\L5l#P<3{ >XISڠ@xJy Y=,C]eO%%Qqʪ~s c\M̓Q6n=`+ 2LkqbnꅦKf ׁ(kk԰,n]BG3=f&`I#B8.p8f;4?(b$aF&8)א)3g|P,!sٓs|Mc ܩF%lܮx9~bgx|zxwwAP&Fjya*]ٵ,LW W#g-f)['bC,Ž^qq÷ jiNfQq[rFvQƍXg,h/!iAؗ {9YXa P[~WRH%{,LI1QMHXhU(4"=~85|G:ra_x+!.ANa\$oj;A5 lt R˥aP=5ZIaa* :9_C\/4S h_xӕ^tHҌ" *INl9&mVR$U=Ɗeq8Vu0IV:[Δq)Lm}L\+܆[݅H]m{t wo,_2ДV.ؼșVcwB+2ʛ!"_sx ʃ{K?m9ܘ?3(ι-(cgRfG 8vsrG,!q!|yݯQnv#KFFmdK!ɔ\{ <$ZbEFG=B a-@<}uox5 T*tHm=p+)yA'?[%cFLdּ -BU/(G(ewZNh0[Y4]KdBi*D3 6'MH!|w]e/L=\d]wcH ιbsfpfuvMs_f`;w0]2nDe-T!9݊OO.&ٲܼa H^"t+ewձ JjbMK(b'gFt-/&f& R@Yx77s'\jVri9 rq*L^Y44lQiN'Teg.V4nyA??!]Qo#v0E y02o?' ?;u 7w*)J64~o@S dfU3۠J}͂?.Y/\AXKhܨ]KK]{gB{._=f Us扉j[@ZÑ uZ"L^O/ e-{EO!*1k}v4d~ҡ|`Ie tMv`:/1K UýίcIP+G3”ͳ c}B]ڲcv['ۄ%Rh]j{6'Tn!>{8HFu?X]3]2- D4. aL7C y#e}kSqׁ}x"Q{Eoߌ^n[IB($*N,Hi`>WNkfDcbhlA +L{zhrQĸ-tA]Dm920F,tWԥm㡯 df(h4,:Oa^zhMX#3ļt'ȷŖ+9IxP('Y\ي |^oNB w˙ܫLZV&V1Aʱ@6JE8lV!|lH=9ao5 60Q9.2o Ѓ21WV`x6")O7la6M887IѾ+6x)]llPQ=DJ04(jfd2}ig/=P7=W)*ŀ?^S@(570&ёga$}0svK7,헏?7Wp=qR̪:cGئk!Dy067w\sy3qɶu1zi.s@Z[!VAD|zu+jd7Y)zWv@ E%  ##ro:*fXw- hH||f$t.IRU(NGn8JGQG׶ĭP:eM1il,"#h}l0$ ;cV1]^Ӥe_vVϥ>B 熊 :v7TAy dש TdzmJ7JB' bq|n Wj`b AlyZy3٩{ r5KZDCG8, Wt^GPP$yIIq-I-sH,RǬ"b1G%N$b%)z2ŁT1Ż3='mlym;ig?,$#-X{mꝍVSP rpbg`,zӲCz+]z8:4¦%p7j}FLdX;^y$C ֽfƈ*dPH+@,Y%}d%_?yM2H{[I# vO` px8D }P CS8&A#6Li߼b$#A, | {8l` l$>2{ /_o:+ aw3nY^g@1uu|uhc؝4L'۾w2?@%A?F,..~jw6ywR9v _/4+Z`*~>dP@G7( n mv(}@|U? +ӆ/=)sث؜@MSZ7Ks&bpIIWCo/m&x+#r ms!F'QAvb *A܃IcY"`Dփ7¥٧p9M^GT`C~Fˢ![Ũ2oW;ygzSIhӑ/wwzp}F"r&$ƅ_:ѮTbPkޗ1udP\N*^73bj*qYٕ}ӴMR /G]]o!|yЗ)BS }%CАy ظ Fg0 \J<4ǎPQ a':WNMvWH0(š7{\gY:v:4ˆ\NpgͱTkC2^_kV5 \d1\8'X0%$X:7>:i\.LdA6b5pQ"e:>jL>ךk5Bkʽ5Iwe'P&XKf[ " § U)M% y1o;.nW58YjhڗOjB+C$Uqh0]V}o}ĿgO;tu6G B f7†-ËѪ&=.z>~=47gKzBKyɂi^P;@j怊Ftrt|s~ FkmZ_/" h\0nkH!"};=qΦA,i{߆ E\͙5C?ܽڂvh/rJ]baB8e-A(U^@(9^aD08Eozw05f>9JrVc4t !Qf2irn gWA׀Hvcs&+=:=Way&[^Y.[bM͌H㼃' q8g89PKY@esiuhMp_/B?P,8@=eqХ^,n~DZ  ߏVھ8a4`{pGK_}%кywu{7 iA]cƾܲL ( EsA2iYBHAma\ W% cKԑrA:dE/_]5}H"gyi eU@P 9^9ÛфJC3Ks}&I g0kJpbK-YMOG{Ի%U0k\]R@А2zpi Iш>0T] 2g6Fo K8>! 3.GU{ !YmFp-7^ףȮһ/eC>tjW:juwSۣ&*Zf,f y^ LV_X%xLTNo6| x !3$T]ˮm/zTvBVA{a w$k#{w}bCt8CǛmcאַ^龍@VdaE ]('PB%{$|ÇeW7HfI=Ϧ _J^ߏ\d,ģ'|hMM_d^h^#NҜu ӸL>ƎW׮Y.Ƀ08{ 7Xq:f RS޹ 2z"@eczwr~4_HZk/2f']=\8 ӽw#*r6`7An,tS40f(OҹNV}rq%#Dy;r L(X^B`.[n(Ç{pEH{/ Cߦ԰e^LOUȊ.gtQt\Y5 RpgQI5og퐧+ckۋ;bTYZ ;oԧiFkEdb"ؕ#&(?쭆9Ѝg1GZ̢Gp/ *3|*2np:B|HyֈgS)$P/+009/% CF%\WIH}EǷ[N/^&yhilUyc'ᘏ,\IJI4Br ޏWx33C@5FR:4@}cBl1Xv_RbvUff:<=cBH?4鵧1w|xOjKP%P ͫ &'a݌ʀOg +“Mʩ==TdWY?+p_5e cC=QNꞌYi`قz-˿]n9Mn)Α1] u-ql:Ty(roh:%[c&[kg`qh(f#Cעz&'&Ct0OB%^sYŽjBY k^MaP8?S1F+#w*Rغ".JJ@{лRcU{BgȎ$[@W"n>S0F68O'ݯϳ~saO $ ՁnFXsxm'6# T}#qd{>ϡRE -b%q]!2jcjBL')**E0N_]|a]3\jl:dǖ|L]s_d!cG(0ÄۏDÉJ/w/%Ɏ{V"Cĥ!S TcQ&0ԨWi9{ZҲFG1a6$U.56[2v>({T?xd#xh^n^qT|a_4kKEs&57-쫠U* I.'.kJ@@MsQRh1W辚 1dh^3 E@q WɁkd}f,o_fMTq#۝ʗkna )]PVxe; 2[8ۆƓg~^*waLT!&y}/Bɻ;CXrQ:x C WUG:Ҫޙ m['(H肸G{IK>`'p];;I B5Z4S̮3I%96 =g=Х4f|p$OJ^7E H)w*H%X [nZN3iƿSyc`$#!5_8[ۛ6ӕʎ߷T66ܯ,9rZx \f/q?!6Vr55쒃M@w~xoX[4H7xv.K=U2*g˲GFyLU,7Dv>*Hd_ |Pklx7KtW4hN?*C >b+; ԬpJ4S" )2*XB`d v|ii X u='ѕ <ߵlœJ!+`^ICIDco#)]ML0]x1[a} $@ET%wU)>VPI>;Jf?24$JJ5wO6hHVb{aq3Js_oA| Bs΋w7]R@maKWo^`l!?3iyg[k۰FҰ򃆘!N #Ep2*\#JaikxxRXs^'F2#FkN#ehR F8ހ0`Ay}AQP68dqlJN[Ԃ5 ~# Ȱ0,Frr IHECDߗ 2&+ŮkfєTHtQ>=̖3BT'|04UЀ,6bYE1X.0$DziwڶݵfX{^LS2c Rԓ$:;45#t(4UM[!_fYo+)*{Y.D=Z'8xe2n{JL%7XN f>uZÖM<}) "}N&@UBa h*jpV4?E}LozUР{uJsI7QW@yvg5>13B9z̎iWvJ6t$P25CaTx@3D{D,*Ir1~m]ʊ:Fz%-P]|(}Բv7cxʳqKĊS"f b-L&?c :#} _6aS Yj|Aceֹ^z;8|F-teD+DC^*rP0;Iƚ:5˿ _j(͸L@=>@-Ͽ=P1r83֍wg>ɉ+!jF8T[c1U,m`Kd o=$W{Ys)͵러$ˤ?Tά}ޙ4Y 5Ů(/I1Q;ko9b?4d-e֖_tt`gf&V%=/V*Ag|t;Gۙ`hQY ac#K*/xA=@|K>o]6#fD7rVQV{! n?@3h*\ºIц?jފC#.S=`kbeBJ>fDy2Ew%Yϗ?=U墛Kvnӄe! 鵔v/+_H́C٢JzbBӆaF>gYg h s&8,tKjVe:L"ׇc52"N87cFz}-Qh{&6dZ;zn-.]* 4D"@'5 h 0fc#iQCuҝC6dқZAo)}yX¿"2^O;׭I7|-"|}7v0O9qJ\l{o&%H4~{S.icl33Htj2Z[Xvlp9R/vc!Xq{-:lB[`))sY@xO8_|98j,nTx_TFusG <sleENQڪZ2@J5 5Yk7Õ}^͂-,}'A/eb H Ob/Èn ?3rFc4<2d5W92UBwVQYW@4Jն#FPޛ0 Epζ~'X=n1y\ݘLR9-|OC&I-_'B:An{@{-]H`,&vٷsSNI3٨  Fs\;! pIKvb֔{yZpZIe)7ނ{^SiPtqBQ*:I9a]r-?LC_CL#l|/Te'a**ũ_C2/VB0оv1U;?;rlk C5[#蛗vr a%gP5MC> I "y8oX$M7VEc߹"x7p/vߏcGIB(ɽUFhmslAuߠ!]E*+qxibπjdT RǾFNUt+Ombc_ 'cVlwz|^{X2e SaҲC[-OJnl) '#[Fũh>ƁłVR-lVTb=/ :1Cg 3%3>ƕ5s _ceÅϢPK<@ g]CKX S{-ˬ mO/jޱf;:Cں'I:dkY_NFmk,? +%WƼ 1I7@eimJshZe݁zɯ?7uA5˶e JLq7<wQ 6$1R&E d:~+<,l.Ņi ^vRR ӿA:iCȀz ޻Ej* Dar[``ĘX416&v̈́ha:WԍIvu q}T8cfqE;te}NM3ӵl/y%ӭ$.QYc N nf{WL}w J:$T1ǹ2eΫܑɵ @Uzj֘ ҝfh?i f|4 ;yKJTMi{w2p)%)s_Vf(8UM"cKFن“U!Jo p{7{1Li>)yİp:NU7AYʮ!kP=|-+lUĿ; 2bwipS#z?j`NE{ƯЃ܌p2cՁ+'Q<{LvNHΠ?"喇)zsɺ$74 "6 W5)S@_ma9NMKMJSk"Q`ת]e BܶFs~&vhڪWgqxq ݧ?ؚדl8S"mQlfrNn? #h(GľfGH+ӄ a92 W<1Dx6 )%6p'H=Uۥ7:,u Wwγ|wo47o۾h4Zv6":$ f7eӵ́J$S6$P Y; Z[#ots̫WcJ&hn^Dwrbu'rbì|cQ3;^g:2NШ7޷ ¦V}m!`_-BǸ8 |fGsP ՁNcfL'wHݒK!nv~wב4,qaqZR *(7F3Y4< oThO,b͆W!Gj% [Vyk~5ڂ= Ć<{?3S88zZgC1x[N.wl.kD1]㦤R%x@SA^4PKYD5yfI-gW`?\g.LeOfܢfI:uxa-*77-(i"?ZǬ 5 FMy ^MJw8M9.v;l vлg&``Rb[oW|.]⛓ S] \A[>5ƺŚfFdƯ?< ,)^yjSNS;<ک4N6"+Eؗ//_yǪ1 &璈tm̴E-MtI5dDPe}ɇE&Yygjs]'^W%Q$**l٢EK H Ye GN8ٗcEށk\8+݈FzVs m")V/󄦈ŝ[>y3"ʞI 'ꪘӺh#;P]L8 liwH4lͪjs}:7vLjaseoa@Vl)Qz0xdi6lz(;\nxf<*Jt. 8۞I]?Ͼv4(^6nXjOL% e0L^lCCߌ(\g€>bY7CM}[ucX(Iĕz~g14ZNpC&ƈ[+WF/+FV%&|ZŒTK=XRi0.Ѭ,5vwo^^ |amBfKi_/ {U,שR;x`m3Li153!v[3+p>h\-˭D\;`nOjHl! M i{x* j||" $v8~׹z&t_ : }ya|ȍ3n)GCk$fϼ=ڐ<+zzV~" :KkqJ3kY~S3D@DBzUG h#~@wţfiv51rC͆$K>D+4rTLB4X,94(p&1FǓ$PB[kiu!.Y2c P/8forՋgȈ-!WS8:/v/ܼ:â+J$ ,cb8X==Y)PIMA( -Hm`J˃/KW}wЫ;T$ ˨̟p׌a4 sw`1vJR?輑9rYMt. P3):C5L1#OCʓgflO+'Ju/ pKn tҟ:x_ȭv,۽ |YDpؠڇ;7H{U cF;w)$ X̉lX ??HyӳpmnY 1hb<2A:q༑@bivήO@ AiNtRa:̥qP(൥J#q*:wh=]ELU"2. `uAKdlQ r :4;#w/Ջ2y5cWZ_-ܶIn&m$O[BCvrSQ€_F[7̈Fȟ$1m.u݃p*iD>( *ޝ&զmPZSd'֘i%:ޅt*Vnrk\Sj rv-ߔ SD˺(#v %Mr iO+ }ũ vuecw2$d$|TRK%UMnpL +v7 u2)mC 263B4/|?(Ԣ-Q~tbw(y3)<-HZ;@^[ז͈HѺoD!x 5 0úY5(><#wdiEU7r ؗT*g% DA6پ*l!icE*O䙨،(ioӦHT>%}m$bA8ᶭwX{KP~[u>"& LH2rWKۯ6bH]8-8#m xC#qx=76ہ8=@B2BĖ[i}}fSZl̊wZ)үf&Olw}9zTf@} JqNvT8-xExML0,E@I d ꟰{DTj[B,omE goP 4+Aosf,ș! l<~"2^:l}@%FӍXt5K$6zAomئ~d;CKyT9.$YA>A8&o*PʮUsqo\%@ۡ*%3XU_RPx벩4 Wa )S'IKZ_ׅv}A?6Y)8M|=EFfqup(!b|om3T앪E.( VjH߻Kaf wyn@qO2)9dq98E@?*{3j$Uv .]ѫrQH8 |~s' 񇆫 `$ְ? 0҄<D%BVJ<opqtK. tЀEmdT6PYOlaD}a\Q" Fp4RS,nuLLfm7sg,x:$JD'!Fvx^N`/M2r`EJ2(prrJxs!A⪔>E=Ћnx6"3bz¹Fڮͱ[碦!SdZ ؒ$apX+@̋x ܰ)"fx`AZ.*zBK(@*]vNI[M]BPƲtMQA= rQ6Xg~,xat+=\ZDvdQ]?$zL(zB"m ʆX+5#;7M̡:\mjNSP 鼉 d%EZ-XvAn^ Țw,g*93Or4]>~<$F~ήR27IC\HQ1b}С?~*  bkׄ&AdyiOm9<[ԔDy&S[ ֡%FeزO17fp3YM ;YdЬLy)SC `_wNY5lu!bL#"$lriBA{cr^Ϡzfg>8?QKyugL^[o@~`֗73JI;}Y}ڐK;k5%=< HV [SfԤ.Ծ1Ζڙt(l{ChK5|%}E#܀)k=ݱ4cJjiYT WVDC%(̶iO"]1@ 5tt5(8LY ȇ : uUxA Am4z/"5'Qf2m,LɾKQl}Q5s[IRν9r`2x\['^lBGvx0k!/]Sĵg=y]RP}nPӺNI,'(t6_I5H6ږ8> mf:*,*{(D/SdYs?+Q(NSQQQlp=* 6.QEt?mnFS^8WnֶS8jN?H҇ػuI3W8g(nqƤf(ic,R ,^շ5!$~APtx'L9yJ,ikaz{h%i dpQT)x1 P|]O@ 'mBX=Ʃ|>$z@yP3:,4)7ۇnd1#7Bm=+3{2RSfW9 $9=/c٦qvF<[oW(}.,Џ~^QfAlA:&VPA 1%"p|&/T| ]j5{5aBaZ']>aȞYPxa2ȻoMbF,S^м=jUXːJ/=im{B4?%<tI$O@\yL[raeM']lU$.DGL}m|_5V26^t,fPh xi\CSۻM5")çـV ^c'oU x*>v\EE1N*A^clEp#%Y5*czrAt(@4H@ODwQ+ah`~<]yI/o*I^p/z4vC'ٻ0W}U[4H Ǚ` O\'ޥ7AK-S~ <R2d'0({x{q5M:zdIOI2l#R-Q('dNu,rҝ֜lтI hPi~@N8Z2T(Ƿ'+0 (Gc8JUTNF%()VUQr]|ѭFqrj4KOr5PD.!)|!ySr.)(,5GM k^|?&zUH 7ie͛ykngCӏiCITb \t@W+79\(|HcKvdhLoPZ?'v"uLm4Vwնl`ybI/͹_beٔzۿ`$n֦bR2lv-9E@!bc>')-FYS'q}.8SjvTutx5+|ytbc:&NWU"w Ȣu|XΘ:P6O 9TkҒ "QSbnHXk!7sIA.N,SΖZBR;k(o=7j@)\HρN_Wjd",Oeuǝ$Wer Ahs}GAQ_;.UgpclK/Ib`fYP>Sp_{ ![4) UI*nj՜rQOU>t9Kҩ'm .z̛Ef#%7cYj0Ea]A-e 3lEO\?3,VFo}K-@dމ$ߺ!Hu9rMk|_7bX4{#ODvVW'1SIo¥s<+`D1o9!Wk 纆NU&.k;z5SE0`h< ܚ㭩kiilu%Z՘24?EskI|ڐ !PSVY*D^ X>σ\&QHxyawyt0EݹJ%jიp; թl(Q}FR2Z"K]=>! %9v鷴Ưe<ڷowrKP8jT,la(N3]!U:vP҄˜Yj/Ϋ Jc6yKC%I}|4Gvzu 4N,6(eTPɂO ;i+ :N(XAH @kE:J@VѢDu>\Mgt TXohٔ1 # NhI?Sw5{lŭl7#WJDs+X /a- |@ c}o j|BBػ!1  4y("b|wkW~ܴ2 B9/ ^ƼU>h?rNvI\$7l%U%!S쿓J۔LƆgSSڭ5$|+r@T=(ṵibS%O+KZ8X(I*TwC"4) )y~r"t t:vwVT7q( C"L^O?@[WdB\+ه99y7o.}3 ʊBV/˛ v])}0@@RyfeP3de.y7VPZJ7b>nse63,um=4PϳpWd`-C3~RvĮT@nV1K3m؃g̖TU˹Șo΃ KN;m*?90V"wz}QI2c-hf*zVwb୥L-7K,2%*7mgԈ ֑9B͘E>I{(eJb"v}6ժy*480!I#\yfc6:ިJvoDX:o+9= m9R'UAS^ h֪GmdD=:(ŋ?=""W}HuFјR1='>3@fMj b鎛9DLjḤ]O|&׋c‹"Ey9tTMh >@F\BۄܤN*УҔ&YCn{e ^*Qɮ%ulc:ܬ4؜`=n ')GY?[ZudOњp>?L/\ $g2sa윜<ǖsa/L -6ql~ U$>qqW#J%9^|ILxnWJ'c]kOo<9` ]r0#O)-mάt|$NpVX C]|`9 ۖcdDN b~s0KcSHkOPֺX]"4^ae c'T ݖa>O5Ru2uTwȲ5 C8唐G:q #\vg;^-D bqw?\"Xzm nvn ƅX5Hf P~Z(ejP|X>ĢAo89Z? Xh!.ٟDthsg kfGT2YK34U~BD!_25YD-*:] )e٤EˆI ]5HG}o${\/Vbl1UTӾ *mxTA+ rE;>n$RJa:"Nިt{hԱ&'l)J ȹvjØ謬:8}j->I#.dW!uf{'yYP5O"3rVth@]q~݀X S߹Ϛa-kK4^WPtjMVT`͕ Vz7:Qyyy;[Wv]M zjr# PR ʴ**; i&.IvǮr-b_Be+t]&'*ZGdV l!rg/NLj%O(^&"zYRƁTE$Y<.S/j)n9kSy֪'AdbU*PtDPRElw^~JDz;6?zq*}jH:Ȍ`Ecc[qV( *qr!,kCёцq?$91jyLK̙<o>K _G[s'S, `O9qZ 'AaGg2'}`E?$i?Xf8]V py+:!27W rj v ? %{WQ?Җc6ʱlu$(ڸq'4@[91g=>RViã>,Pޫ;s ZxQtxڑ4t*/ o'J`g7؃c*YC[8ISdi0ô>h\ɒ` dM[Fò|yghحEO[j6cLOˬ\?n0 vtV$z]/S~>)a7%\d! ڜgB/d-vgk;ふ6)'qde.rDNS t0'fG@h9nX^Z/{n=<(>+e[3M>M<:mfTc1nعLؚaQ%I$}>Ы<_im';dp1{WS+(3JpLUDk$ {r6}"uz>U2pj&\7׏Sȉn]u'~:X: ',YDF#|e"[g.}K1B$E_c\?kL0{[2c gxc%1$X6VqE`oP%8RĦ) . gtߞ}B5WrZL K3gLS\ ڮV&o FԡFeE8` n)cH:ځF:i {'W-ZWz`}L7%>D5jwD<)Tؾ9gvjq_R({ +JUYCoʠf*?5{y.jršh^iW[^`I5P?Bb8)%лc6Wlߙ7|u\2TX,2ה״PofNq$AnUF )E\ܒ)zv4wL$@4_1#ܔnzHɋmPsu_.nDDn%ݏ꼸Y?X L1s,Ãfaq? 鐦B}f3*26Ä:~jt\ !V{~d >>o<Vρg|>L.]FMJ >o09 T8W^ȓqf i*D MوT,d4'A6|%=/,sTtCrA:A@aK%j:)yb m]`JgICg5.qce!Y[e8SF%NL|{4p.kdJ)[0tF=" _'(n]q Meދ.gąu2Pq&ዦLO'RJOK6qS9uwZՄWR\unw7ӽ@Vҭ- >:UB`J9/Su,Xn>L8<w&ӇuQƨ֏Um-Oe-]vU{{V3ƿK@dO C pz@!tҥq-I~ǻ/~0=)=ݯ欿Ƶ8egQ=UBm)J81WL7}MkU~Oց>q09A\LH+4A9Mn/ ,noiW~ & u-C^y &{7t*I}eZRp' H'9Z. 7 eܯ/+Y  XJ3,6U[;։=>h[0+Jk{v]͞41C> RTHY7< uW@ \Pd_ һ"ꍧD`1˫ZuaQJ1wIʋ^œ3e1Iխs+n`O)[-5YĢv/@&ŤI*͜ 䟇bG(lK݂zc48C+k:znx+<ҚDM{½5N@,MY# hgd %٣biG2pÌTAe*&VspZjznڳEOsՒq ҷռ(@=~1zAE}#Pt )T)Gy#tgitt-0Fz?(fPM-QtXfv*Yq|m{KKQE}aThG課w(H>,{HCBAKbSc '*ޒZeЗ1o?Sthd6j3|cP &s;c}MU^eFlLBldsetj,2}XĖ RP@pRRC P"ED$g7:pM*9B,`9q1nlkADPBRGE>dnToΗ->)Wʄ21|?^QXm/u8lZ4o g=ť 1ULɣ~+ҵl% OljUFUi3Sqz8e8ؕbkGs$a(Z(TfE%G9CM+!sG7_KI3̲w-EUTx2x3'q[`@GD3ۧ¬xurЈ2mG8zcK]-[Ѩ;iu>c=0Ʀ62%ؙ/W+-SwC6mDQ@=>\[+A '*9h`MiR@.gz<ˣF>8+!R>D 8Y.Kf.7xܱpQB?i!WVdWS& ow&|o|柿!E;ܙg(f^G6A5KRw%ܨ(ّӥ=9*֠:|/ _m;}0w&>M1W;HGL M' 2B0W{. ,A+o/&/\Ɓ^mђؕN>y܆٩Om?J5OuV}%4wa)͠d~';ϧ\Rƿ8OY+Q4[6GObP,[5V]>}4Bc&&Jl%B{ RSqbgqDb/3.S Vl @HMz=4}r\~ٳӲkt[[$tjQBf*hC0 rΪfUgaaw1ƕܧ&kc^V#1U[ qqG6c\gJ7#&R)Wv)N7po (f`Lt4b Y:bh&*5Y+;U^׋ {sf{bgY^k=u LC6~,+#D?ǰ[v6+(PZ:yqǞ \g1hJR~?t= $qUjUٍr;#s_䲞( ; pnUg9BRYps.1jw:j|z>ȍci|~ة63.BlL94A(.0@8gHp7F/ %gQ͡,C{1^+.3n$GCfMNgGBCL3a G Y`OnGT 0,MҦEb"k?.wp<-}0t'shJeD<'h3szLlvZoZ CQ5Y#>Æ!-䛎o#y:4C9x m4!<ܛ!dK3mXg0E^2R& ``tQԴ~#4$/Ɲ ܲCS;Mتܙt N,y>"cr {N- 3 Xbyuil3F+A"S&sd bQrY.e?/ z}7)d:_W4~r÷*a{~>$LޓTyKyޖ gi(E!p9"t@>acUW**pXuYv(ssh6MT@wg4,[2[u^PޛUH՗fvEfMb8BGm1 ь)@W@+U@oŔ?F_> yu60A:ؔ]&n\0 ,@KH[l[fT*<57w0ǿQ_4jbMP'y po!CGe>B BV³JvaLhYK3*~ܑ5хofDVz3-cx#kw U^ 7wUv9m#V۸Z8vwZfq}cES4(3VT4Ft K ]/bHZ`H,7pzqvO&+!DR{/-7 0ls!-)2{f$3jR!U5K=pq : FA>\L`g*$+ Iw 2P$HT͹ѣRßwaň(c]!gQ ڭ"Q.9މr3ldq-!^zr6vB,PK\,%ۺQ c\S% {WQ\]Lx ^zY/~/5DF)5d\BJH'|F=y9_ /R!n[&'zn53\|uAH"ǎUu03(G S<~jG& l1DZ(dȅ}Uِ1.Mn(`kAF=hvCqo?\E5ͷ׬&:]M:QKYE(<3ګ{ q{Q~#@Εau|DʘQpz-%G-x zQPA̎̚*<})AL@) :+rFlq"^AOݤ1Loa& aD;s%)/YV.ùy۬ ;. ׄG ў [l&-L3jCY4O{݉2*?Pc1>+S 8k_k0JMzdizn%ar֍5z>:$P  |R&:IFԤ|*'?ED@p/JC67CqK`I wfpLՌYۑ6ֆH[|`M% .M$a=6nHRkG>^y45d݋(IJqOL ]N#|A%1q_1 Sq"~~w0y_`T&%֩kF u:aR4բǘDć KOҗ$]5!N9Q)47ڦ0+3iP R*̱ %O憦p?/~q2 *L 5rP<&R\qI&7x;mp͇Osdžs-"{3$qWʳB*ҒDZ8PU9rPvKw1-}o n&آY]> 4"\՗r])H(FOV: >)P(1!='κ6<-@u8^HԽ0w8C# Z4`h?YlhFύ!ƒ+E^RE?WZظ} S@Ro`:ǸJ Qwbѽ֒A+=K-oeQA~_sԡT! W{BC8 $1#iU6<>Dia/H5gbTMޝHn64L<4џ+Fkh$o蕑.fuO~iVv|³5ҢyXYX}' }pYÞ ;BRMmؠ\2wYcѫ,(gxUy3WlZyhł/ Nx=}i؜Eb&4KtCQYl;kq:xzLh_aPUT:|a "B Q:ymq I>G7`6 $vHּO> ]Čg}_?9=n58l%ӌOV ,+zH抡#Cۊ<Ϋu 9ziwO!M3jEm1&Y[P\*HR~*=X/ /y@[[$*@Twį.zv{i:`"|WMb꯼~3"G[ ,6rV0T2n6;Nt _S*A `77\x yЉ e_.>7;"p4>I%O^(}?Iv2Z=o# nc[,2x2jh7D)'6RvxBMRKf5^Uj svgcgaz- Fg MhUY'Q>iTu ib]?\MFC S" O~Ǻl0onDq~?؈I_)2faȇFch1ef|aI^'Н柼 \z{uG'A3[UYFy@@F}y4D^|ƭ}Cӝ 8S_-$l5^xr8`, >DZOtBv4M6!s} $W>WYӈKS:f|l )&]] 4 A6Eg~8TJ xe<ӯ6XEBDAJyOu2!+**uǭՓl3o0iTΫ7eD3\c;C9UkSDv9I@ʘ«Qܳyة$w m$eh~%NWI #~{|wADMÕI?R3jsmN6Jo2J3,~ zex^E =%u1ux*J#B+2-;VFQy|UdFíM٘Y }onTbt.7βeN_P3%(QcZj&~軪RF!ѣ]-Gs[Ȓ4 `u^3 ޅθ^'H,5A#$&g n ƐEMk0)@(\/P$H޹T&o9}dū.frB8H~q{AK1u7_ gVF4 8KE w.q ѫڊOA;9䄡m KAQzLh~=*:v{R˯9-OSk!KwP0($$^ hx*T aF vYܕ >?aV=B"X B0! o=G7VgtTwt>/!fvT (:'|p+ژAÒjDa)qfxSjb DgMg 7ݜu"O?CEo~yjtB:hA4hiIIg# f; ڹІ [ ' I7XVu_U9x s(Ѽ"!-:&\m&70/[9dƶ16KL/RgYPzYmyTavHc>c.ĀJ *$K8 {g@b~_WΠw"3Ʒ;n]<0Bb `Hŗ`# MO?ٓҳ,1mPqd9I  ʍ&LA]*ݐ)yǛz|~-^uRf# ۧP{Glo5FC`)h0Rۓݛ}E r=fU'V\!0MgE(Wj1\/0<ٮ:5c긣ϱT UԂTFi ؏hG {{BzjZ6Ujuʊb寁k]Fk\ʲtY:(fjU"Ubh}.橙r G1X6D(WDpO_pLC_`h؉TY_#O;I7DK)/R*!<"FO!^7E}p&TX#QN?}(^P5'rk,qWXE1_/|yv&j/}ep 2nt VxN\fZ|qosc:&IWC$qz(2\=pd y$*)׈왵;7i8QC?] c>:۫nu!wg0?lY9j1ȅP獼؇G;Л5^EXx鳖-qth.Q(-u;AIDDnMԁ43>VVO"rx}CW3b*mV\K.gudNu L wwFWrb˜2cn>RzP2ߦ,]Hn ,щys?-jK:D> ,~Sq <*`xן{gijGkfSg#{wG_Il6 Z J:r6z>#ogu0k9EwؠM)mBCF3ңN@6Ν?zk%7__w$i>Cje&~2vGd^_"wJoO֙&EB˸eu efJA OayMG{ '$N:cr:2$CE7Rs<'4tߐtf8ռT7v_7`i!h~d#Cc $/fO#0(n>^K#ȂvjN'_0;ܡkcpDary2Y e@B*{5!rqKޙ~0mR1s/K _]Yzx2 4; 0c5ԖW\]^!Ô|;\JwUkniC$B_eWD06hKy#? o.R?A4bAxnB,BƳnjK-Ez=wN[Zb GCDwshOCg鱒^ܬ8Mnf?b /v$[a1eڂ(=#ye:"g\ |R!$9X@\Y "f: ?#<>H!?)" }^bp6gGTk޷O^ +maޥ-]7t+.9 {O;-!B aLQ6Hdq Ci[_5*xV&P4!UyK)b&Kj`p.xEKjO~Ceu dGFm̡;el?YG;VN&L" R,~?a 5B(}Og,[OCG?Y.]X|ԅ]Hl8, 6r]ԿӈBd\ŭE*pМ4L)e2y!=GxõN-q䑺eQ~ c"&8(5AKXxEJZd 8Ip~C_G:ԃ`=/ n0`"{ dϝKłUMZ_/rHGcr Iz= 3Y n/ϧLۯ5IF][SK5<򝠞 /1F2AwxhUgnA 8fɋK1U؛(FEG3$.L.m+)^Tcdߜ=TG[GC3k|vqP^X_:rP4ʀ,qzw_~P ﱏ[܃ #pfN)7%9IM * {^ -_c9ы֩~hqB2/:x* 5P.ogú g&Ɨvxb{Hɖw˕_i♼&[+{gc#/ITm\k|PpG! 2KU?L)E8D L݊߸i\:+ba,%RiBdq|)w6S4(U=9Wniˡ1pzN:πWB ]vy+8~y%]hԇlڔJQ|P1m4\FK6?wLe/;SCY`5e`r 2@UW׈׍4'璂< a al XϲhsmK" x !ɲCt؎"@ =t$7!t1ǯqB,&H+f*8˹ 1i.Ή񮑚b[~'N1'ɋPߓm~*y(Y3@&LA◸9.sȜ\`n{O(w躀-.UnXO)Yl7ec ~E炸9Z ]/RC*`trW}! TJDǎ17~ MH)pP =&{My%?E6l x+Cs 2 ՓA'O67cZa$fkF]*kԓK`4'% f;e ,<ϋ|%{)I [W4ne U]K{?<[ &d`r^]T.0@hZJ:3sM!RF12cԊ̈́ڇIZev^dv il .Okkh7/mA(3k{:TUg%_.ZjsY2d?6_kL#*޼;VkGP %['$һK :wu.y'< >{-Mq0 ~C5H" ;$]@ tHh:k+ꎁ􅭺P]t'rOAh1 1H~ \N\׽Ƕubt@l-PXҭ!|;C뿈RXv 3\-+b}}o0+0t5\+R3I&F1^O<(/1~dvE䀿#" i !m*l0h;s5ofZ&X*Ql(!=@]+Qa3 2UUQޑ՛fKV!`A*GȬ 5'75#)oނ61Po&P'%8ٱex 8SDطW6P A, UΆgsE8 })aOi-&gu^.G &a[7{G|/QP#NCbUGKS8UHY"g)*lذ$I[|''t Kj&n8&Z[P8+ݩ j S }8Kg07Јf $_ݧVC`mTT2nqp"g` W@ED_ۄWB.l fPQ0݋Yd<wn(0y =!Vc+6CYK\ &s,\Ѡ4n]/|8g4t$ !QA9%}/ԟE2ۑI@>8#`Zro|aHАt:5J(RqГfuśyfҦi *S[ *4L"CqԿav"O#'0j`ik 7c{" WO6.E)iN7RF|LBYxJMɞo42 4x3ᨷow~d!=>Ο >H^$Sh>΢]79#u4L%|_7 a'g0.hA|xBgoV_}cgq\H6Ϣ㉛{fdo67*ip coP ^VUPXmcF}4g׵NM곭o{oǫOL)kDxJsD5_.U|,VvrE6cm$;KՌ"/F@8cb}O`,^Y8EVw!T}Ӓg WO 7+8E>`p;Y9ّY 5.}LU6kWX=mK|h,'eK@="'bLN1v¬@³p9MD-hP|$e':\|&gT\Kg@NHaR.d7rr 7N1Wk&+3kk|낞Cs1[xzFx,qoۋʈi*;ok-|JV DxU[% B䅓#Po`0HD*nX |DJ>xGGek|ЫU3D`Q<{0O(73,MRW/VՉ&t \#d+66 w_ #!ٮ L/!"7s- ʡ%m;yHJaWWB lv \^'qƵq=^,r![׬*b2:;)#]u.^vqCrod*$z[8Vx NkPyϾr1)!y㙩|wwd k fh bV)6" .SYAR3"qnEov/%u3cp1XN@-i\ c_'5nYO9&[^5ٝƇ6ķm^ϔ0XW)Ұ,f;žOW}AM+i^iw8:uL'{$X ]PdCeXؽoQsqqe`׺)ImO_t1,HE5§>Tߤq=I?cVWrC?,C3@`L>\$%vN{!ٯX㻕t8 |#l?,UU ]=+):dkhϽ gҬ}أ2ra>xFm,!ILeJwF0F|S2kqd[pd{$o~jo3&Z ?ZqpS@?sv5g=b_lo6' h+NXIٗR^$d#m __@u_q,Ulaπ66nD2g|I(I 蝧\X+J=;&b̼7F`3W-s3A9Vͤbdı%p% t*8x'o[v^hֳNU+ dK7ǯu@RIݰdW)@TF \KwѮ"4kz #jHZuf>Ȁ(5Έ|}-c5e.Rj~: f%7aX "B Bb1SfzMT`a'w= lB>R9۶8=ϩ_fҸ|,N.= P0Sܒ ɹl[@WL#2m}6?jUęWr6rDR^fb9@|R|6jm d'y1 /\DSLg½ oi$rȢq ju AXE Ai`BI^ @$bĞL/:'ȏlo,7$9,_܈x:> .]I&'i\j+ōA?79*F5<]dR4K}~(kv{5;wc^fn~LOORd;<ȹg6r[:b>=%i;gB8WǴ6IUY+'J:UF 5hq ZH s6WGq$I[$Mك|őwa7D?h1j|o!wl)8z )l܅؜S䪋3gfxI4X)ڟp_}m״VKx̵s ؞EV;g9H}aGaޛ(0@R+ZZnMD>(H#̥)=kp1\fx ,F"~fϼ6įzgyWwȠnZ(‘ձf=2S1'b4/Uܻmv;Se(GkF0oD7Ps]cñYLFO W"G~%;F[\bQ&Z@]ԏ& mR9֐GyXgK ,#2Z:zg`onk|!rfԹY̓,07n[_~Esh98~vt1Qt{Fs!s%=ޥ]&~j_װaV>vOYЇbf6p.k\/(PLyI'5!Tź2bQ5 ϮI/4y.OeDu83\SR/sZ1TFu󫪝hh+#[6e?6L԰GXWX@i:V;?ycWS};c>3>IڨD[!̰4F|ox?{J:Jgby!p֫@}fJ|%w07&FNIz#g}"V'߁j(Vhc=TkW:ϋcmcNR[dcà ‹ؖk'/q +\/$ 皯/<;s:nKہhI5M)<"TL;S"3Y;^:4fJ -q5 &8mI'{Ҙ Fm6c4QJZ|a$d[W %4 r GׄZc6#B<6Rw@ VK66HP NJ+&RŖuvsWgƺ VxY I ݶEΒ/&1nK4N.;tIb iHV&Մѹ^Ĵ>=nV /cDERRՍH(v]aVf\O~ZbG ǮzeZ9dVĿ)8ݔK Il~]Jr:P95$Wsj`?lqY[UA5c@_Uz}?H&8A !+! 9M=aYf=xs&>LH Ȝ@p?YGu `wqY:_^!mb(?h\4!T[hjK~'j3G٠F|WαŐ%|ԙvRMnV8ZFs +!C^P q#G~ )Os;2)_#SGJZ#r4:r_РN0i`ӚVHo-l֧1u>'|,#~ҶdpE5c۲MlN]%}UFM~^|#r!WaA'B:2O#^3.qkFR ak`@_F}>\2.P ҼW& rx| |5)U29ROee O'r-ݡ͖W λUF0h[ĎX)8 z..P߅V l5ceJHs m.X$YV *}5;a`yzOofdC:˟0au(8mFK065ۼs$'1;Z3#أ^{QDHk-) VUֳ0pu`}c@{kCsuDKIA@հO  E;wCkS0ul'u /0<<(Nn3^λnn'wf}t( +㢟 8"W[[aKŗ~/`X-BC)y})"ݩX쀑969av8Q哀=5RT9sPmegfC:QK'Ћϸik6ܗueN;9,33[4qttBV GX@[ݽ˒JZYp?i>~:[a?e3E(bi8' aXAHw-v^ӝEzg? ^v(OAi{k;C?\@{՛*u~X\iˍM(N;PG oL :.eC%IEOTP-D}K/%o=">^$ꈲɮ3F/zrdZVCgH,&l]tH HSJ3 Ybr`e_C$?spJWmܨzZX_OYZp}b~1lvEThI!clWCh/Q,n% 6>Mx 71qזcQP 0M2T786̈́6Keo:qwVRr%bl~/LYZP=]*O4+׾"-6lyb$|  *ȌJԴo5 (|i9/ zI?ADJ)ѵnϲ=X'$c 'GbsLLnZ.kb\HTV5Þx1IR_X sjAaKS3'X jjA>.=[$Mz/e.#O߶'ɪ_1VޯAUmngq>e}KPVUm|OoЮ`O]kR" [{R^]+ꂭ,"<<k"iĊ|| 2>2Jue]{Yk;qJו=hu>ϩoqǸy$s7TD8тI[TcUL4&u}3QwK%ghv+-{G mRף$,x^=%7nԪN){1ED`яj 3nէHU%pFjcY]ơtV($Szdd' chXL"‘pLc!NsXqP{3FD'{ yq3O>g޶ FVVl_&Rf@Gs>2q:!2X2z2[-; @)AFzY_//ޏfٗ Rb0~"9Ya;lP6|cQu%>|9Mz 9J67U{QhJ-1u:ߖ/dmXMTmBU9e.v~0cش]Ўf0Wn 1JU|]huĞk3J+O<i+IuX`yp@G+Vz{3 F7=y*7VM:^ _~f{Xma-QDACA n&8Ψab˰C[>-g Y EoMO56y2:7:.r`7"IPj= Fy >gzG)49Dxzs)o+B%$P*Z`XMXZ1_=9- 1s7`8d{$̯OV"0# =p8'N(دA ƶrH JwYq5sU`^Qg4YJNWF cWJ$[ $K^ y]yex@VyZr<ڼp4;:uCs•xY ;3-RD[ΤH^ 7$˨}w gщւb'ƶhܶR4?XAbTv/q#I:NNma8.]/׵bk%<" &s , /h>e63v>ʡҨ0\D@t XX|Q׉ߑVQGW5X8lUC`گG,˯ݰ:B2@Y$֛?jO^˶R~:)_^NM]diˤ<y}?*8vBpwx2 P3/l{*9g@aܰln]Usسy<5tfpyI"[hK.) w#| GY;Ɏ7:AÉ}x?:7:kQWS嵦Lm!pXڊ/g+$ ;E v-:(P 4M%㣯qQs]FخR+ӎ]A"%J\!K1GÂ\k^)7* Ŝh)m ڂ E^xj?ՃmM{ [)i?ly 0e1{l^#`4ix#רv,أm3^tv[:G:yRZZXq `2h =%5"Yɂ??)$3m=&9YV5ȉ| H C;P#Į3\uzfW,$Y,v5HOKZyo| ~u3ZbEݑ炽JQknC13k\?R&w)T~05$# Dng²}o,{$)ѱ+NGsBO0{rc{*^S5 eU#]~Wħ/x}|LBȫ̺R bEOR('jW"PnW <o)V?4CIjF6H5n&h]҃%kD޲+"g>ws'>@:BC!=" 7w!^!bGH2D rZ&)wA>;E4wOOo`/2޸_&n2UжQ|X_NT%/@?5pUWN;u  @tC`شU6!3np?/k >TiP!^i6M"MX̢ /lQ>y6 ^ib}N[2)^mqcdpK;VT+B~d{&rzc{H - nB%n=r'ˡK: 7"{%!3|jTm߼l5X8x-Cx48}QOM+ipUmݫ3婒NiɀlJH^[m&0?iB4R0+xM±ī=x pX W΀.PDYRܻT@ȣ,XpfMm۠cO: x4O47`A_2H56 BUl?XvKW2u pQPe -"+/|"Yv9dGrffҪ,_08戛5ZONhjW9R 9c|HͰ67pT ވ-h^?Z y\%5" >7i[&3XZo~`p=-g{#@%3ż9QC ӧ` OrP 5L@G_lS: bުSL|q'<{ؗN_j))9)$7#a^x37ŵ% viVӤGg=RWI!Q%<l4dx AUUTģ(?G>@y]?Zo1SڂR҉c)7.YP@TG˯pJ T|D Y?R xAIu5ΨD*<[pS!%7ϖiZpkIaivw.̠]LW-eyz9&&L&#V{ASf mnH/`kOU*ԐkH7%CtHٝpX(:ړʸ #gkDF8u[j_V/U֎gƨb˾cuJ+ʣzQ ̯xy6%*M]>⫬+=)u1ymk`ӕW–=Ne mm|z_)1S+ +0N8L6 4g`*yb)J? >.;i#2⬑cJ 57 Wb&~dc 1`џ}$˔w*.`9aG#옎LT,}43ɜe+. kI5QI*wVwkRkК~Ho\kt:ӦL0R ǢDԡL^ZX6Cغpw@p?(u郀t 'Fhʞ(Ȥk S&&0Hmf}wcaX5Hyဤ${Ln҂{E01A<|[h?)wlNIjg--#&RX y2/x/kC"B].,Q-\[.Cs3xUZdd,#u,~#G릅ot:|X2\Me3iH ٛyE/S#@(,*9>oKMk%>3I{dm_SǨP/e+"xO!5_q2]a  ܳ5 j=XP꛽?~M;7;uf6I~S  #Y ))υe;UT1 ӬTgH9d ApzK!_L:/+j٦x]*^hJ!Iu?5>?-[|9bшAEU")mwR~? 1<zEgځ dys{V-cڮ`I<ܙ$9;|lʰ`}TWLR0E8DIqV`EVΚVy~zW\[Bg߬%^$FMrsig'JT0%>N{7;0;"ޣ59a9VstH:F|8xFw师N5 E ϒ1uk~g](y3ajOi$4H* i3. rV tv{@ S #@S7M^n⺣&Vֲ~eƁ"5 V0c,tCĬ?Zl-2x:q ؂jk)N:+Nɱ̵-T&5=\̳i7+JK$=0YwvV%fd|-f^J!tbNQù.u#x~(veN#fb¾\%!P%) Kr` AVWe@o~`!81-ISW4.xXF=ӎ8~ tm G`J'?]ơJh3>WE/Bj\GwfP֒;3쨝%Q+ݣDcGT5|XrWkw\+kc!Y8wCq<2exظVJ9P sĽː= TQ;b,vZ'I 5{풩蹨&nhowu +1Bm[ `b2n֩!K},!0R *Fw,{6Q%'KaG5ƪھ2*Dl>gN2>,wA`2 Mcw' P .%CaGeɘm}WmdC1STE.,hF^Wc\kWHln6:g G5:];P7K#їhأt&}Up>uduX 6epM9).'!DEq!Rk`+!iIp>NƩь/6Cԅ#̈z: 'Ň>.4i@:+|C ? (E҈eKlGx 8nȣTaبso 0$_}weXw[:]Q" !&DQ;(fE)Cm Ыo8#%ja@ :CAYj.@.|7K ^0z1Ց6qQeGoljrOX/0Dp-39_e\|R(çV>I.Qr:UXԭ~yGS0 *VAU3a>8WW`@6KzkgG:-A(q;OP< gL\ZV:3Ta1{ehS%m%)M^~,@G. NF5tjWT$4 k6o<R _]h lqFL?olTAB^~F f;.4ID0W;W>4 gN!Q ޤw<%wrͳ/&m)_RrG-*ZVD|\q{ ]$6ʬE&5"A$?.7OQ&t/{ǔiUFSOM,]>w& ;K-076ay3v``7-,Wn\hlHG>[+]z!Moe8m )x`WnʦR >h^OEΑ,ߝ!Z42W0U@X']ȱSu ՈuU1;a 98m5GѾ6튋G^fleĤl<0HP^DCw96pCYUZg72QŤno9W۽2sʧWZ3T9g%c?,gd;L0FqF/ieaGBHGq1C&",mHO@xI/@ ] )^W}bT: 1i:zjq_|e0n8DzʳJNSrH$Ӛn#\,$m^vbA<;K IlQMԳKNp"pvyB!s%^cK&~!{g; ^Dzy_kA`N6xDeJG3[4Iɝ#^B$2iC3r paVy[&﬙wM#Xf]IygCRՉLߜ.uӋS,y!#Op=6μ aju@؎;Va&ͫg~OR\ߔ7~{ d֏lA3h 7%cw`VDt1rD(1ex܂फK R;z=K_Y> {;e#ݾooe݂á;k\#hyyyu4Mv}k-T O_6fgB%9rq;6c =L/c ݛch9 i$RI % aǿ 0q7,;aB@վ=O1/v.$p( 9?9^=/};fYMP=Z"sc陇ĝk2Ũ5+<2U, 'APr iJVW~2ooE/o7tsxQ6Q"*/qRe:K.B*8d_tL }քWnoo[,JȾJl jxίq[JPҞAZf=틗97EY4Ū`<%.888Zg\6j{w-H-Yhg٪о!=ZHH:l/`}oAvir'%.QHې"χ6$/a,SHm}Ith,4W~I{i>w r[}b"Hws8ߏ_2+^#3(S@y+D13l=]DV+J^|7m,(&~͍`flw#2"UpAhA{JUh0E{&*=A~sV 5J}.m$_WVe{&j/ $ ' % ר2ܲ.FZ\sanZ@`Hm( < ٌz7l.c/{^:i8nZ5\QRBm^M٣qTM_KN&>[(0_m#u۱KX}7jPc66QxUj?60G,l_k&WGJr꡵xD%l|&u lmh&8(_)s{'haeXebӟ$i; *uh+ǑEp[SwuGN2g +h ܌8i68*:HMI^!\faߠtՁLIͧczż[?Nȕ #eW_准LʢE h;8dA+a䕬)r1|| M&ߒxLݽ"uJH1L1=SVFc@Supw i_o^kl~kQ 0a~|T_3N.ƉSZUƵ+NM.@+D\Mx[ܩ ':I^\\=!8:vBoH*B&ÒIʧmV_G갻4Mٲ N(FQy)p%96]~/p}O@=>9<|c$$?6^VRJXu8{+(Uɔ-~<EK\pVC]8#%kbP|b{bb3O \`_[z#5v-&p*.9zi>{B]j&ji*N(Ol j ɑLKuhFuמ4ؙ[ݓzԬD5Nj+LHQ@Y6b YbJpDi܋=%l_w |Bgw#u4ذY gĖHEUb,xGN W(w%Xi*uR(,㬒C) &T<|Ƃ=22a/Կ~+Dh$`״ڸVƾmoًdXYo1S"f=dؼyc Ϸlx. G꾁SlǤb C 1hnI:.Ei`yَH; J+׍C6c_>P)2ʶF%v|iKFr {Ђ.Ϸ9AT\5&.ÎQt[l5-fp^^j6ft≕eϨk iE ;칹44ýJܯ-6-ފZ_pЯV>J;h78D oLIrF=5hn'GC$Q}Bu+BP,?U\l!iv%^*n*ܠIgq:)Je` }Ȼ>n^g[t1\s|+,K u@vi_s\(Xkg^krA.+ss\8rㅵBPPL9rB_vi5ݭuz.Nnc Imi#ɢG`MF'lMYq>KJ| rhr=`/ -֗Qq(ZՃS+ |@6 ^gz vRځmZ̢砇ϱ]g*DUb<8QeED>O6ͦheeЖ\ G6 p#LUNHj<|d=I U76¹xXNzCHdm'8pH>=fH6u42O5 6/a%3Cg0l >+,T׫,y7C5xyH b<C ݏtJosQVx]4FvGJ,xKzLSb wz]==w$2'w'JKǚٝGKs : L8 uPٹ]{$CײY7 eV=Q`cÚa[A4o^#{痿c, }f=n&+.y~!^g+ {-|WQJmSpZHԘS%4VpNsBnD>}b y-{ 7 $-E-ب^}"z(&Q[ `>at?yZmS6OfM&|?1SmşS/?ŒeczHzICPrkF-w4=չG]@AF6GxهtJeę/$gU7_b07نU5?Nq^l4/0oJwP:vpj51?B-z@f[*/ +FѷeK?69듽w+uCyoJ#ˊn7ϝ#EK|ɢwR]ۻ7 mnX%qyߨI KLXVʖS,?b  }op?W/G‘>A{=˵u\^ "w e_16V55:[g 3d)KnEۥ" L(Wc}Z#,H"A1)#v(ExO)Av7󻖕bdD))ɽUY\vص@;Pqt;GYuwlCd]ɨ^-+1e~GS65$@e "#ۄn`GY좇p1+&χ{Vi`4~ N,?NThR){Wv@I pCPFϑ`Q푙X&g bQU-C+2R ʽrI9AzGWln''t` jf)\ ,}*7&(r;pU#-ק=/g_x'j, gȬ(WKist`` CJ0OC i`5:$%c2>Iiɜ%2f|UaoXKb:쏂mwZ%T@ysrf#_(Xg/w)]ꀫ3jӼ)M{%Ė#MH?'73ݶQݥxKe̲v{K{rxUl/ \CRC%:'d)/_g5%ќN^WR_bm~O/o|n5"9%<1%Bd'. YublwGcIˣ0wf%qR\OLڸ|)cșTAE8[OcCo'ǧްx(C4#~k))X߰r,XsH&%7J(?<2K7T%%U!j8xA+[ J4Jp yy/Oy/\oqh4^jqC J qpBՀԣ8-пb91,^\5RQZ'=MP+syZC{filޜzߵp]$qxߟYR.Kh0  6?%*IT7;mܷ,m3w8JZψ%a !1RxP/v5+Gbɰl}`ub71xiѫBNp_]i]Y:9qgՍZ_|l"QeANP~N[,cَNuZ3x=%+!T!ZQ^l;?180pDX%4rwP]`ÙIWԷHsOU"L4}h_~JwAP|/1my(N}AՁ{V7clevܯH8n c!3%|j5vcs5oʳI`o-rM$؇^+ f'D t~W&K&xIFZ9Ca$Rfn2 G|{cz1/z7nZ4Wp+JWC7+wމ]ې֥;GB1[w 2 sYaN/]_7QO#ڜ,[`LHjx*,̄3f{GZ}Yz cqz@P3·GT;6!F {w 9jg5CMUPncSM?e9CyI* ^jUX6Dy]`W*rf4Cg*}y˔.VL A 4oʶ}hTE8t0l2!0v/0' I5CKm:x@짛:ЩG0?l aEwSHZ5s&xg~-g'OMR[+)Ց/{F"FBs2wVǢgjΰBE(W,O Z3䳑^`>lrprZy tU X ÙDutI`il^.5TYwXi-+fk hN arCI2Cdϊ.)?XM;-޼ĴFVikJsC!zKO^A)Լq fabAW@||=7rkdC?jzݞ8 n ͙!f)(Mp#rQ#?^U'R}A<̜.jE*&Qɼ;hn';I x@P=m]6B#] O_4{8 = `z ⛌㤫hw L<v$ Iȫ&(0m;t`{^Co \*j#ß໒н*OCnxME~?\D|WnlI5TLPq7FVx`6cYDsnhSvZ %D}4-6bGB?#]$lR|YOd=(] "%?EJ6'q2#EC6 Pj\ ׭ =zHڽp?%(YQC5@Wp2%#Xc$B#ɜٍLmz` ʟ̈́Jy,v|0nMLw% ÛrcxEȕTX0MDBdA]XB~;i\SԨOEϺgN?6+[룴-HKbanc>>MTs ֟غCf-<7p^4K!];.qgܲTa2Du/X}D֘'di-zz FrPZS3 mth"l/8nە|K 2e50= q~%BLUK[k° fZ0OoRq[j. @5vMP_cka,NDM6(Vgb@揳#U6N.xXrMvD%[z$1;/x2(xa˛ _=n:0c8!K|Fr ̑u~t -?9 8'Ze&PmK&?&׭s..3ǫaӦ਋HS;zv'賠Gg.cfbWB/c2~_|_CSFՉ_u~E]<5Qm :h9Zs'8ڧ?I(ר o%%Ivw>]:ڣ-!$9/jiW{kN)(+ζcPQ1wc#m`lFAq2{Liu FjY"T8a5ԋEr:rkk6 ,dF@e~8JIfnE`}]%9ڢpXyFXuctzb+ >c p hS"/b-JRׇZ}VQ Up'_:9좹$%6-? @KH=JDJC430{+/0al?p[dqdF1` inkE퍭Ĩq+tn gAeuh[)"kqƔ-dYJN[t$i|lgx-ښ]xCE$v郓<#6wS/?J΢t&=qctoxh[ GjOP:2Uwkʷ!7V_cų2zn|$o q2ݪ r)oL4:H>]K7N="&A =2|ٺB;?d~A\5ÝrA6' ^טn!߳Wp],`Rrwm8drM*8%R#\M gBRA\4M)YϜQ8Eï}AϫI^ﭢ)0nSwϮPKb3,`B@}RFNH `5ӊ5O'_tp?z@LoSzh$bQ[@K/5 ytMtb!^mHAV@ZVC:˺a+Fc:IQ if.=Sy/nre ]xwD2S}У}E[( VqиsϚa'qp%!7F&T|@q5\q=EQtBb4U9OĒGLI~2H&6Sˍx͟-rk4lF QB h4t)L,xbcV/XHB,WG3_fDÕ GK︸I o{s_NxM ?P(鰌,رU"(f έvu1f~ Wzdb8Oy 1F7*%tʐuo |{x3 F^ߨ?`F P: D)cv +`vZ=J^,g1m6k~%5NFEFҐ~~.At?3 /K]V>jl6fX[Ӵ zdK)8E|P.~\A\ODRu|[dMkwz :Ԧi=(6Kg-RQBef F"e'3v<-6HIIkuI)>񗿵_xRmՆoAJg'\e&Yvt}%D.kvX\3DH;sO #k&sT~̜t>XJ\N4f=ϙN4'2NŴ!۹~M0 'RD7Pu+V916eg߲$댃?H:ʔ!F>i[HJ:L*保Qq^pQ|.0>gRWy<'8wJ|FWpy]\f,pN~['%OUcqG=3 NKŊ 5IY^U]CV E\uFgvCG%cSш˷fs?0*=c:J:o&fa> 0ݠ y-Vprvgd\mbmSp]\xBDji65M]З&kʙwA@L9,.̥wxB}=SBkc2Ҷ&}E OF r7j[xp/JᲞT"N=d4AϧsڏC87'iY ʾy˓ht4 7NK;4ɒ0"ZWR}5JE/^@q>m%JIQs9uB{{yPPÇ=UYn 芧?>چO:N>U KY [`՘ϑ:5ocL!6@o&{Ǟ;c.x_Ҩ|C#H҄n!bxJ@0]hzyo,C!g22d.r>t!ͥʫ'cF"2ފէ/1tsفЎI2koum2sjb'mFHÐAÖGqqk D89VFD&4뻹f1p曉3E/xR52[9F4fV"8AfE%Lܲ(S/ʕaa(BEpmx^tb~^Eހ)!:e݂]>80٠10ɕݥFMϚr]sdH<8Z< Ŋ66704tv($zvjİ&ZB;/ɂAJS` Q\!beB" $8)˚f|7V %ccx"/h5 JՉT oyQs?t8կټ1[켻FG CҬ1]zoϖ&Xk(9mV"4KOLJE9zrv35[[Muv }gqzTp^Oz7 +XH "8ȶ& =/rDg e1=˚/mH%?9a #僰oyn]wjT'ϋ8> y:Zwv[_N8@i0ffu1(3_گ))=v(|?%9#/?g–`yPDD YMp?Eʞt' q~nP uW @H.8"o8b 28¼+o-KRe-0䘩3Y8ܶyD5nH/qO:)cq]H(s a`izk!!lb?v}"tdLin^B N#>Pŧ)BQA*!Ũ;ih3!F.1ؘS7n٪n+[50aau38Rlڑ<7"dUOL*QU@{$bN-֝$pGP0FU$wFB 8%[6K0;FM E;Kΐ✀0YFժn:(Tt@U YxڊGf߲_ؓJrP2~5щHWC0NhTѲ2B:4h']@,puB)oDt5^ѵךּ (m;]! ph̠AgF0BuLi@X ۄHk0.]v@ -0rI[2?H ѢA5[X]{T*.^Z=r"`tn=(seI˳}f$vp T7yN=Ù3hAZI|uES`bS׼*YI"!2=1 c Pu{G ((4hgCZx62:LGc**6Nl@ek w/^JbaL j[BݩSR"׉[/Q%Oq=N` j4G0m'iȧn1,ܲɳ^5rnRR `4PIYaRHHX7'i>ӱfr)*$]*'*5[Ԛ8 | ?=}B"jlkKfl Xke,ek7YK`č."s pGղvls$KmŔ8Ty%0.Jۖ]Vq92G( S=/6̷a~Wآ|K6Rdcۿ9ʉM9M3dn>D vߝ yӄ1R~%~bL`R/ۯq(>[EQIء5ik c1r%SlJd<³K?=N#' /R%(ӆe ǯƋix _Æ\ 6bӲ9Q_?^7^~жEQ?]tPtbr1eo-dx: =06~|#T9ă%&/{'$L%MAGa|q%&"m\twB5>LsCyDqؠ9& oA7C&벙Il{0&> g'?ř8 Xc0,bplz =/a`D7&e OtOfDNMcĝjϹFOgl Wxԏ4#sa0b@#}Z vfA9F{)j9G|-y].79s2DVYNa_3P b8x(YޠBqESׁQ͝+Ŝ%;) *>r-HUCO[L#ɭTͻ ˋ+ۂkXN INJif-°wSE+iNzs2VӤ}'z=OX QcSn_n*Lq(a<СV U*?GAi~aDSWywu+j `pɝ[@qi*jsO99ffQp# ؾ9X]dY# ޙTR{4)m:mUIF(`0aDI+ F5l&5"7O 6)!j}ɌD h z:}]ϗG`(̘DgTu3Hp[h ;$~Ő'qHQ!Rӫ)Kam ;GJ%]Q>O|oT&I! s3̽T,-uuwHq4T1qp4`GyA:O)|62@X~D:o#=zJ O2nH7a+ڿfQ#QdMXN]̞4T]DqoZan<(-3 ;}CXmew+&m%̷8nn L}c3G"nM` ;COW>; uFzscgQeWV7SS=: 7^ WOfX&֚2lwq#Y?p۩b%wM 2 ?lWx1=\7b=[ On f4{$Pt2TQhAg 9ptO2Ȉ=H2 MBvqm,k3Qnn1w,Ih4SەB(dWa9FH!$S@>V/rx(`9{/ PO?PŲ{'hyXhzAM囐kyAK~+пs-jZK61\NL+0Z8zxN~26\OUDHSUyDIq`gle =IC8{&UP%l,?$EUKV=\ɁW\*s+I*pj3j#]jۡ"IGb>_5X tw~\:|" d=aO<‘9CѨ1t+#zd5α؍Lt@w!qinUF(2I>[00=]9ʧ%Px(—=ExaqYE溊V6-?#v2rGv&ŐX}Z]?h_>5oMq%;1"ŏLT OIX^Ig rc3x?حhiATl~.|@ZçQJ͡ԨUur l)+^dZge#A}Jar`#X^-=aY`STګI8 a4 s3V`_7C7ۃ7| J֐Zt V&Xv*ddY_fBdQR?RR , BArY](qJٍU6yS_kQlTeh*n5ōK=׀,޻U%q뻏=rp+h }2 RMU "0v1-mRyqa1Jۄ`D)o}3R)yH >0j=0 $$~[X@U]MMNPsm&X7#vzpI?:Y@-EƁ*AĀ㰜ܦJ}SΜ?*42BN>&NMdiHve UHzD\HΉ-a-^:a/ J?7-Ʃ{cFYT31 0T$T.п6V5"4Cy2UnŒkk-ǟ: 㿪fG?JU z/u~!t<>+J`%zߖhVG -кZ^ԋ:'=ݞh8mWP =8ʯ]0BJ8hWbu?=T5]lj$qm r(5\J@'Dwl ݧHs?•U3v檭dW¦ >(϶t廹Am\bIX~Q{M9zSM0Q{XvvӒҘy.D96V :9sa wz}qr9|(ZI7!1ӱД97؈)M=s28ZI`WLxA⓱`9ippFQ"1pE(](H9QtH簴12jag0s%ВQ{G`QYܺT.J&fX[eߪ\u %.V2""k-!*h<1߻әl)(8:Ih@ Δ)ӢGxEN6,CqmDӬjhqIGߢ|qt*pd?Fq9aa%!Dg TcQFL+TR_ka'V/s} RIJ9O)e<]3ٷaB)%hq EૂzkπfڹӽL{6jw˚aǍga]~[6%m%>h_#kE7XS_;9CqN4ϻ^1&[?>Wx?1 4YA%,-TaԊ&[a!U]b6s2. |AAMzoix{ %G9<H/ꦚWBBN,R: &tyx<%(1sXO1ԪϸzIkfNH,(BnݭCiBa"z@J5Ɨ=9:Xid#z0O뽙gĬwgq7А߆U񓡕òJabSg`4-gl6& d2vU3R* 坓O6P/?&'_sk~dv}3=܉d' b[1nv;"0AT V?Jn+ty*PvymGtizqtx辬ueJYF@!-4e9ޏef6S2Yo}F@ɰ!iW3xduGd\;]Hi4H?&'8~ g>Z* Jhڇ;_C01[K*>kRF5.o*_8UP*Q9=O\u BVP7#:=ՔYi~u;nv+?jI=zLPx'w}~:r@^gIyzyL!T:lqW]AHeAOUF9Э[û+Ĝ9rTΫS 2ʧ',^ۥk'嫹HE%Ohxo2!V:Ścqll[$ H#oyX=~Ks\%M &}2a V#(*1Z|hĺ Mo( iZttZ2nP`#Q&oFyr0Pz ܁AAqQXۋ:, z A9XM5@\Pe\ΛeSԋAɽ3AT˞O{4:J7%:]]E{D][*DOO/"D58qDYItH`tlv٦" p `'q` }UѷڎI{ [# c\ѝ%ޢHE^@ /95M#WW'`_W.N_uι̯LKqh߂S*ILdռE_Aiڬ7'ӯn%y(QA˯xI(K'x#FWZpYD{&tB[ ePcҤ;=׋oNVAV%DU(";YJ8=nm$N7) ]~f]cai$Nle=(cc)[XU Lb9L]ӫ *s96phc$WfYHp>sݯY) 2ZF 9`m }OI-=_å{<{'͎ 6q\!Yd@;\0.@rwb'0^T*:s"LXo2S"zr_Ku:gۀ*p;H%nZ O1-[Zv!mkjj$ZbpȮ`؇o-XZ7"ٍ=bT2VuJ!T+)0K0lO231;Jt_&7S" 0hy6EA^"М_2D2g;A$(T2u$70K>C3<(.u]u/,)3Bd~O)NTSM˲6/I:-H%>v}al-Li-[(li7dP0aӌ`PDQw^wJe^P0PH0.EкMpiV>e ;q( W,kP%\eX)0_s3Q>c),F:B&;@,`j%_$>[${/[jB7]cb [$|T>F`/rf2mp!z,l51%8}棾`Q4ڒ90Z\" nMڧȟ_zt+eq`Fiu@U\ QEx?Eq/xFҀD7L=S >kۯ?oj-TY'" .mtF,'{7YmEzvEA.d<V[v:xHS-h$&1|HF7ak,_/ N/2CVE趡.bڋf2&iޢ. "ӳ:ss$A+h^]-u)rW&' B!ei#f 0@6jt8W[viC$ȱUIPgd!bѝ:-U޹;a)3ң(L|ۚ:\^IZ 9&<-yxW11Sv37nBQ;y+ѕ#u#o =*)eJ~1T}W| 4IBNƷ HQ(*A6e,B; =k. Y8>Ss4%"Ȭ>_`.1$IC<AKو6'dȳʼ~R;G5I*DXUG&bO$/և&<s/ YK .{l+L<"Z&:Nnǧ=L^rBW&;ShG2s[YͤCM2QzZW5Y;з0B襽N9GG*P!xsaޢsyE^~xLXqonf}Xf۾nZf8fN Q"1¡,t'虏F>/NļgUpb!0r^)Ncᏹʐ4_ogHzuBE98.E3XM5lg}:,p9w')] p6}XS:r[{ HSPŕ#bg#A'*qʮ|W!2wWGt5/+a \PyrSb f6x&gШ[_,nv q(YN\ u|=Y*{uSiO!wZ[aFLFQC0[ L/3oYKk0Dn݀aJªq(dz >뒟y,os 'YQs4[RC;=s(V ; !H(q,n.݋5^-#EY'xQ=Y/(Ye6xj ?J ZCSÌ\K9`u-Qg^%ؽW;|>+(H.&Q)zlAKJX-#]bEH )hMeR+31 w:b".pIpN/B%`l<Pb XHq5sĠnxGfjSe  r̛ ]Wl5̦`2&I IƳ.́ɃXDK&Z!K=f+$<8s.&?!8N^"&^PEb/Xun$>s}v9Y^H9`=rW_$ ׁV!%BaaȖmS `z떶qjn-5ѢVgKcGƱ21z0q~ ,.}`-Iэ7de΋ :ϛa^! bkNon] .4O.CCS8g2ċɏ; YԊ_AS_@x\Ȼ5|=]&5ŖT"8䧻LYG^yWўH%PI&QF5:ϠSmy-y܁gazdz.ʮ2tj DuW}7 yJ|s j;߅ R/{/x? ֙-LolQAf#0VJt3N+T:ϱgN.q#| sE:xp7s}jH*$>$"0JJGm&L>H叀='.PY+"7ۥe\@cJ˷}n)BqJ|ߗ6M7o]Tx0LU6HTFꍺ~ղϣ᧣ƕpX||X#Q0IT6M~)s\dsg| q1G!4|vER 6 bڝV"%eaYͯN{w(ΧK6RXpVPXYj5meUJv!8tm_U+TjZ'V 8-5q ?CtzWzܢnxLRgQ|"&8* א"$vEfK{h@,DI5Tߊv %EsI/WO4"r ݏ L*X|DɅ77׭4R d_*p˦Sr5Eg@ 1PTrBƉs5BX hݽ*aZwbfٷS<^ӣo΂oM4;JN,Pd qZV eIt&|jsbR k 0EJ@B$nntGLUQ{&lQUop%Ӻ/]!7K=l]Q"LǤٚGL6(N9ēU߾^3!=NaQͬpZ]7m0<_?`e ¾(4i\m.i0"$3Nf(}N6L>͵ Hg"\j|]r'nRm(lXWN}߰h='~ήUbt[y‰in#+լ]Y-eޘ'lᴠ; ^5}=Mr(F}W{#s@𐏑(4e6wKjPHR >5$b0N 3i\rv Km,h@d_ә*}> #oUƦ{2[=e{QH&K0J㬢 ; wvõ3;*i.d-e6``Ims@I+3  6I5*g=U8Ohx#Κ *)Ah(S7/voċG—d`YJ6s t@>o.Ǎ*s!RdBqN:K7n/#0)пE<^/i8b䮸\Hr?3# խ=NxO)rQ {Δd4CN)CI 2/DDX,gc:$D͙)EۼK9MHE3`Ex+ ϒJruqEWIK;FY!j \"kG:%xKCdR8W pbp)Q "ؤWWc/ Aic󛬎;*Ǥc; `&-F2Ux| S<Whï[A;g9} ڵMͭmlmX*PPkx1 SAI(n7gL꭛{q(HM6D&*:<gyQ$8VH=?-T<(v,؉`5F"eO!M}e٩4TCr$'GIMD|E,N^Cx =j4Wp>$h+ڻ `$3zYQ qӨ j0/QJiՖC_-]vAlM8ח{gz˼t}}:ӂ\5Ȋd1ˊO<(^Dv%5CAu콨:';֧SG+KdQN[۠->@sb@uWYiۤu[oZFkwd\4.VZ8%V TBo;$^Hj/X|,gq n9e[k_,BRT%Qۙ>C<"/){lo 5G0P5:#.~6|BEz u:Q:Lpre=P>&~Q! to WԷI'qo77xb3uf.,EH*k;nָ[yr<M RpL4jGJs1RmfEIu|Y䴰_J\*}`BȪ 'W#(OgULgd u3LZ*&_n8臂vy׮P:UН ض`.:NBѰ@ċ?Hx5IΆ&톺׹ '`2id}+k+#\"-hD\O}犙(/8!݉HN{_->`\][H] uAޖ}/s ϯOT W_ 4,qNۡY.ߙ5zʢZP!蓖Dmd)78d4|)$_P_)ϖ,nבE |itpK.U-.bGL4,i15acmFgKN|Ou%|x>J@}2#q23&$ QnƸLCNWCҾ\Q9/zy-Q ;~uiIAEtVRxl吿w[^% ^_1m;}27=kR'nt_{Z0OB'Dũ*qdHHU|[F1@,z¡yEJr<*v2"c 9=UF`5O\ID0DŔ.kU\Rq80BO+WI0, A=om\l5_ Đʦ\'-e#ul~C]ݮN9r;M|aAw+}(n/g|~\B#м (|T)s|qoQO;Aq3kv#Tf5)9afac )$SX.!=hj5 7$)?'2ta_2g76ejdl56J^_.~dq2}aG-wl#nL$4Tü*1[u'G~{0ppSE仏2t0=;CRkB֎(N8 Z(i~#ԧϻrr~ni.$w{Hd+Mo=MNK(#)L ae?ZMZtEjkU-By0ˣ?b-#Us.H9qa`33*s,*ʀ-n|=I DoגGu#.D),`gzǮnRE9.M2 m@Չ:dgvygG"+?sy 'd֓‚ YrX5fT=Ú[ܿ+ OVx$d>eQL!;v4-x2'u;uٵeͤ[JT EZ?ėyzk :ֶ]/2i^{AU5*?[w-rl=h3>ZL0`aV.~7-4,ߩ[8'Tѕ_k9>$[}[0IDH33%~}6Ù-$icE6Wo_I`K;_nmE6#^i<'Cmf6$|N.Ϫhy7#]¾jJ0 yO'RD"nr"gnZOtNVF雙D~^\S(\%zR\DA:FMq'\V] ->QA/&0'7`I-P<_H!-BS|uo1iiχie~rY/ i$7@\x mKgJNK$[K*FT<1{Ҡ76s/Ɛ=$ HL+~jӚ͡GI>—$ 3(B\:bÒ_,p&3^nc>TNPzdߣf\Q10|-:Pzm`q5fDrWnQj=d[cn /ԵljCߔ]쇑9c ,@1I~O@ -O =2Ҿ_x.eK;s8զΉ{kz!窓pV/+a3?_iG{+7|Kryn `읈1ĿI5`XIMx0gYS5xt_1nd /ЌaTh 9 U6ץo mc SM,fYr bv(%ŕ;Yyb-JM7mB }*p<2t>0o:*c7j/gS ſ)@-CtG=d0-Rw7~`Flťnbx=%dwn.ۆn-e\eꠅ;=]7kewq7"ɛ+kI$Ojˍ'I%;=%uky((+Ѹ*B JlPE@jOƈ!AptmSVHx]lѯ(}~b7I o'ce6a~/p-wӡ㻣m5{$܄Eh EoADJ돁O>Ndu*3wڑDžRnSmdzK}DW3>) t Noyc+y c:ri[f V˘4x2B_u޲ztFC{"m dYHf< Η4 ktL Dd eő_UF ha+jf|8 a\ނoJC~Q?*b 0ept MS#ű($SEWBxΤIZOT"߿'"t'b8?ȋrdzw 9@oݹ) Ye]H>V}xܧ]b^ZA*8s 1u[=Ȋn"p /6CL TܣmI4 (_+8n M&{M>K&QkvltS(Tm@f8?Q{WqN5^(ԂFE/ -G6g #UKl/%\yC0+HHn 'Lwcclf-[ѐf"$#n-tO 4[C1EQ/Prq~R'_="e=Q$V1In\S@&oiS$p\'Tݟ)tycqÑK?c5FZ.ɲv]cYA( #UѱO1Zyy+lo@} 4L6fRHȂN]=+ޖZ'Fb ٵ .1T U;6B*%Yhj@-4%;֍ZwYod/<[9 LTFje (n2FJ_Wl"͏Plj 0XT@3 K07UTNΏ;eȋa-D/׷;H3@" (-YT!]jΙӃEq sv <^âU5*OT&"a͏#iӾݠ4vBBgR.F =wutD2˿ ؤr/ jTz:9 gJjZs.X 'Ʌ9p]M;|!DOMA^~]pm&׺*fD@!F-b)߷֌]zfrR?2ku>Ȁwj#}\4m5 T/@4sSĪh ;; ,phߴ>DSf<78nPYһZN3fj3]1$!I,"3N5" K fBv3s}Z6 պAMAVՔJcྼCBW~=XC?y;>7PB4|,6/C1  BTHXt—'g&*N<IȼBr->U306[EqttF,09L;ԲNQ [f+b68oͪ+Mʙ‰XyLЗz2#F#N@x?H,tOfO4ϧ]\$6숿ID ͂cvUk`cG#(Mf̈{'F)I@*sp6#=@%WK }a~FO_M^ՉT0H&8.%FIG:iߚ8߃@VP_f-)&7s񳞁t>̃Js`{L\W}(tcֽٍ]o)'Ϗ'W;ܻO0ܥeDӀ2d<#aKH:-bKlQSkp@ؘ_AQ,,3T|.Y7Oo"sk\WFDLE$a)7bw{-n }̫?E9L3{Rޚ>r1Н s)2)쁥5et[)n2X'BUVDno+}Ů:84sۣ2b x#\q;.ʾڱS"z bkO-@=rsE`!,ߴJ|^^[8Y`1 j{i[hժ `yYE e#hأG=+LO7y$y_%R`G{J#c1KoX=Ng.D|A^UJ+M֑X 5wQ0ޖG(DMbK+qK+ ޥ%FV=m-Gn2~0#?4VH9]$ l@_P.@OqT( N޲>Dvqzi4AiLSw55Bۺ%--O[p8j䒷 ;%ŋBGǰA%2uVWbMHoq5_8F9L {ĥS3M޼;09c}">f=@~e{ {P㵎9]bx$lB#ީcTU^m@dbo'ֲ^;»|-{b9yxL oٿ7ݤv P?` ͧ;<NV}OJyNϖV(\l땖쮔'^PHD#z31% QFı: @#k1JB|iI<!ON%'N4HN>$=b|7f).¼{ҍ2hVfEGfsM|he}Og z0VjiE d_4)#ru|FCC zbL&q(Pnv:E>OS̿eTI텷|J[El IXoVBMgXn,3x;959ƚm/ՀHbS셁? 3s6?{^T<$Yݭ<$xp񷺺\aχٮ߽0/\GvAԔP#'IpN(#٥nE [\ GRs4z%T@ƳzK/P8 V8Isw+߇=A7>{rj#-WʼnEW!G_GֿݏTѕ 5]tzBB ͗Hl~뿙"[_6"ݡp R(=0 n!4|'ǔQ{ Gk]HN%~:VrT"z9i\ <9v%D^Wu͠E|no5*OH~QW~uk"7N×XɅ?:J^n,|0dOvp\x6m:njVgh_We_=ZLUF;OVkn. #YVo&xuB±Y^ [oǑQVq!蓅U{Z+5kfcv#m@9d0e|͚dMt?sr!Ӱ"/GOo+㍇p (T$0 ݺ LϷkc ^@cX$?;G6K2nWR 'So]T"z[iJlf(-+e}POgg*tJ#_x>.b?73낐N"Oc-lʣFFՋxY b|!r_lEF0QYsl h˚16A++Ũ1jK~hmW6s lYĘq>#H ҪZ"B>jO;jJ֠ B wZhwBѶjjT+E 5]RD,F2?%RV}vwm]G>FZ9Un.8?d6Ǥa!̀" VDUL QQ\ d/@U.Ώe߮'bxēnTh3{"Fi0;Ԧ7iLhh>S:=?kM>Z4P讀K7&umZZhP> Ì{CtUcH H#~Jy+ 3ٖJ'|,4D'KHTG| qX Z rcͶ2btp7NߚM&MX ZovCݛ=|w^u@?=Uf*-sKυY(Ћa\)b5 Eh}#Xِ(WZDdl3'&Qxww.^oVtU%he9P+%*ƍ ûP$ۣ@+ƀP|xW>tzDљ6_F`cܜyW;v^Id㙐0CTmRxсQJM&d&+ ?Sm*l䇿3ky KYɐK!B<=0^Y'3٬ T ͞WBS'Rڣw[\9m^ -?7:P~*jltŏ`04Q|e؜*f |[#"ggxRM cF|ຎ\Y'$$5ri>tw.>|UhsP<#U56}7qTĔ%-2]c~c #0wdNM3x.38:cz=&f:5]K6Th̓', ˎ#HM"@14itu}vi>Yؾ90MP6bkKzgOwo>3=h+vSng , Tʬeseqo0obƞ`>n zwCqC-+g͙sAk,CnVT^YE.&q+7֩j@Erkh$+@Αo񣡉0Y5딚 e"=Iygs0mcnB߂MAmV dĢبі] ? pj!͝n }to;%}Lh=B+c@ÛgjM\4 \ndpBtnQcսjqŘ4t˸%\G}DRn;T\`)@k*$9 j?ˉҦ\BS(eүWxGd5tڏ[8{&a"i8],R9W`` $F6J 5%B[P>4 ,PC(9( %`ο)EyqX:4Øh(kdVj`G2n#N!;-+E4byr8z"'eͅ.E[{ő+JHx.B(5XM)PwS;SDwJ2{յFA>ĄRt)3c/̞+2`U̎yΠv1y &DdRX0xgR9N{IۨwVAX6Dqp<'oPhwY6񇻵v>E[& J,?_ VT5Iɳ#]a5!'2AVkB[f_iЌ|^B ^RX>h$[3A[({;BXm;귯!nȇYpQ'Yk #rRAI#XF2rlOM^KBD0M<.M, LnyC@bf6VdEx>t ADU i_ir1w  &L&?l}G7qJqf\WU ¹#J6 85orEnOo^y(jL-]{UC я\`hx?o Y9!OsoG{ kA Qn:穰(X/ 7P#\q!υS]s+>ZDHO;ÚɅjGŝEĤ#cTx<| !caX)L[u7mb!~ՃXtjW<~81d&|4"LnӨ .63ޢx`A^M\U/eĜg)rUJkpM5xv?vFoz]wQfzd M"yvzpI9N&:N1ޣx;x#P%ÔD!\zYƴ5q\ Ia`۞*y]oHiSc$Yun\)|6>V3YHz1'kq 1Bt(kQ8QK*y5,18Q͢QnǏ2[_od_Z/ԇ]pzq ҹ.א8ńk>&'j4`W[X`Wa6ak̭;^hxU/P٫!ò{#%%H ڹJ;`𴞷|5iRJ'- ~N۪sT9rL5_'? ܱ`j38ECvEgKG3s(Vl}lR%Y/cU}l )m*3@+0\3'W%8rOO1~14T.Wϗ8g=hbE;# )xQ 0T#R{񧡏PM+`5_!Jʏ!Q(MoR酪SR>!vXqt{ӱBMVӑ>,szeIKs^\lL@cZمQ;y;H/5ʵ!<?0;6K.ΕG![. ,~fEӽV7Cgs[ !_7U`RcQvwuW?fBxb%AYRmZiBaUjay Q>lb9[.J(kwK2?Q0wFw>@*Vn\A"k|>}*K ^uE87o> &WG#+DpN|(qdB:p}pc@dUXG۵1o RcCtMnBX;?.࿯]:69Zs#EyۤH| nBb͞-ۇJ0vv=fm+i_d>]>čwDsјzNL=%dxL B,yNZכ_.j!3Ҵi?2:j9 4H,,)5mZAq:d]d6):(O(*j[ j "JzDx؇miHaR\t)cLDĖM-قD{>=Nl?섢p4vEP!PL=:0- ֐xO /7$Wtml:;o:A $Ko#6 }ЈK:Hme|a@ZKݫ87ؗjJhW(|al@ƾ,0!$,`4Ƥn qNsbyps؎p3U;wrPλfQa,+( O#=yu*XiaQfÃ]c1m\z{ idAO 79 WxJOR DIJ Uù o Jbz*o9\Cpm)yܣr U!NYo =i.[fFa@3KB] <[kF FZxz0]O-N(/~Syf lGT *-cWRj-lRŠZ6WT?^F5psfY/qHn\sZ4GTEȫo*uө$m.Ttnf2hŠ  ⚐OLxA/CY|mZ]s*8~=Y~PNRCv,4rh1Ƙ O x!o\kYuaŅվl=Zܯsh+t#gu*`YoW0MČN?>:C=z pyiPDQoA E~al n3N|~nt2u2h-PxyrE(BAԏ+ߍ9?__QNXW# ζwM䕟vS⅊y#u,@<]2Փ&y`Uq$lXWg:{=~”[ZXCI|3^d1g5cԘc=BX<3icȬ,?LT`,ϰ(nnmo,Qq)?ͻ9\/x*,9GU^-Zߌ `͡s;T-^Phlϼ?3gx=RNu=L;ϡw݌6ګ؏G`?F7݈Cc&'CT`Ja%+p,?sڪüPkd.:%ܬGWV*B:CժBJK@uq5p|HƬ)Zqi7A{ŗ~0 V)_C‹J;r^{h:sKȚWĦjb#+T Db5S"o-1O|1QI?WuJDL }OA4vg3`L Uզtd*_]u C'v9 HnS <@y_ 8kGzq jk^Qd^7ƛIxB)1V J{_Ws:hQ0;V5iV R>V㥟 *AN2TM_Rm2qmn&4B Z*IM QUQ3"ܿ7ViCKiczoĂ7T4Pwp㨒=;@s1 |M(9U r3l{ DU]-+Ï>Y9?'9~=Le6`ނk Mn㗷 ȏWYc.I\hJm"1U[3r(Qc-mvW]yڍVҍcLuGMk0[m4.qWȤBvw6(M›2_(1z+~ ,Ti[A0SCKlc9HJ8Ll7$s-З;X,3_+4 DqF|3ݛ&aLl_ikhr$_.;HW(R 9_|` *"EB=rm"uC?ILiYOt}j 5-Y?PcZQ)=7!7a:Rq2(l¼UVp6+v Hx:و$%ɚ^/SfJbu\/ œu `M!yght%ͭ /[U .uXeqr! |X xa9< lN yn b &.Ȕ++ J2˰3Y ksbPsM[-wVi=<j!^ϥ Wvտp8XUEEP9 *8ְI1,LgEb^yrQoj McFL ov B+t.U#&0m?\k5KJ=8ĈK40EpO6V焊ՕU9U /OB1ҟh*W0sB}J* i4 .koAoRx}W1Vi lMx&9>wKOpD͊D6хgzfՅdul`#D4bz @@9ڙJJyȶiB҆1"r&: =҄(lWn3Gxɴ7<(xM[J74?82ҡYm'EF+L) 0M3n0OvCE%M$KJq\i%*о{ ;{*WJ"㱘ƉmD5Dl3o"]ƙW^~&nDYvy]wL!Q#&_$xm) 8#构H|=*o_ԥ{vUx %a a rP|>ɹu ?[mXNJ 4î瓚drąp5gQruڞGDXK䠃rtbD x`X>uS*Gj>GÛ*^LgrWzcjAJUm6s#%H`v2bst%bRa8_Pr]R\ᑞ7a`G$42/<`Wσ ;VsQW=bښ=ROǒ;x&C9[&^3"Huu}3J;#˴ 69[ffDm+Tʵi#I4[rdOdaeq?jOHGmfw3j 8ܥytWP@[8jQ+<+n/ƣ hg @k5^'a*)9ºM!sՍg/4Swk7NP2\Z)ӯvLLhM;ӔچY_6ӊ}==Lؒ Y*&;2$KG{3\Y{qP)ˋ 8S~:|tw6PqBD`jOVQyBӝ{WkǵS_Yy$\ڍge;/y >6|@-R6 ;_ c>LޒiY!FCLsÃq,hSE%ٻ/{ Ghۏ(龗sWtIaj՚+C}h}e#J/RɜS:_Kpե"dnk@{b7.Av{ 4zZW6k5Ԏ؏1Zn)Z@gP({lS[Qu[p[A4j¼܇)0v!%[",x#Ҹ` uL_wg"Y!-Zd{wf+7+\wկU *0l` .rof9S^_iD`qM$ !O7Z+f׵_ݰ!^m )@ *q%vzduVaQ6)=;Y+moḐ2 WbcڇTI̎ܘ =yvSf- sb|1PnPYBBhWMNLKh<&8 wG,L,@a6-lkHµ8;fcg Lއ2 ) |sX7.\-U yGTeGxqANg'g6Xf{6 jS;Bm? A0dڜ@*@}W&qtLVuE_Sh6,Z;8~xS4%LB.g]ʦ.kNSaرGwz/-ɒp;2XY{뢘zu]0-V=h`Sn9u[sW$+qcʋ|ܘovp7#+;Hm=F-y*Z7qd 2fl uO