1c19800e8SDoug Rabson /* 2c19800e8SDoug Rabson * Copyright (c) 2005 Kungliga Tekniska H�gskolan 3c19800e8SDoug Rabson * (Royal Institute of Technology, Stockholm, Sweden). 4c19800e8SDoug Rabson * All rights reserved. 5c19800e8SDoug Rabson * 6c19800e8SDoug Rabson * Redistribution and use in source and binary forms, with or without 7c19800e8SDoug Rabson * modification, are permitted provided that the following conditions 8c19800e8SDoug Rabson * are met: 9c19800e8SDoug Rabson * 10c19800e8SDoug Rabson * 1. Redistributions of source code must retain the above copyright 11c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer. 12c19800e8SDoug Rabson * 13c19800e8SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 14c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer in the 15c19800e8SDoug Rabson * documentation and/or other materials provided with the distribution. 16c19800e8SDoug Rabson * 17c19800e8SDoug Rabson * 3. Neither the name of the Institute nor the names of its contributors 18c19800e8SDoug Rabson * may be used to endorse or promote products derived from this software 19c19800e8SDoug Rabson * without specific prior written permission. 20c19800e8SDoug Rabson * 21c19800e8SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22c19800e8SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c19800e8SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24c19800e8SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25c19800e8SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26c19800e8SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27c19800e8SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28c19800e8SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29c19800e8SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30c19800e8SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31c19800e8SDoug Rabson * SUCH DAMAGE. 32c19800e8SDoug Rabson */ 33c19800e8SDoug Rabson 34c19800e8SDoug Rabson #include "der_locl.h" 35c19800e8SDoug Rabson #include <com_err.h> 36c19800e8SDoug Rabson #include <sys/types.h> 37c19800e8SDoug Rabson #include <sys/stat.h> 38c19800e8SDoug Rabson #include <ctype.h> 39c19800e8SDoug Rabson #include <getarg.h> 40c19800e8SDoug Rabson #include <hex.h> 41c19800e8SDoug Rabson #include <err.h> 42c19800e8SDoug Rabson 43c19800e8SDoug Rabson RCSID("$Id: asn1_gen.c 16666 2006-01-30 15:06:03Z lha $"); 44c19800e8SDoug Rabson 45c19800e8SDoug Rabson static int 46c19800e8SDoug Rabson doit(const char *fn) 47c19800e8SDoug Rabson { 48c19800e8SDoug Rabson char buf[2048]; 49c19800e8SDoug Rabson char *fnout; 50c19800e8SDoug Rabson const char *bname; 51c19800e8SDoug Rabson unsigned long line = 0; 52c19800e8SDoug Rabson FILE *f, *fout; 53c19800e8SDoug Rabson size_t offset = 0; 54c19800e8SDoug Rabson 55c19800e8SDoug Rabson f = fopen(fn, "r"); 56c19800e8SDoug Rabson if (f == NULL) 57c19800e8SDoug Rabson err(1, "fopen"); 58c19800e8SDoug Rabson 59c19800e8SDoug Rabson bname = strrchr(fn, '/'); 60c19800e8SDoug Rabson if (bname) 61c19800e8SDoug Rabson bname++; 62c19800e8SDoug Rabson else 63c19800e8SDoug Rabson bname = fn; 64c19800e8SDoug Rabson 65c19800e8SDoug Rabson asprintf(&fnout, "%s.out", bname); 66c19800e8SDoug Rabson if (fnout == NULL) 67c19800e8SDoug Rabson errx(1, "malloc"); 68c19800e8SDoug Rabson 69c19800e8SDoug Rabson fout = fopen(fnout, "w"); 70c19800e8SDoug Rabson if (fout == NULL) 71c19800e8SDoug Rabson err(1, "fopen: output file"); 72c19800e8SDoug Rabson 73c19800e8SDoug Rabson while (fgets(buf, sizeof(buf), f) != NULL) { 74c19800e8SDoug Rabson char *ptr, *class, *type, *tag, *length, *data, *foo; 75c19800e8SDoug Rabson int ret, l, c, ty, ta; 76c19800e8SDoug Rabson unsigned char p[6], *pdata; 77c19800e8SDoug Rabson size_t sz; 78c19800e8SDoug Rabson 79c19800e8SDoug Rabson line++; 80c19800e8SDoug Rabson 81c19800e8SDoug Rabson buf[strcspn(buf, "\r\n")] = '\0'; 82c19800e8SDoug Rabson if (buf[0] == '#' || buf[0] == '\0') 83c19800e8SDoug Rabson continue; 84c19800e8SDoug Rabson 85c19800e8SDoug Rabson ptr = buf; 86c19800e8SDoug Rabson while (isspace((unsigned char)*ptr)) 87c19800e8SDoug Rabson ptr++; 88c19800e8SDoug Rabson 89c19800e8SDoug Rabson class = strtok_r(ptr, " \t\n", &foo); 90c19800e8SDoug Rabson if (class == NULL) errx(1, "class missing on line %lu", line); 91c19800e8SDoug Rabson type = strtok_r(NULL, " \t\n", &foo); 92c19800e8SDoug Rabson if (type == NULL) errx(1, "type missing on line %lu", line); 93c19800e8SDoug Rabson tag = strtok_r(NULL, " \t\n", &foo); 94c19800e8SDoug Rabson if (tag == NULL) errx(1, "tag missing on line %lu", line); 95c19800e8SDoug Rabson length = strtok_r(NULL, " \t\n", &foo); 96c19800e8SDoug Rabson if (length == NULL) errx(1, "length missing on line %lu", line); 97c19800e8SDoug Rabson data = strtok_r(NULL, " \t\n", &foo); 98c19800e8SDoug Rabson 99c19800e8SDoug Rabson c = der_get_class_num(class); 100c19800e8SDoug Rabson if (c == -1) errx(1, "no valid class on line %lu", line); 101c19800e8SDoug Rabson ty = der_get_type_num(type); 102c19800e8SDoug Rabson if (ty == -1) errx(1, "no valid type on line %lu", line); 103c19800e8SDoug Rabson ta = der_get_tag_num(tag); 104c19800e8SDoug Rabson if (ta == -1) 105c19800e8SDoug Rabson ta = atoi(tag); 106c19800e8SDoug Rabson 107c19800e8SDoug Rabson l = atoi(length); 108c19800e8SDoug Rabson 109c19800e8SDoug Rabson printf("line: %3lu offset: %3lu class: %d type: %d " 110c19800e8SDoug Rabson "tag: %3d length: %3d %s\n", 111c19800e8SDoug Rabson line, (unsigned long)offset, c, ty, ta, l, 112c19800e8SDoug Rabson data ? "<have data>" : "<no data>"); 113c19800e8SDoug Rabson 114c19800e8SDoug Rabson ret = der_put_length_and_tag(p + sizeof(p) - 1, sizeof(p), 115c19800e8SDoug Rabson l, 116c19800e8SDoug Rabson c, 117c19800e8SDoug Rabson ty, 118c19800e8SDoug Rabson ta, 119c19800e8SDoug Rabson &sz); 120c19800e8SDoug Rabson if (ret) 121c19800e8SDoug Rabson errx(1, "der_put_length_and_tag: %d", ret); 122c19800e8SDoug Rabson 123c19800e8SDoug Rabson if (fwrite(p + sizeof(p) - sz , sz, 1, fout) != 1) 124c19800e8SDoug Rabson err(1, "fwrite length/tag failed"); 125c19800e8SDoug Rabson offset += sz; 126c19800e8SDoug Rabson 127c19800e8SDoug Rabson if (data) { 128c19800e8SDoug Rabson size_t datalen; 129c19800e8SDoug Rabson 130c19800e8SDoug Rabson datalen = strlen(data) / 2; 131c19800e8SDoug Rabson pdata = emalloc(sz); 132c19800e8SDoug Rabson 133c19800e8SDoug Rabson if (hex_decode(data, pdata, datalen) != datalen) 134c19800e8SDoug Rabson errx(1, "failed to decode data"); 135c19800e8SDoug Rabson 136c19800e8SDoug Rabson if (fwrite(pdata, datalen, 1, fout) != 1) 137c19800e8SDoug Rabson err(1, "fwrite data failed"); 138c19800e8SDoug Rabson offset += datalen; 139c19800e8SDoug Rabson 140c19800e8SDoug Rabson free(pdata); 141c19800e8SDoug Rabson } 142c19800e8SDoug Rabson } 143c19800e8SDoug Rabson printf("line: eof offset: %lu\n", (unsigned long)offset); 144c19800e8SDoug Rabson 145c19800e8SDoug Rabson fclose(fout); 146c19800e8SDoug Rabson fclose(f); 147c19800e8SDoug Rabson return 0; 148c19800e8SDoug Rabson } 149c19800e8SDoug Rabson 150c19800e8SDoug Rabson 151c19800e8SDoug Rabson static int version_flag; 152c19800e8SDoug Rabson static int help_flag; 153c19800e8SDoug Rabson struct getargs args[] = { 154c19800e8SDoug Rabson { "version", 0, arg_flag, &version_flag }, 155c19800e8SDoug Rabson { "help", 0, arg_flag, &help_flag } 156c19800e8SDoug Rabson }; 157c19800e8SDoug Rabson int num_args = sizeof(args) / sizeof(args[0]); 158c19800e8SDoug Rabson 159c19800e8SDoug Rabson static void 160c19800e8SDoug Rabson usage(int code) 161c19800e8SDoug Rabson { 162c19800e8SDoug Rabson arg_printusage(args, num_args, NULL, "parse-file"); 163c19800e8SDoug Rabson exit(code); 164c19800e8SDoug Rabson } 165c19800e8SDoug Rabson 166c19800e8SDoug Rabson int 167c19800e8SDoug Rabson main(int argc, char **argv) 168c19800e8SDoug Rabson { 169c19800e8SDoug Rabson int optidx = 0; 170c19800e8SDoug Rabson 171c19800e8SDoug Rabson setprogname (argv[0]); 172c19800e8SDoug Rabson 173c19800e8SDoug Rabson if(getarg(args, num_args, argc, argv, &optidx)) 174c19800e8SDoug Rabson usage(1); 175c19800e8SDoug Rabson if(help_flag) 176c19800e8SDoug Rabson usage(0); 177c19800e8SDoug Rabson if(version_flag) { 178c19800e8SDoug Rabson print_version(NULL); 179c19800e8SDoug Rabson exit(0); 180c19800e8SDoug Rabson } 181c19800e8SDoug Rabson argv += optidx; 182c19800e8SDoug Rabson argc -= optidx; 183c19800e8SDoug Rabson if (argc != 1) 184c19800e8SDoug Rabson usage (1); 185c19800e8SDoug Rabson 186c19800e8SDoug Rabson return doit (argv[0]); 187c19800e8SDoug Rabson } 188