diff --git a/SP5WWP/m17-coder/m17-coder-sym.c b/SP5WWP/m17-coder/m17-coder-sym.c index 4aaf969..50a3f68 100644 --- a/SP5WWP/m17-coder/m17-coder-sym.c +++ b/SP5WWP/m17-coder/m17-coder-sym.c @@ -50,11 +50,20 @@ uint8_t sig[64]={0}; //ECDSA signature int dummy=0; //dummy var to make compiler quieter -//AES -uint8_t encryption=0; +//encryption typedef enum { - AES128=1, + ENCR_NONE, + ENCR_SCRAM, + ENCR_AES, + ENCR_RES //reserved +} encr_t; +encr_t encryption=ENCR_NONE; + +//AES +typedef enum +{ + AES128, AES192, AES256 } aes_t; @@ -218,15 +227,49 @@ int main(int argc, char* argv[]) { if(argv[i][1]=='s') //-s - private key for digital signature { - uint16_t len=strlen(argv[i+1]); - - if(len!=32*2) //for secp256r1 + if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file { - fprintf(stderr, "Invalid private key length. Exiting...\n"); - return -1; + if(strlen(argv[i+1])<3) + { + fprintf(stderr, "Invalid filename. Exiting...\n"); + return -1; + } + + FILE* fp; + char source_str[32*2]; + + fp = fopen(argv[i+1], "r"); + if(!fp) + { + fprintf(stderr, "Failed to load file %s.\n", argv[i+1]); + return -1; + } + + //size check + size_t len = fread(source_str, 1, 32*2, fp); + fclose(fp); + + if(len!=32*2) //for secp256r1 + { + fprintf(stderr, "Invalid public key length. Exiting...\n"); + return -1; + } + + parse_raw_key_string(priv_key, source_str); + } + else + { + uint16_t len=strlen(argv[i+1]); + + if(len!=32*2) //for secp256r1 + { + fprintf(stderr, "Invalid private key length. Exiting...\n"); + return -1; + } + + parse_raw_key_string(priv_key, argv[i+1]); } - parse_raw_key_string(priv_key, argv[i+1]); priv_key_loaded=1; //mainly for debug mode i++; } @@ -234,10 +277,7 @@ int main(int argc, char* argv[]) { if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file { - char fname[128]={'\0'}; //output file - if(strlen(&argv[i+1][0])>0) - memcpy(fname, &argv[i+1][0], strlen(argv[i+1])); - else + if(strlen(argv[i+1])<3) { fprintf(stderr, "Invalid filename. Exiting...\n"); return -1; @@ -246,15 +286,15 @@ int main(int argc, char* argv[]) FILE* fp; char source_str[64]; - fp = fopen(fname, "r"); + fp = fopen(argv[i+1], "r"); if(!fp) { - fprintf(stderr, "Failed to load file %s.\n", fname); + fprintf(stderr, "Failed to load file %s.\n", argv[i+1]); return -1; } //size check - size_t len = fread(source_str, 1, 64, fp); //TODO: check length + size_t len = fread(source_str, 1, 64, fp); fclose(fp); if(len==256/4) @@ -309,7 +349,8 @@ int main(int argc, char* argv[]) fprintf(stderr, "\n"); } - encryption=2; //AES key was passed + encryption=ENCR_AES; //AES key was passed + i++; } else if(argv[i][1]=='k') //-k - Scrambler Encryption { @@ -337,7 +378,8 @@ int main(int argc, char* argv[]) else fprintf(stderr, "Scrambler key: 0x%06X (24-bit)\n", scrambler_seed); - encryption=1; //Scrambler key was passed + encryption=ENCR_SCRAM; //Scrambler key was passed + i++; } else if(argv[i][1]=='D') //-D - Debug Mode { diff --git a/SP5WWP/m17-decoder/m17-decoder-sym.c b/SP5WWP/m17-decoder/m17-decoder-sym.c index 353803c..5568437 100644 --- a/SP5WWP/m17-decoder/m17-decoder-sym.c +++ b/SP5WWP/m17-decoder/m17-decoder-sym.c @@ -2,6 +2,7 @@ #include #include #include +#include //libm17 #include "../../libm17/m17.h" @@ -46,11 +47,20 @@ uint8_t signed_str=0; //is the stream signed? uint8_t pub_key[64]={0}; //public key uint8_t sig[64]={0}; //ECDSA signature -//AES -uint8_t encryption=0; +//encryption typedef enum { - AES128=1, + ENCR_NONE, + ENCR_SCRAM, + ENCR_AES, + ENCR_RES //reserved +} encr_t; +encr_t encryption=ENCR_NONE; + +//AES +typedef enum +{ + AES128, AES192, AES256 } aes_t; @@ -124,10 +134,10 @@ void scrambler_sequence_generator() } //TODO: Set Frame Type based on scrambler_subtype value - if (debug_mode > 1) + if (debug_mode>1) { - fprintf (stderr, "\nScrambler Key: 0x%06X; Seed: 0x%06X; Subtype: %02d;", scrambler_seed, lfsr, scrambler_subtype); - fprintf (stderr, "\n pN: "); + fprintf(stderr, "\nScrambler Key: 0x%06X; Seed: 0x%06X; Subtype: %02d;", scrambler_seed, lfsr, scrambler_subtype); + fprintf(stderr, "\n pN: "); } //run pN sequence with taps specified @@ -280,23 +290,52 @@ int main(int argc, char* argv[]) if(!strcmp(argv[i], "-s")) { - uint16_t len=strlen(argv[i+1]); - - if(len!=64*2) //for secp256r1 + if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file { - fprintf(stderr, "Invalid private key length. Exiting...\n"); - return -1; - } + if(strlen(argv[i+1])<3) + { + fprintf(stderr, "Invalid filename. Exiting...\n"); + return -1; + } - parse_raw_key_string(pub_key, argv[i+1]); + FILE* fp; + char source_str[64*2]; + + fp = fopen(argv[i+1], "r"); + if(!fp) + { + fprintf(stderr, "Failed to load file %s.\n", argv[i+1]); + return -1; + } + + //size check + size_t len = fread(source_str, 1, 64*2, fp); + fclose(fp); + + if(len!=64*2) //for secp256r1 + { + fprintf(stderr, "Invalid public key length. Exiting...\n"); + return -1; + } + + parse_raw_key_string(pub_key, source_str); + } + else + { + uint16_t len=strlen(argv[i+1]); + + if(len!=64*2) //for secp256r1 + { + fprintf(stderr, "Invalid public key length. Exiting...\n"); + return -1; + } + + parse_raw_key_string(pub_key, argv[i+1]); + } i++; } - //Woj: There is a bug in loading keys this way, I think - // it is to do with how scannign args is different here than in the encoder? - //when loading by file, the key is shifted by one char - //when loading the hex value, though, it works fine. if(argv[i][1]=='K') //-K - AES Encryption { if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file @@ -318,7 +357,7 @@ int main(int argc, char* argv[]) } //size check - size_t len = fread(source_str, 1, 64, fp); //TODO: check length + size_t len = fread(source_str, 1, 64, fp); fclose(fp); if(len==256/4) @@ -343,8 +382,6 @@ int main(int argc, char* argv[]) fprintf(stderr, " %02X", key[i]); } fprintf(stderr, "\n"); - - i++; } else { @@ -375,7 +412,8 @@ int main(int argc, char* argv[]) fprintf(stderr, "\n"); } - encryption=2; //AES key was passed + encryption=ENCR_AES; //AES key was passed + i++; } if(argv[i][1]=='k') //-k - Scrambler Encryption { @@ -403,7 +441,7 @@ int main(int argc, char* argv[]) else fprintf(stderr, "Scrambler key: 0x%06X (24-bit)\n", scrambler_key); - encryption=1; //Scrambler key was passed + encryption=ENCR_SCRAM; //Scrambler key was passed scrambler_seed = scrambler_key; //set initial seed value to key value } @@ -513,7 +551,7 @@ int main(int argc, char* argv[]) //The Signature is not encrypted //AES - if(encryption == 2 && fn<0x7FFC) + if(encryption==ENCR_AES && fn<0x7FFC) { memcpy(iv, lsf+14, 14); iv[14] = frame_data[1] & 0x7F; @@ -522,7 +560,7 @@ int main(int argc, char* argv[]) } //Scrambler - if(encryption == 1 && fn<0x7FFC) + if(encryption==ENCR_SCRAM && fn<0x7FFC) { if ((fn % 0x8000)!=expected_next_fn) //frame skip, etc scrambler_seed = scrambler_seed_calculation(scrambler_subtype, scrambler_key, fn&0x7FFF);