/* Create an IOV token for "kernelwrapmic", wrapping only the "wrap" part, and * send the header/data/padding/trailer buffers to stdout. */ static void send_iov_token(gss_ctx_id_t ctx) { OM_uint32 major, minor; gss_iov_buffer_desc iov[6]; char *buf, *p; /* Lay out skeleton IOVs and compute header, padding, trailer lengths. */ iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER; iov[0].buffer.value = NULL; iov[0].buffer.length = 0; iov[1].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; iov[1].buffer.value = "kernel"; iov[1].buffer.length = 6; iov[2].type = GSS_IOV_BUFFER_TYPE_DATA; iov[2].buffer.value = "wrap"; iov[2].buffer.length = 4; iov[3].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; iov[3].buffer.value = "mic"; iov[3].buffer.length = 3; iov[4].type = GSS_IOV_BUFFER_TYPE_PADDING; iov[4].buffer.value = NULL; iov[4].buffer.length = 0; iov[5].type = GSS_IOV_BUFFER_TYPE_TRAILER; iov[5].buffer.value = NULL; iov[5].buffer.length = 0; major = krb5_gss_wrap_iov_length(&minor, ctx, 1, GSS_C_QOP_DEFAULT, NULL, iov, 6); check(major, minor, "krb5_gss_wrap_iov_length"); /* Create a payload and set header/data/padding/trailer IOV pointers. */ buf = malloc(iov[0].buffer.length + iov[2].buffer.length + iov[4].buffer.length + iov[5].buffer.length); assert(buf != NULL); p = buf; iov[0].buffer.value = p; p += iov[0].buffer.length; memcpy(p, "wrap", 4); iov[2].buffer.value = p; p += iov[2].buffer.length; iov[4].buffer.value = p; p += iov[4].buffer.length; iov[5].buffer.value = p; /* Wrap the payload and send it to fd in chunks. */ major = krb5_gss_wrap_iov(&minor, ctx, 1, GSS_C_QOP_DEFAULT, NULL, iov, 6); check(major, minor, "gss_wrap_iov"); send_data(STDOUT_FILENO, iov[0].buffer.value, iov[0].buffer.length); send_data(STDOUT_FILENO, iov[2].buffer.value, iov[2].buffer.length); send_data(STDOUT_FILENO, iov[4].buffer.value, iov[4].buffer.length); send_data(STDOUT_FILENO, iov[5].buffer.value, iov[5].buffer.length); free(buf); }
OM_uint32 KRB5_CALLCONV iakerb_gss_wrap_iov_length(OM_uint32 *minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int *conf_state, gss_iov_buffer_desc *iov, int iov_count) { iakerb_ctx_id_t ctx = (iakerb_ctx_id_t)context_handle; if (ctx->gssc == GSS_C_NO_CONTEXT) return GSS_S_NO_CONTEXT; return krb5_gss_wrap_iov_length(minor_status, ctx->gssc, conf_req_flag, qop_req, conf_state, iov, iov_count); }