1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 9698 Peter * Common Development and Distribution License (the "License"). 6 9698 Peter * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 9698 Peter * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel /* 27 0 stevel * glue routine gss_export_sec_context 28 0 stevel */ 29 0 stevel 30 0 stevel #include <mechglueP.h> 31 0 stevel #include <stdio.h> 32 0 stevel #include <errno.h> 33 0 stevel #include <stdlib.h> 34 0 stevel #include <string.h> 35 9698 Peter 36 9698 Peter static OM_uint32 37 9698 Peter val_imp_sec_ctx_args( 38 9698 Peter OM_uint32 *minor_status, 39 9698 Peter gss_buffer_t interprocess_token, 40 9698 Peter gss_ctx_id_t *context_handle) 41 9698 Peter { 42 9698 Peter 43 9698 Peter /* Initialize outputs. */ 44 9698 Peter if (minor_status != NULL) 45 9698 Peter *minor_status = 0; 46 9698 Peter 47 9698 Peter if (context_handle != NULL) 48 9698 Peter *context_handle = GSS_C_NO_CONTEXT; 49 9698 Peter 50 9698 Peter /* Validate arguments. */ 51 9698 Peter 52 9698 Peter if (minor_status == NULL) 53 9698 Peter return (GSS_S_CALL_INACCESSIBLE_WRITE); 54 9698 Peter 55 9698 Peter if (context_handle == NULL) 56 9698 Peter return (GSS_S_CALL_INACCESSIBLE_WRITE); 57 9698 Peter 58 9698 Peter if (interprocess_token == GSS_C_NO_BUFFER) 59 9698 Peter return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_DEFECTIVE_TOKEN); 60 9698 Peter 61 9698 Peter if (GSS_EMPTY_BUFFER(interprocess_token)) 62 9698 Peter return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_DEFECTIVE_TOKEN); 63 9698 Peter 64 9698 Peter return (GSS_S_COMPLETE); 65 9698 Peter } 66 0 stevel 67 0 stevel OM_uint32 68 0 stevel gss_import_sec_context(minor_status, 69 0 stevel interprocess_token, 70 0 stevel context_handle) 71 0 stevel 72 0 stevel OM_uint32 * minor_status; 73 0 stevel const gss_buffer_t interprocess_token; 74 0 stevel gss_ctx_id_t *context_handle; 75 0 stevel 76 0 stevel { 77 0 stevel OM_uint32 length = 0; 78 0 stevel OM_uint32 status; 79 0 stevel char *p; 80 0 stevel gss_union_ctx_id_t ctx; 81 0 stevel gss_buffer_desc token; 82 0 stevel gss_mechanism mech; 83 0 stevel 84 9698 Peter status = val_imp_sec_ctx_args(minor_status, 85 9698 Peter interprocess_token, context_handle); 86 9698 Peter if (status != GSS_S_COMPLETE) 87 9698 Peter return (status); 88 0 stevel 89 9698 Peter /* Initial value needed below. */ 90 0 stevel status = GSS_S_FAILURE; 91 0 stevel 92 0 stevel ctx = (gss_union_ctx_id_t)malloc(sizeof (gss_union_ctx_id_desc)); 93 0 stevel if (!ctx) 94 0 stevel return (GSS_S_FAILURE); 95 0 stevel 96 0 stevel ctx->mech_type = (gss_OID) malloc(sizeof (gss_OID_desc)); 97 0 stevel if (!ctx->mech_type) { 98 0 stevel free(ctx); 99 0 stevel return (GSS_S_FAILURE); 100 0 stevel } 101 0 stevel 102 0 stevel if (interprocess_token->length >= sizeof (OM_uint32)) { 103 0 stevel p = interprocess_token->value; 104 0 stevel length = (OM_uint32)*p++; 105 0 stevel length = (OM_uint32)(length << 8) + *p++; 106 0 stevel length = (OM_uint32)(length << 8) + *p++; 107 0 stevel length = (OM_uint32)(length << 8) + *p++; 108 0 stevel } 109 0 stevel 110 0 stevel if (length == 0 || 111 0 stevel length > (interprocess_token->length - sizeof (OM_uint32))) { 112 0 stevel free(ctx); 113 0 stevel return (GSS_S_CALL_BAD_STRUCTURE | GSS_S_DEFECTIVE_TOKEN); 114 0 stevel } 115 0 stevel 116 0 stevel ctx->mech_type->length = length; 117 0 stevel ctx->mech_type->elements = malloc(length); 118 0 stevel if (!ctx->mech_type->elements) { 119 0 stevel goto error_out; 120 0 stevel } 121 0 stevel (void) memcpy(ctx->mech_type->elements, p, length); 122 0 stevel p += length; 123 0 stevel 124 0 stevel token.length = interprocess_token->length - sizeof (OM_uint32) - length; 125 0 stevel token.value = p; 126 0 stevel 127 0 stevel /* 128 0 stevel * select the approprate underlying mechanism routine and 129 0 stevel * call it. 130 0 stevel */ 131 0 stevel 132 0 stevel mech = __gss_get_mechanism(ctx->mech_type); 133 0 stevel if (!mech) { 134 0 stevel status = GSS_S_BAD_MECH; 135 0 stevel goto error_out; 136 0 stevel } 137 0 stevel if (!mech->gss_import_sec_context) { 138 0 stevel status = GSS_S_UNAVAILABLE; 139 0 stevel goto error_out; 140 0 stevel } 141 0 stevel 142 0 stevel status = mech->gss_import_sec_context(mech->context, minor_status, 143 0 stevel &token, &ctx->internal_ctx_id); 144 0 stevel 145 0 stevel if (status == GSS_S_COMPLETE) { 146 0 stevel *context_handle = (gss_ctx_id_t)ctx; 147 0 stevel return (GSS_S_COMPLETE); 148 0 stevel } 149 0 stevel 150 0 stevel error_out: 151 0 stevel if (ctx) { 152 0 stevel if (ctx->mech_type) { 153 0 stevel if (ctx->mech_type->elements) 154 0 stevel free(ctx->mech_type->elements); 155 0 stevel free(ctx->mech_type); 156 0 stevel } 157 0 stevel free(ctx); 158 0 stevel } 159 0 stevel return (status); 160 0 stevel } 161