version 1.2, 2003/08/31 13:30:18 |
version 1.3, 2003/08/31 13:31:57 |
|
|
char *tok; |
char *tok; |
OM_uint32 offset; |
OM_uint32 offset; |
OM_uint32 oidl; |
OM_uint32 oidl; |
|
|
tok=ename->value; |
tok=ename->value; |
|
|
/* |
/* |
* Check that ename is long enough for all of the fixed length |
* Check that ename is long enough for all of the fixed length |
* header, and that the initial ID bytes are correct |
* header, and that the initial ID bytes are correct |
*/ |
*/ |
|
|
if (ename->length<6 || memcmp(tok,"\x04\x01", 2)!=0) |
if (ename->length<6 || memcmp(tok,"\x04\x01", 2)!=0) |
return GSS_S_FAILURE; |
return GSS_S_FAILURE; |
|
|
/* |
/* |
|
|
* string is long enough and that the OID matches that in our context |
* string is long enough and that the OID matches that in our context |
*/ |
*/ |
if (tok[4] != 0x06 || tok[5] != oidl || |
if (tok[4] != 0x06 || tok[5] != oidl || |
ename->length < oidl+6 || |
ename->length < oidl+6 || |
!ssh_gssapi_check_oid(ctx,tok+6,oidl)) |
!ssh_gssapi_check_oid(ctx,tok+6,oidl)) |
return GSS_S_FAILURE; |
return GSS_S_FAILURE; |
|
|
offset = oidl+6; |
offset = oidl+6; |
|
|
if (ename->length < offset+4) |
if (ename->length < offset+4) |
return GSS_S_FAILURE; |
return GSS_S_FAILURE; |
|
|
name->length = GET_32BIT(tok+offset); |
name->length = GET_32BIT(tok+offset); |
offset += 4; |
offset += 4; |
|
|
if (ename->length < offset+name->length) |
if (ename->length < offset+name->length) |
return GSS_S_FAILURE; |
return GSS_S_FAILURE; |
|
|
name->value = xmalloc(name->length+1); |
name->value = xmalloc(name->length+1); |
memcpy(name->value,tok+offset,name->length); |
memcpy(name->value,tok+offset,name->length); |
((char *)name->value)[name->length] = 0; |
((char *)name->value)[name->length] = 0; |
|
|
return GSS_S_COMPLETE; |
return GSS_S_COMPLETE; |
} |
} |
|
|
/* Extract the client details from a given context. This can only reliably |
/* Extract the client details from a given context. This can only reliably |
* be called once for a context */ |
* be called once for a context */ |
|
|
int i = 0; |
int i = 0; |
|
|
gss_buffer_desc ename; |
gss_buffer_desc ename; |
|
|
client->mech = NULL; |
client->mech = NULL; |
|
|
while (supported_mechs[i]->name != NULL) { |
while (supported_mechs[i]->name != NULL) { |
|
|
i++; |
i++; |
} |
} |
|
|
if (client->mech == NULL) |
if (client->mech == NULL) |
return GSS_S_FAILURE; |
return GSS_S_FAILURE; |
|
|
if ((ctx->major = gss_display_name(&ctx->minor, ctx->client, |
if ((ctx->major = gss_display_name(&ctx->minor, ctx->client, |
&client->displayname, NULL))) { |
&client->displayname, NULL))) { |
ssh_gssapi_error(ctx); |
ssh_gssapi_error(ctx); |
return (ctx->major); |
return (ctx->major); |
} |
} |
|
|
if ((ctx->major = gss_export_name(&ctx->minor, ctx->client, |
if ((ctx->major = gss_export_name(&ctx->minor, ctx->client, |
&ename))) { |
&ename))) { |
ssh_gssapi_error(ctx); |
ssh_gssapi_error(ctx); |
return (ctx->major); |
return (ctx->major); |
} |
} |
|
|
if ((ctx->major = ssh_gssapi_parse_ename(ctx,&ename, |
if ((ctx->major = ssh_gssapi_parse_ename(ctx,&ename, |
&client->exportedname))) { |
&client->exportedname))) { |
return (ctx->major); |
return (ctx->major); |