version 1.66, 2005/06/17 02:44:32 |
version 1.66.2.1, 2006/10/06 03:19:32 |
|
|
|
/* $OpenBSD$ */ |
/* |
/* |
* Author: Tatu Ylonen <ylo@cs.hut.fi> |
* Author: Tatu Ylonen <ylo@cs.hut.fi> |
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
*/ |
|
|
#include "includes.h" |
|
RCSID("$OpenBSD$"); |
|
|
|
|
#include <sys/types.h> |
|
#include <sys/un.h> |
|
#include <sys/socket.h> |
|
|
#include <openssl/evp.h> |
#include <openssl/evp.h> |
|
|
|
#include <openssl/crypto.h> |
|
#include <fcntl.h> |
|
#include <stdlib.h> |
|
#include <signal.h> |
|
#include <string.h> |
|
#include <unistd.h> |
|
|
|
#include "xmalloc.h" |
#include "ssh.h" |
#include "ssh.h" |
#include "rsa.h" |
#include "rsa.h" |
#include "buffer.h" |
#include "buffer.h" |
#include "bufaux.h" |
|
#include "xmalloc.h" |
|
#include "getput.h" |
|
#include "key.h" |
#include "key.h" |
#include "authfd.h" |
#include "authfd.h" |
#include "cipher.h" |
#include "cipher.h" |
|
|
#include "compat.h" |
#include "compat.h" |
#include "log.h" |
#include "log.h" |
#include "atomicio.h" |
#include "atomicio.h" |
|
#include "misc.h" |
|
|
static int agent_present = 0; |
static int agent_present = 0; |
|
|
|
|
close(sock); |
close(sock); |
return -1; |
return -1; |
} |
} |
if (connect(sock, (struct sockaddr *) &sunaddr, sizeof sunaddr) < 0) { |
if (connect(sock, (struct sockaddr *)&sunaddr, sizeof sunaddr) < 0) { |
close(sock); |
close(sock); |
return -1; |
return -1; |
} |
} |
|
|
|
|
/* Get the length of the message, and format it in the buffer. */ |
/* Get the length of the message, and format it in the buffer. */ |
len = buffer_len(request); |
len = buffer_len(request); |
PUT_32BIT(buf, len); |
put_u32(buf, len); |
|
|
/* Send the length and then the packet to the agent. */ |
/* Send the length and then the packet to the agent. */ |
if (atomicio(vwrite, auth->fd, buf, 4) != 4 || |
if (atomicio(vwrite, auth->fd, buf, 4) != 4 || |
|
|
} |
} |
|
|
/* Extract the length, and check it for sanity. */ |
/* Extract the length, and check it for sanity. */ |
len = GET_32BIT(buf); |
len = get_u32(buf); |
if (len > 256 * 1024) |
if (len > 256 * 1024) |
fatal("Authentication response too long: %u", len); |
fatal("Authentication response too long: %u", len); |
|
|
|
|
break; |
break; |
default: |
default: |
return NULL; |
return NULL; |
break; |
|
} |
} |
/* Decrement the number of remaining entries. */ |
/* Decrement the number of remaining entries. */ |
auth->howmany--; |
auth->howmany--; |
|
|
* fatal error if the packet is corrupt. |
* fatal error if the packet is corrupt. |
*/ |
*/ |
for (i = 0; i < 16; i++) |
for (i = 0; i < 16; i++) |
response[i] = buffer_get_char(&buffer); |
response[i] = (u_char)buffer_get_char(&buffer); |
} |
} |
buffer_free(&buffer); |
buffer_free(&buffer); |
return success; |
return success; |
|
|
default: |
default: |
buffer_free(&msg); |
buffer_free(&msg); |
return 0; |
return 0; |
break; |
|
} |
} |
if (constrained) { |
if (constrained) { |
if (life != 0) { |
if (life != 0) { |