diff --git a/AUTHORS b/AUTHORS index ae4fb90..25adc5b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,7 @@ Adrian Simionov Cornel Ciocirlan The Evvolve Team +Lukasz Sierzega Help and feedback received from: diff --git a/ChangeLog b/ChangeLog index 5fd2bb7..b8b2357 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +version 0.9.9 /proposal/: + * Feature: Allowing use MIB-MODULE-NAME:: MODULE-NAME-SPACE:: et cetera in SnmpMibObject TLV which i strongly recommend + that resolve problems with mibs name colision, for example: PacketCable/EuroPacketCable, Motorola/Compal enterprise mibs. + you can use "-f" switch to include MIB-MODULE-NAME:: prefixes in config dump + * Feature: Allowing use C-style inline comments "//" + * Feature: Allow use custom mib for packetcable hash signing becasuse "-eu" / EuroPacketCable and "-na" PacketCable are not enough + use "-H [MIB]" switch to set custom hash mib. + * Attempt to cleanup option parsing mess. Now option parsing is getopt based. However due to preserving option compatibility it is create another mess. Just slighty lesser, i think. + version 0.9.8 (??/??/????): * Massive improvements by Adrian Simionov diff --git a/src/docsis.c b/src/docsis.c index e18fccf..72524d3 100644 --- a/src/docsis.c +++ b/src/docsis.c @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002,2003,2004,2005 Evvolve Media SRL,office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,12 +26,15 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ +#include #include #include #include #include #include #include +#include +#include #include #include @@ -49,6 +53,12 @@ symbol_type *global_symtable; unsigned int nohash = 0; unsigned int dialplan = 0; +char *mta_hash = NULL; +int mib_warning_level = 1; + +char *default_na_hash = "1.3.6.1.4.1.4491.2.2.1.1.2.7.0"; +char *default_eu_hash = "1.3.6.1.4.1.7432.1.1.2.9.0"; + static void setup_mib_flags(int resolve_oids, char *custom_mibs); static unsigned int @@ -68,77 +78,15 @@ add_cm_mic (unsigned char *tlvbuf, unsigned int tlvbuflen) memcpy (tlvbuf + tlvbuflen + 2, digest, 16); return (tlvbuflen + 18); /* we added the CM Message Integrity Check */ } - -static unsigned int -add_eod_and_pad (unsigned char *tlvbuf, unsigned int tlvbuflen) -{ - int nr_pads; - - if (tlvbuf == NULL || tlvbuflen == 0) - return 0; - - tlvbuf[tlvbuflen] = 255; - tlvbuflen = tlvbuflen + 1; - nr_pads = (4 - (tlvbuflen % 4)) % 4; - memset (&tlvbuf[tlvbuflen], 0, nr_pads); - return (tlvbuflen + nr_pads); -} - +/* ADD MTA-HASH*/ static unsigned int -add_cmts_mic (unsigned char *tlvbuf, unsigned int tlvbuflen, - unsigned char *key, int keylen) +add_mta_hash (unsigned char *tlvbuf, unsigned int tlvbuflen) { + unsigned char *buffer; + char hash[SHA_DIGEST_LENGTH*2], mtahash[200]; + int parse_result=0, i=0; + unsigned int buflen; - int i; - register unsigned char *cp, *dp; - unsigned char *cmts_tlvs; - unsigned char digest[17]; - -/* Only these configuration TLVs must be used to calculate the CMTS MIC */ -#define NR_CMTS_MIC_TLVS 21 - unsigned char digest_order[NR_CMTS_MIC_TLVS] = - { 1, 2, 3, 4, 17, 43, 6, 18, 19, 20, 22, 23, 24, 25, 28, 29, 26, 35, 36, 37, 40 }; - - if (tlvbuf == NULL || tlvbuflen == 0 ) - return 0; - - cmts_tlvs = (unsigned char *) malloc (tlvbuflen + 1); /* Plenty of space */ - dp = cmts_tlvs; - for (i = 0; i < NR_CMTS_MIC_TLVS; i++) - { - cp = tlvbuf; - while ((unsigned int) (cp - tlvbuf) < tlvbuflen) - { - if (cp[0] == digest_order[i]) - { - memcpy (dp, cp, cp[1] + 2); - dp = dp + cp[1] + 2; - cp = cp + cp[1] + 2; - } - else - { - if ( cp[0] == 64 ) { - cp = cp + (size_t) ntohs(*((unsigned short *)(cp+1))) + 3; - } else { - cp = cp + cp[1] + 2; - } - } - } - } - fprintf (stdout, "##### Calculating CMTS MIC using TLVs:\n"); - decode_main_aggregate (cmts_tlvs, dp - cmts_tlvs); - fprintf (stdout, "##### End of CMTS MIC TLVs\n"); - hmac_md5 (cmts_tlvs, dp - cmts_tlvs, key, keylen, digest); - md5_print_digest (digest); - tlvbuf[tlvbuflen] = 7; /* CMTS MIC */ - tlvbuf[tlvbuflen + 1] = 16; /* length of MD5 digest */ - memcpy (&tlvbuf[tlvbuflen + 2], digest, 16); - free (cmts_tlvs); - return (tlvbuflen + 18); -} - -static unsigned int -add_mta_hash (unsigned char *tlvbuf, unsigned int tlvbuflen, unsigned int hash) { SHA_CTX shactx; unsigned char hash_value[SHA_DIGEST_LENGTH]; @@ -146,21 +94,47 @@ add_mta_hash (unsigned char *tlvbuf, unsigned int tlvbuflen, unsigned int hash) SHA1_Update(&shactx, tlvbuf, tlvbuflen); SHA1_Final(hash_value, &shactx); - if (hash == 1) { - memcpy (tlvbuf + tlvbuflen - 3, "\x0b\x28\x30\x26\x06\x0e\x2b\x06\x01\x04\x01\xa3\x0b\x02\x02\x01\x01\x02\x07\x00\x04\x14", 22); - tlvbuflen += 19; + //generate hash + memset(hash, 0x0, SHA_DIGEST_LENGTH*2); + + for (i=0; i < SHA_DIGEST_LENGTH; i++) + { + sprintf((char*)&(hash[i*2]), "%02x", hash_value[i]); } - if (hash == 2) { - memcpy (tlvbuf + tlvbuflen - 3, "\x0b\x26\x30\x24\x06\x0c\x2b\x06\x01\x04\x01\xba\x08\x01\x01\x02\x09\x00\x04\x14", 20); - tlvbuflen += 17; + + //generate config-setting + sprintf(mtahash, "Main\n{\n\tSnmpMibObject %s HexString 0x%s ;\n}\n", mta_hash, hash); + + //compile config-setting + parse_result = parse_config_file ("", &global_tlvtree_head, mtahash ); + + if (parse_result || global_tlvtree_head == NULL) + { + fprintf(stderr, "Error parsing hash string %s\n", mtahash); + return -1; } - memcpy (tlvbuf + tlvbuflen, hash_value, SHA_DIGEST_LENGTH); - tlvbuflen += SHA_DIGEST_LENGTH; - memcpy (tlvbuf + tlvbuflen, "\xfe\x01\xff", 3); + buflen = tlvtreelen (global_tlvtree_head); + buffer = (unsigned char *) malloc ( buflen + 255 ); + buflen = flatten_tlvsubtree(buffer, 0, global_tlvtree_head); + +#ifdef DEBUG + printf("SNMP is: %s - length=%d\n", mtahash, buflen); + decode_main_aggregate (buffer, buflen); +#endif /* DEBUG */ + + //replacing "MtaConfigDelimiter 255" + tlvbuflen -= 3; + memcpy (tlvbuf + tlvbuflen , buffer, buflen); + tlvbuflen += buflen; + + //adding "MtaConfigDelimiter 255" + tlvbuf[tlvbuflen] = 254; + tlvbuf[tlvbuflen + 1] = 1; + tlvbuf[tlvbuflen + 2] = 255; tlvbuflen += 3; - return (tlvbuflen); + return (tlvbuflen); /* we have added the MTA-HASH */ } static unsigned int @@ -249,6 +223,75 @@ add_dialplan (unsigned char *tlvbuf, unsigned int tlvbuflen) { return (tlvbuflen); } +static unsigned int +add_eod_and_pad (unsigned char *tlvbuf, unsigned int tlvbuflen) +{ + int nr_pads; + + if (tlvbuf == NULL || tlvbuflen == 0) + return 0; + + tlvbuf[tlvbuflen] = 255; + tlvbuflen = tlvbuflen + 1; + nr_pads = (4 - (tlvbuflen % 4)) % 4; + memset (&tlvbuf[tlvbuflen], 0, nr_pads); + return (tlvbuflen + nr_pads); +} + +static unsigned int +add_cmts_mic (unsigned char *tlvbuf, unsigned int tlvbuflen, + unsigned char *key, int keylen) +{ + + int i; + register unsigned char *cp, *dp; + unsigned char *cmts_tlvs; + unsigned char digest[17]; + +/* Only these configuration TLVs must be used to calculate the CMTS MIC */ +#define NR_CMTS_MIC_TLVS 21 + unsigned char digest_order[NR_CMTS_MIC_TLVS] = + { 1, 2, 3, 4, 17, 43, 6, 18, 19, 20, 22, 23, 24, 25, 28, 29, 26, 35, 36, 37, 40 }; + + if (tlvbuf == NULL || tlvbuflen == 0 ) + return 0; + + cmts_tlvs = (unsigned char *) malloc (tlvbuflen + 1); /* Plenty of space */ + dp = cmts_tlvs; + for (i = 0; i < NR_CMTS_MIC_TLVS; i++) + { + cp = tlvbuf; + while ((unsigned int) (cp - tlvbuf) < tlvbuflen) + { + if (cp[0] == digest_order[i]) + { + memcpy (dp, cp, cp[1] + 2); + dp = dp + cp[1] + 2; + cp = cp + cp[1] + 2; + } + else + { + if ( cp[0] == 64 ) { + fprintf(stderr, "docsis: warning: TLV64 (length > 255) not allowed in DOCSIS config files\n"); + cp = cp + (size_t) ntohs(*((unsigned short *)(cp+1))) + 3; + } else { + cp = cp + cp[1] + 2; + } + } + } + } + fprintf (stderr, "##### Calculating CMTS MIC using TLVs:\n"); + decode_main_aggregate (cmts_tlvs, dp - cmts_tlvs); + fprintf (stderr, "##### End of CMTS MIC TLVs\n"); + hmac_md5 (cmts_tlvs, dp - cmts_tlvs, key, keylen, digest); + md5_print_digest (digest); + tlvbuf[tlvbuflen] = 7; /* CMTS MIC */ + tlvbuf[tlvbuflen + 1] = 16; /* length of MD5 digest */ + memcpy (&tlvbuf[tlvbuflen + 2], digest, 16); + free (cmts_tlvs); + return (tlvbuflen + 18); +} + #ifdef __GNUC__ static void usage () __attribute__((__noreturn__)); #endif @@ -259,7 +302,8 @@ usage () fprintf(stderr, "DOCSIS Configuration File creator, version %s\n", VERSION); fprintf(stderr, "Copyright (c) 1999,2000,2001 Cornel Ciocirlan, ctrl@users.sourceforge.net\n"); fprintf(stderr, "Copyright (c) 2002,2003,2004,2005 Evvolve Media SRL, docsis@evvolve.com\n"); - fprintf(stderr, "Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com\n\n"); + fprintf(stderr, "Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com\n"); + fprintf(stderr, "Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com\n\n"); fprintf(stderr, "To encode a cable modem configuration file: \n\tdocsis [modifiers] -e \n"); fprintf(stderr, "To encode multiple cable modem configuration files: \n\tdocsis [modifiers] -m ... \n"); @@ -291,6 +335,14 @@ usage () " -nohash\n" " Removes the PacketCable SHA1 hash from the MTA config file when\n" " decoding.\n" + " -f\n" + " Include MIB-MODULE-NAME:: prefix when decoding/dumping\n" + " -H\n" + " Use custom MIB for PacketCable config hash:\n" + " Example: -H PKTC-IETF-MTA-MIB::pktcMtaDevProvConfigHash.0, \n" + " -H 1.3.6.1.2.1.140.1.2.11.0 \n" + " -w [integer]\n" + " Set mib warning mode:\n" ); fprintf(stderr, "\nSee examples/*.cfg for sample configuration files.\n"); fprintf(stderr, "\nPlease report bugs or feature requests on GitHub."); @@ -298,6 +350,7 @@ usage () exit (-10); } + int main (int argc, char *argv[]) { @@ -305,201 +358,172 @@ main (int argc, char *argv[]) FILE *kf; char *config_file=NULL, *key_file=NULL, *output_file=NULL, *extension_string=NULL, *custom_mibs=NULL; unsigned int keylen = 0; - unsigned int encode_docsis = FALSE, decode_bin = FALSE, hash = 0; + unsigned int encode_docsis = FALSE, decode_bin = FALSE, process_multiple = FALSE; + char c; int i; int resolve_oids = 1; - while (argc > 0) { - argc--; argv++; - - if (!argc) { - usage(); - } - - /* the initial command-line parameters are flags / modifiers */ - if (!strcmp (argv[0], "-nohash")) { - nohash = 1; - - continue; - } - - if (!strcmp (argv[0], "-o")) { - resolve_oids = 0; - continue; - } - - if (!strcmp (argv[0], "-M")) { - if (argc < 2 ) { - usage(); - } - - custom_mibs=argv[1]; - - argc--; argv++; - continue; - } - - if (!strcmp (argv[0], "-na")) { - if (hash) { - usage(); - } - hash = 1; - continue; - } - - if (!strcmp (argv[0], "-eu")) { - if (hash) { - usage(); - } - hash = 2; - continue; - } - - if (!strcmp (argv[0], "-dialplan")) { - dialplan = 1; - continue; - } - - /* the following command-line parameters are actions */ - - if (!strcmp (argv[0], "-d")) { - if (argc < 2 ) { - usage(); - } - - decode_bin = TRUE; - config_file = argv[1]; - - break; - } - - if (!strcmp (argv[0], "-e")) { - if (argc < 4 ) { - usage(); - } - - encode_docsis = TRUE; - config_file = argv[1]; - key_file = argv[2]; - output_file = argv[3]; - - break; - } - - if (!strcmp (argv[0], "-m")) { - extension_string = argv[argc-1]; - key_file = argv[argc-2]; - encode_docsis = TRUE; - - continue; - } - - if (!strcmp (argv[0], "-p")) { - /* encode_docsis may already have been set via the "-m" option */ - encode_docsis = 0; - - argc--; argv++; - - if (argc < 2 ) { - usage(); - } - - /* -p might be followed by -dialplan. This is allowed for backwards - * compatibility */ - if (!strcmp (argv[0], "-dialplan")) { - dialplan = 1; - argc--; argv++; - } - - if (argc < 2 ) { - usage(); - } - - /* if -m has not already been specified, then we expect " " */ - if (extension_string == NULL) { - config_file = argv[0]; - output_file = argv[1]; - } - - break; - } - - /* no more recognisable options means that we've either finished parsing - * all arguments or else that the remaining arguments refer to a list of - * config files */ - if ((argc && encode_docsis) || (argc && decode_bin)) { - break; - } + if (argc < 2 ) { + usage(); } + mta_hash = getenv("MTAHASH"); + while ((c = getopt (argc, argv, "d::e::fhH::mM:n::op:ow:?")) != -1) { + switch (c) { + case 'd': + if (optarg && strcmp("ialplan", optarg) == 0) + dialplan = 1; + else { + optarg = argv[optind++]; + decode_bin = TRUE; + config_file = optarg; + } + break; + case 'e': + if (optarg && strcmp("u", optarg) == 0) { + mta_hash = default_eu_hash; + } else { + optarg = argv[optind++]; + encode_docsis = TRUE; + config_file = optarg; + if (!process_multiple) { + if (optind <= argc) { + key_file = argv[optind]; + optind++; + } + if (optind <= argc) { + output_file = argv[optind]; + optind++; + } + } else + process_multiple = optind - 1; + } + break; + case 'f': + decode_format = NETSNMP_OID_OUTPUT_MODULE; + break; + case 'H': + if (!optarg) + if(argv[optind] && (*argv[optind] != '-')) + optarg = argv[optind++]; + + mta_hash = (optarg ? optarg : default_na_hash); + break; + case 'm': + process_multiple = TRUE; + extension_string = argv[argc-1]; + key_file = argv[argc-2]; + break; + case 'M': + custom_mibs = optarg; + break; + case 'n': + if (optarg) { + if (strcmp("a", optarg) == 0) + mta_hash = default_na_hash; + else if(strcmp("ohash", optarg) == 0) + nohash = 1; + else { + usage(); + } + } else { + usage(); + } + break; + + case 'o': + resolve_oids = 0; + break; + case 'p': + config_file = optarg; + if (!process_multiple) { + if (optind <= argc) { + output_file = argv[optind]; + optind++; + } + } else + process_multiple = optind - 1; + break; + case 'w': + mib_warning_level = atoi(optarg); + break; + case '?': + case 'h': + usage(); + break; + default: + usage(); + } + } - if (encode_docsis) - { - if ((kf = fopen (key_file, "r")) == NULL) - { - fprintf (stderr, "docsis: error: can't open keyfile %s\n", key_file); - exit (-5); - } - keylen = fread (key, sizeof (unsigned char), 64, kf); - while (keylen > 0 && (key[keylen - 1] == 10 || key[keylen - 1] == 13)) - { - keylen--; /* eliminate trailing \n or \r */ - } - fclose(kf); - } + if(config_file == NULL) { + usage(); + return 1; + } + + if (encode_docsis){ + if ((kf = fopen(key_file, "r")) == NULL) { + fprintf (stderr, "docsis: error: can't open keyfile %s\n", key_file); + exit (-5); + } + keylen = fread (key, sizeof (unsigned char), 64, kf); + while (keylen > 0 && (key[keylen - 1] == 10 || key[keylen - 1] == 13)) { + keylen--; /* eliminate trailing \n or \r */ + } + } - init_global_symtable (); - setup_mib_flags(resolve_oids,custom_mibs); + init_global_symtable (); + setup_mib_flags(resolve_oids,custom_mibs); - if (decode_bin) - { - decode_file (config_file); - exit(0); // TODO: clean shutdown - } + if (decode_bin) + { + decode_file (config_file); + exit(0); // TODO: clean shutdown + } - if (extension_string) { /* encoding multiple files */ - if (encode_docsis) { - /* encode argv[argc-3] to argv[0] */ - for (i=0; i\n { line ++; } . \/[*]+ { fprintf(stderr, "line %d: comment-in-comment not supported", line) ; } +\/\/[^\n]* { COMMENT; } [*]+\/ { BEGIN 0; } [0-9]+ { yylval.intval=atoi(yytext);return T_INTEGER; } diff --git a/src/docsis_snmp.c b/src/docsis_snmp.c index e3d3618..56340c7 100644 --- a/src/docsis_snmp.c +++ b/src/docsis_snmp.c @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002,2003,2004,2005 Evvolve Media SRL,office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +27,8 @@ extern unsigned int line; /* from a.l */ +unsigned int decode_format = NETSNMP_OID_OUTPUT_SUFFIX; + #define PACKET_LENGTH (8 * 1024) unsigned int @@ -339,12 +342,7 @@ decode_vbind (unsigned char *data, unsigned int vb_len) netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, - NETSNMP_OID_OUTPUT_SUFFIX); - - if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_OID_OUTPUT_NUMERIC)) { - netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, - NETSNMP_OID_OUTPUT_NUMERIC); - } + decode_format); snprint_objid (outbuf, 1023, vp->name, vp->name_length); @@ -359,12 +357,12 @@ decode_vbind (unsigned char *data, unsigned int vb_len) netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, NETSNMP_OID_OUTPUT_FULL); - memset (outbuf, 0, 1024); + memset (outbuf, 0, 16384); snprint_objid (outbuf, 1023, vp->name, vp->name_length); /* Go back to suffix-mode for better readability */ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, - NETSNMP_OID_OUTPUT_SUFFIX); + decode_format); } } diff --git a/src/docsis_snmp.h b/src/docsis_snmp.h index 53bc168..6af14be 100644 --- a/src/docsis_snmp.h +++ b/src/docsis_snmp.h @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002 Evvolve Media SRL, office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,5 +49,7 @@ unsigned char *_docsis_snmp_build_var_op(unsigned char * data, unsigned char *_docsis_asn_build_sequence(unsigned char * data, size_t * datalength, unsigned char type, size_t length); +extern unsigned int decode_format; + #endif /* _DOCSIS_SNMP_H */ diff --git a/src/docsis_symtable.h b/src/docsis_symtable.h index de05dbb..ae94694 100644 --- a/src/docsis_symtable.h +++ b/src/docsis_symtable.h @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002,2003,2004,2005 Evvolve Media SRL,office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/docsis_yy.y b/src/docsis_yy.y index 372a5cf..4aa4dc6 100644 --- a/src/docsis_yy.y +++ b/src/docsis_yy.y @@ -38,6 +38,7 @@ extern unsigned int line; /* current line number, defined in a.l */ extern struct tlv *global_tlvtree_head; /* Global list of all config TLVs */ extern symbol_type *global_symtable; extern FILE *yyin; +extern int yy_scan_string(const char *); struct tlv *_my_tlvtree_head; @@ -627,15 +628,21 @@ unsigned int tlvtreelen (struct tlv *tlv) return current_size; } -int parse_config_file ( char *file, struct tlv **parse_tree_result ) +int parse_config_file ( char *file, struct tlv **parse_tree_result, char *mtahash ) { FILE *cf; int rval; + line = 1; if ( !strcmp(file, "-") ) { cf = stdin; } + else if ( strcmp(mtahash, "") ) { + //if cf is not set the encoder runs into a "segmentation fault"! + cf = stdin; + yy_scan_string(mtahash); + } else if ( (cf = fopen ( file, "r" )) == NULL ) { fprintf (stderr, "docsis: Can't open input file %s\n", file ); diff --git a/src/ethermac.c b/src/ethermac.c index d82f26d..f58374c 100644 --- a/src/ethermac.c +++ b/src/ethermac.c @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002 Evvolve Media SRL,office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/ethermac.h b/src/ethermac.h index 32fc5a4..b878c90 100644 --- a/src/ethermac.h +++ b/src/ethermac.h @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002 Evvolve Media SRL,office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/hmac_md5.c b/src/hmac_md5.c index e3da3fc..a678e47 100644 --- a/src/hmac_md5.c +++ b/src/hmac_md5.c @@ -3,6 +3,7 @@ * Copyright (c) 2001 Cornel Ciocirlan, ctrl@users.sourceforge.net. * Copyright (c) 2002, 2003 Evvolve Media SRL, office@evvolve.com * Copyright (c) 2014 - 2015 Adrian Simionov, daniel.simionov@gmail.com + * Copyright (c) 2015 - 2016 Lukasz Sierzega, xarafaxz@gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by