1d059297112922cabb0c674840589be8db821fd9aAdam Langley/* $OpenBSD: msg.c,v 1.16 2015/01/15 09:40:00 djm Exp $ */ 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2002 Markus Friedl. All rights reserved. 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Redistribution and use in source and binary forms, with or without 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * modification, are permitted provided that the following conditions 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * are met: 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 1. Redistributions of source code must retain the above copyright 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * notice, this list of conditions and the following disclaimer. 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 2. Redistributions in binary form must reproduce the above copyright 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * notice, this list of conditions and the following disclaimer in the 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * documentation and/or other materials provided with the distribution. 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h" 27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/types.h> 29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/uio.h> 30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <errno.h> 32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdio.h> 33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <string.h> 34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <unistd.h> 35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdarg.h> 36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 37d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "sshbuf.h" 38d059297112922cabb0c674840589be8db821fd9aAdam Langley#include "ssherr.h" 39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "log.h" 40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "atomicio.h" 41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "msg.h" 42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "misc.h" 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 45d059297112922cabb0c674840589be8db821fd9aAdam Langleyssh_msg_send(int fd, u_char type, struct sshbuf *m) 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman u_char buf[5]; 48d059297112922cabb0c674840589be8db821fd9aAdam Langley u_int mlen = sshbuf_len(m); 49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman debug3("ssh_msg_send: type %u", (unsigned int)type & 0xff); 51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman put_u32(buf, mlen + 1); 53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman buf[4] = type; /* 1st byte of payload is mesg-type */ 54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (atomicio(vwrite, fd, buf, sizeof(buf)) != sizeof(buf)) { 55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman error("ssh_msg_send: write"); 56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (-1); 57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 58d059297112922cabb0c674840589be8db821fd9aAdam Langley if (atomicio(vwrite, fd, (u_char *)sshbuf_ptr(m), mlen) != mlen) { 59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman error("ssh_msg_send: write"); 60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (-1); 61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (0); 63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 66d059297112922cabb0c674840589be8db821fd9aAdam Langleyssh_msg_recv(int fd, struct sshbuf *m) 67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 68d059297112922cabb0c674840589be8db821fd9aAdam Langley u_char buf[4], *p; 69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman u_int msg_len; 70d059297112922cabb0c674840589be8db821fd9aAdam Langley int r; 71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman debug3("ssh_msg_recv entering"); 73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (atomicio(read, fd, buf, sizeof(buf)) != sizeof(buf)) { 75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (errno != EPIPE) 76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman error("ssh_msg_recv: read: header"); 77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (-1); 78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman msg_len = get_u32(buf); 80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (msg_len > 256 * 1024) { 81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman error("ssh_msg_recv: read: bad msg_len %u", msg_len); 82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (-1); 83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 84d059297112922cabb0c674840589be8db821fd9aAdam Langley sshbuf_reset(m); 85d059297112922cabb0c674840589be8db821fd9aAdam Langley if ((r = sshbuf_reserve(m, msg_len, &p)) != 0) { 86d059297112922cabb0c674840589be8db821fd9aAdam Langley error("%s: buffer error: %s", __func__, ssh_err(r)); 87d059297112922cabb0c674840589be8db821fd9aAdam Langley return -1; 88d059297112922cabb0c674840589be8db821fd9aAdam Langley } 89d059297112922cabb0c674840589be8db821fd9aAdam Langley if (atomicio(read, fd, p, msg_len) != msg_len) { 90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman error("ssh_msg_recv: read: %s", strerror(errno)); 91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (-1); 92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (0); 94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 95