X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=mech_eap%2Futil_token.c;h=a1aea0c23b6457d96d7a7b0eb3c7e7b088d1fc0f;hb=4d93aaedd99c1dc4f6ecbc0588da12aa16904593;hp=a929198ff3efff242fcfd97ccb5c8142b5d55aea;hpb=acc2e49c1b52930eb717443fee098d4e7773bd5a;p=mech_eap.orig diff --git a/mech_eap/util_token.c b/mech_eap/util_token.c index a929198..a1aea0c 100644 --- a/mech_eap/util_token.c +++ b/mech_eap/util_token.c @@ -59,8 +59,7 @@ OM_uint32 gssEapEncodeInnerTokens(OM_uint32 *minor, - gss_buffer_set_t extensions, - OM_uint32 *types, + struct gss_eap_token_buffer_set *tokens, gss_buffer_t buffer) { OM_uint32 major, tmpMinor; @@ -70,10 +69,8 @@ gssEapEncodeInnerTokens(OM_uint32 *minor, buffer->value = NULL; buffer->length = 0; - if (extensions != GSS_C_NO_BUFFER_SET) { - for (i = 0; i < extensions->count; i++) { - required += 8 + extensions->elements[i].length; - } + for (i = 0; i < tokens->buffers.count; i++) { + required += 8 + tokens->buffers.elements[i].length; } /* @@ -91,26 +88,24 @@ gssEapEncodeInnerTokens(OM_uint32 *minor, buffer->length = required; p = (unsigned char *)buffer->value; - if (extensions != GSS_C_NO_BUFFER_SET) { - for (i = 0; i < extensions->count; i++) { - gss_buffer_t extension = &extensions->elements[i]; + for (i = 0; i < tokens->buffers.count; i++) { + gss_buffer_t tokenBuffer = &tokens->buffers.elements[i]; - assert((types[i] & ITOK_FLAG_VERIFIED) == 0); /* private flag */ + GSSEAP_ASSERT((tokens->types[i] & ITOK_FLAG_VERIFIED) == 0); /* private flag */ - /* - * Extensions are encoded as type-length-value, where the upper - * bit of the type indicates criticality. - */ - store_uint32_be(types[i], &p[0]); - store_uint32_be(extension->length, &p[4]); - memcpy(&p[8], extension->value, extension->length); + /* + * Extensions are encoded as type-length-value, where the upper + * bit of the type indicates criticality. + */ + store_uint32_be(tokens->types[i], &p[0]); + store_uint32_be(tokenBuffer->length, &p[4]); + memcpy(&p[8], tokenBuffer->value, tokenBuffer->length); - p += 8 + extension->length; - } + p += 8 + tokenBuffer->length; } - assert(p == (unsigned char *)buffer->value + required); - assert(buffer->value != NULL); + GSSEAP_ASSERT(p == (unsigned char *)buffer->value + required); + GSSEAP_ASSERT(buffer->value != NULL); major = GSS_S_COMPLETE; *minor = 0; @@ -126,21 +121,16 @@ cleanup: OM_uint32 gssEapDecodeInnerTokens(OM_uint32 *minor, const gss_buffer_t buffer, - gss_buffer_set_t *pExtensions, - OM_uint32 **pTypes) + struct gss_eap_token_buffer_set *tokens) { OM_uint32 major, tmpMinor; - gss_buffer_set_t extensions = GSS_C_NO_BUFFER_SET; - OM_uint32 *types = NULL; unsigned char *p; + size_t count = 0; size_t remain; - *pExtensions = GSS_C_NO_BUFFER_SET; - *pTypes = NULL; - - major = gss_create_empty_buffer_set(minor, &extensions); - if (GSS_ERROR(major)) - goto cleanup; + tokens->buffers.count = 0; + tokens->buffers.elements = NULL; + tokens->types = NULL; if (buffer->length == 0) { major = GSS_S_COMPLETE; @@ -152,7 +142,7 @@ gssEapDecodeInnerTokens(OM_uint32 *minor, do { OM_uint32 *ntypes; - gss_buffer_desc extension; + gss_buffer_desc tokenBuffer, *newTokenBuffers; if (remain < 8) { major = GSS_S_DEFECTIVE_TOKEN; @@ -160,42 +150,61 @@ gssEapDecodeInnerTokens(OM_uint32 *minor, goto cleanup; } - ntypes = GSSEAP_REALLOC(types, - (extensions->count + 1) * sizeof(OM_uint32)); - if (ntypes == NULL) { - major = GSS_S_FAILURE; - *minor = ENOMEM; - goto cleanup; + if (tokens->buffers.count <= count) { + if (count == 0) + count = 1; + else + count *= 2; + + ntypes = GSSEAP_MALLOC(count * sizeof(OM_uint32)); + if (ntypes == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + if (tokens->types != NULL) { + memcpy(ntypes, tokens->types, tokens->buffers.count * sizeof(OM_uint32)); + GSSEAP_FREE(tokens->types); + } + tokens->types = ntypes; + + newTokenBuffers = GSSEAP_MALLOC(count * sizeof(gss_buffer_desc)); + if (newTokenBuffers == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + if (tokens->buffers.elements != NULL) { + memcpy(newTokenBuffers, tokens->buffers.elements, + tokens->buffers.count * sizeof(gss_buffer_desc)); + GSSEAP_FREE(tokens->buffers.elements); + } + tokens->buffers.elements = newTokenBuffers; } - types = ntypes; - types[extensions->count] = load_uint32_be(&p[0]); - extension.length = load_uint32_be(&p[4]); + tokens->types[tokens->buffers.count] = load_uint32_be(&p[0]); + tokenBuffer.length = load_uint32_be(&p[4]); - if (remain < 8 + extension.length) { + if (remain < 8 + tokenBuffer.length) { major = GSS_S_DEFECTIVE_TOKEN; *minor = GSSEAP_TOK_TRUNC; goto cleanup; } - extension.value = &p[8]; + tokenBuffer.value = &p[8]; - major = gss_add_buffer_set_member(minor, &extension, &extensions); - if (GSS_ERROR(major)) - goto cleanup; + tokens->buffers.elements[tokens->buffers.count] = tokenBuffer; + tokens->buffers.count++; - p += 8 + extension.length; - remain -= 8 + extension.length; + p += 8 + tokenBuffer.length; + remain -= 8 + tokenBuffer.length; } while (remain != 0); + major = GSS_S_COMPLETE; + *minor = 0; + cleanup: - if (GSS_ERROR(major)) { - gss_release_buffer_set(&tmpMinor, &extensions); - if (types != NULL) - GSSEAP_FREE(types); - } else { - *pExtensions = extensions; - *pTypes = types; - } + if (GSS_ERROR(major)) + gssEapReleaseInnerTokens(&tmpMinor, tokens, 0); return major; } @@ -307,7 +316,7 @@ der_read_length(unsigned char **buf, ssize_t *bufsize) size_t tokenSize(const gss_OID_desc *mech, size_t body_size) { - assert(mech != GSS_C_NO_OID); + GSSEAP_ASSERT(mech != GSS_C_NO_OID); /* set body_size to sequence contents size */ body_size += 4 + (size_t) mech->length; /* NEED overflow check */ @@ -330,7 +339,7 @@ makeTokenHeader( *(*buf)++ = (unsigned char)mech->length; memcpy(*buf, mech->elements, mech->length); *buf += mech->length; - assert(tok_type != TOK_TYPE_NONE); + GSSEAP_ASSERT(tok_type != TOK_TYPE_NONE); *(*buf)++ = (unsigned char)((tok_type>>8) & 0xff); *(*buf)++ = (unsigned char)(tok_type & 0xff); } @@ -415,3 +424,70 @@ verifyTokenHeader(OM_uint32 *minor, *minor = 0; return GSS_S_COMPLETE; } + +OM_uint32 +gssEapAllocInnerTokens(OM_uint32 *minor, + size_t count, + struct gss_eap_token_buffer_set *tokens) +{ + OM_uint32 major; + + tokens->buffers.count = 0; + tokens->buffers.elements = (gss_buffer_desc *)GSSEAP_CALLOC(count, sizeof(gss_buffer_desc)); + if (tokens->buffers.elements == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + + tokens->types = (OM_uint32 *)GSSEAP_CALLOC(count, sizeof(OM_uint32)); + if (tokens->types == NULL) { + major = GSS_S_FAILURE; + *minor = ENOMEM; + goto cleanup; + } + + major = GSS_S_COMPLETE; + *minor = 0; + +cleanup: + if (GSS_ERROR(major)) { + if (tokens->buffers.elements != NULL) { + GSSEAP_FREE(tokens->buffers.elements); + tokens->buffers.elements = NULL; + } + if (tokens->types != NULL) { + GSSEAP_FREE(tokens->types); + tokens->types = NULL; + } + } + + return major; +} + +OM_uint32 +gssEapReleaseInnerTokens(OM_uint32 *minor, + struct gss_eap_token_buffer_set *tokens, + int freeBuffers) +{ + OM_uint32 tmpMinor; + size_t i; + + if (tokens->buffers.elements != NULL) { + if (freeBuffers) { + for (i = 0; i < tokens->buffers.count; i++) + gss_release_buffer(&tmpMinor, &tokens->buffers.elements[i]); + } + GSSEAP_FREE(tokens->buffers.elements); + tokens->buffers.elements = NULL; + } + tokens->buffers.count = 0; + + if (tokens->types != NULL) { + GSSEAP_FREE(tokens->types); + tokens->types = NULL; + } + + *minor = 0; + return GSS_S_COMPLETE; +}