1 /* $OpenBSD: sshbuf-misc.c,v 1.1 2014/04/30 05:29:56 djm Exp $ */ 2 /* 3 * Copyright (c) 2011 Damien Miller 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <sys/types.h> 19 #include <sys/socket.h> 20 #include <netinet/in.h> 21 #include <errno.h> 22 #include <stdlib.h> 23 #include <stdio.h> 24 #include <limits.h> 25 #include <string.h> 26 #include <resolv.h> 27 #include <ctype.h> 28 29 #include "ssherr.h" 30 #define SSHBUF_INTERNAL 31 #include "sshbuf.h" 32 33 void 34 sshbuf_dump(struct sshbuf *buf, FILE *f) 35 { 36 const u_char *p = sshbuf_ptr(buf); 37 size_t i, j, len = sshbuf_len(buf); 38 39 fprintf(f, "buffer %p len = %zu\n", buf, len); 40 for (i = 0; i < len; i += 16) { 41 fprintf(f, "%.4zd: ", i); 42 for (j = i; j < i + 16; j++) { 43 if (j < len) 44 fprintf(f, "%02x ", p[j]); 45 else 46 fprintf(f, " "); 47 } 48 fprintf(f, " "); 49 for (j = i; j < i + 16; j++) { 50 if (j < len) { 51 if (isascii(p[j]) && isprint(p[j])) 52 fprintf(f, "%c", p[j]); 53 else 54 fprintf(f, "."); 55 } 56 } 57 fprintf(f, "\n"); 58 } 59 } 60 61 char * 62 sshbuf_dtob16(struct sshbuf *buf) 63 { 64 size_t i, j, len = sshbuf_len(buf); 65 const u_char *p = sshbuf_ptr(buf); 66 char *ret; 67 const char hex[] = "0123456789abcdef"; 68 69 if (len == 0) 70 return strdup(""); 71 if (SIZE_MAX / 2 <= len || (ret = malloc(len * 2 + 1)) == NULL) 72 return NULL; 73 for (i = j = 0; i < len; i++) { 74 ret[j++] = hex[(p[i] >> 4) & 0xf]; 75 ret[j++] = hex[p[i] & 0xf]; 76 } 77 ret[j] = '\0'; 78 return ret; 79 } 80 81 char * 82 sshbuf_dtob64(struct sshbuf *buf) 83 { 84 size_t len = sshbuf_len(buf), plen; 85 const u_char *p = sshbuf_ptr(buf); 86 char *ret; 87 int r; 88 89 if (len == 0) 90 return strdup(""); 91 plen = ((len + 2) / 3) * 4 + 1; 92 if (SIZE_MAX / 2 <= len || (ret = malloc(plen)) == NULL) 93 return NULL; 94 if ((r = b64_ntop(p, len, ret, plen)) == -1) { 95 bzero(ret, plen); 96 free(ret); 97 return NULL; 98 } 99 return ret; 100 } 101 102 int 103 sshbuf_b64tod(struct sshbuf *buf, const char *b64) 104 { 105 size_t plen = strlen(b64); 106 int nlen, r; 107 u_char *p; 108 109 if (plen == 0) 110 return 0; 111 if ((p = malloc(plen)) == NULL) 112 return SSH_ERR_ALLOC_FAIL; 113 if ((nlen = b64_pton(b64, p, plen)) < 0) { 114 bzero(p, plen); 115 free(p); 116 return SSH_ERR_INVALID_FORMAT; 117 } 118 if ((r = sshbuf_put(buf, p, nlen)) < 0) { 119 bzero(p, plen); 120 free(p); 121 return r; 122 } 123 bzero(p, plen); 124 free(p); 125 return 0; 126 } 127 128