veriexecctl_parse.y revision 1.1
11.1Sblymn%{ 21.1Sblymn/* 31.1Sblymn * Parser for verified exec fingerprint file. 41.1Sblymn * 51.1Sblymn * $NetBSD: veriexecctl_parse.y,v 1.1 2002/11/23 10:52:49 blymn Exp $ 61.1Sblymn * 71.1Sblymn */ 81.1Sblymn 91.1Sblymn#include <stdio.h> 101.1Sblymn#include <string.h> 111.1Sblymn#include <errno.h> 121.1Sblymn#include <sys/ioctl.h> 131.1Sblymn#include <sys/verified_exec.h> 141.1Sblymn 151.1Sblymn/* yacc internal function */ 161.1Sblymnstatic int yygrowstack __P((void)); 171.1Sblymnint yylex __P((void)); 181.1Sblymnvoid yyerror __P((const char *)); 191.1Sblymn 201.1Sblymn/* function prototypes */ 211.1Sblymnstatic int 221.1Sblymnconvert(char *fp, unsigned int count, unsigned char *out); 231.1Sblymn 241.1Sblymn/* ioctl parameter struct */ 251.1Sblymnstruct verified_exec_params params; 261.1Sblymnextern int fd; 271.1Sblymnextern int lineno; 281.1Sblymn 291.1Sblymn%} 301.1Sblymn 311.1Sblymn%union { 321.1Sblymn char *string; 331.1Sblymn int intval; 341.1Sblymn} 351.1Sblymn 361.1Sblymn%token EOL 371.1Sblymn%token <string> PATH 381.1Sblymn%token <string> STRING 391.1Sblymn 401.1Sblymn%% 411.1Sblymn 421.1Sblymnstatement: /* empty */ 431.1Sblymn | statement path type fingerprint flags eol 441.1Sblymn ; 451.1Sblymn 461.1Sblymnpath: PATH 471.1Sblymn{ 481.1Sblymn strncpy(params.file, $1, 255); 491.1Sblymn params.type = VERIEXEC_DIRECT; 501.1Sblymn}; 511.1Sblymn 521.1Sblymntype: STRING 531.1Sblymn{ 541.1Sblymn if (strcasecmp($1, "md5") == 0) { 551.1Sblymn params.fp_type = FINGERPRINT_TYPE_MD5; 561.1Sblymn } else if (strcasecmp($1, "sha1") == 0) { 571.1Sblymn params.fp_type = FINGERPRINT_TYPE_SHA1; 581.1Sblymn } else { 591.1Sblymn fprintf(stderr, "%s %s at %d, %s\n", 601.1Sblymn "verifiedexec_load: bad fingerprint type", $1, lineno, 611.1Sblymn "assuming MD5"); 621.1Sblymn params.fp_type = FINGERPRINT_TYPE_MD5; 631.1Sblymn } 641.1Sblymn}; 651.1Sblymn 661.1Sblymn 671.1Sblymnfingerprint: STRING 681.1Sblymn{ 691.1Sblymn unsigned int count; 701.1Sblymn 711.1Sblymn if (params.fp_type == FINGERPRINT_TYPE_SHA1) 721.1Sblymn count = SHA1_FINGERPRINTLEN; 731.1Sblymn else 741.1Sblymn count = MD5_FINGERPRINTLEN; 751.1Sblymn 761.1Sblymn if (convert($1, count, params.fingerprint) < 0) { 771.1Sblymn fprintf(stderr, 781.1Sblymn "verifiedexec_load: bad fingerprint at line %d\n", 791.1Sblymn lineno); 801.1Sblymn } 811.1Sblymn}; 821.1Sblymn 831.1Sblymnflags: /* empty */ 841.1Sblymn | flag_spec flags; 851.1Sblymn 861.1Sblymnflag_spec: STRING 871.1Sblymn{ 881.1Sblymn params.type = VERIEXEC_DIRECT; 891.1Sblymn if (strcasecmp($1, "indirect") == 0) { 901.1Sblymn params.type = VERIEXEC_INDIRECT; 911.1Sblymn } else if (strcasecmp($1, "file") == 0) { 921.1Sblymn params.type = VERIEXEC_FILE; 931.1Sblymn } 941.1Sblymn}; 951.1Sblymn 961.1Sblymneol: EOL 971.1Sblymn{ 981.1Sblymn do_ioctl(); 991.1Sblymn}; 1001.1Sblymn 1011.1Sblymn%% 1021.1Sblymn 1031.1Sblymn/* 1041.1Sblymn * Convert: takes the hexadecimal string pointed to by fp and converts 1051.1Sblymn * it to a "count" byte binary number which is stored in the array pointed to 1061.1Sblymn * by out. Returns -1 if the conversion fails. 1071.1Sblymn */ 1081.1Sblymnstatic int 1091.1Sblymnconvert(char *fp, unsigned int count, unsigned char *out) 1101.1Sblymn{ 1111.1Sblymn int i, value, error = 0; 1121.1Sblymn 1131.1Sblymn for (i = 0; i < count; i++) { 1141.1Sblymn if ((fp[2*i] >= '0') && (fp[2*i] <= '9')) { 1151.1Sblymn value = 16 * (fp[2*i] - '0'); 1161.1Sblymn } else if ((fp[2*i] >= 'a') && (fp[2*i] <= 'f')) { 1171.1Sblymn value = 16 * (10 + fp[2*i] - 'a'); 1181.1Sblymn } else { 1191.1Sblymn error = -1; 1201.1Sblymn break; 1211.1Sblymn } 1221.1Sblymn 1231.1Sblymn if ((fp[2*i + 1] >= '0') && (fp[2*i + 1] <= '9')) { 1241.1Sblymn value += fp[2*i + 1] - '0'; 1251.1Sblymn } else if ((fp[2*i + 1] >= 'a') && (fp[2*i + 1] <= 'f')) { 1261.1Sblymn value += fp[2*i + 1] - 'a' + 10; 1271.1Sblymn } else { 1281.1Sblymn error = -1; 1291.1Sblymn break; 1301.1Sblymn } 1311.1Sblymn 1321.1Sblymn out[i] = value; 1331.1Sblymn } 1341.1Sblymn 1351.1Sblymn return error; 1361.1Sblymn} 1371.1Sblymn 1381.1Sblymn/* 1391.1Sblymn * Perform the load of the fingerprint. Assumes that the fingerprint 1401.1Sblymn * pseudo-device is opened and the file handle is in fd. 1411.1Sblymn */ 1421.1Sblymnstatic void 1431.1Sblymndo_ioctl(void) 1441.1Sblymn{ 1451.1Sblymn if (ioctl(fd, VERIEXECLOAD, ¶ms) < 0) 1461.1Sblymn fprintf(stderr, "Ioctl failed with error `%s' on file %s\n", 1471.1Sblymn strerror(errno), params.file); 1481.1Sblymn} 149