load ECDSA keys from file

pull/35/head
Wojciech Kaczmarski 2024-06-24 19:05:15 +02:00
rodzic 9177ef79c3
commit 58e4d0bc5e
2 zmienionych plików z 122 dodań i 42 usunięć

Wyświetl plik

@ -50,11 +50,20 @@ uint8_t sig[64]={0}; //ECDSA signature
int dummy=0; //dummy var to make compiler quieter int dummy=0; //dummy var to make compiler quieter
//AES //encryption
uint8_t encryption=0;
typedef enum 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, AES192,
AES256 AES256
} aes_t; } aes_t;
@ -218,15 +227,49 @@ int main(int argc, char* argv[])
{ {
if(argv[i][1]=='s') //-s - private key for digital signature if(argv[i][1]=='s') //-s - private key for digital signature
{ {
uint16_t len=strlen(argv[i+1]); if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file
if(len!=32*2) //for secp256r1
{ {
fprintf(stderr, "Invalid private key length. Exiting...\n"); if(strlen(argv[i+1])<3)
return -1; {
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 priv_key_loaded=1; //mainly for debug mode
i++; 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 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])<3)
if(strlen(&argv[i+1][0])>0)
memcpy(fname, &argv[i+1][0], strlen(argv[i+1]));
else
{ {
fprintf(stderr, "Invalid filename. Exiting...\n"); fprintf(stderr, "Invalid filename. Exiting...\n");
return -1; return -1;
@ -246,15 +286,15 @@ int main(int argc, char* argv[])
FILE* fp; FILE* fp;
char source_str[64]; char source_str[64];
fp = fopen(fname, "r"); fp = fopen(argv[i+1], "r");
if(!fp) if(!fp)
{ {
fprintf(stderr, "Failed to load file %s.\n", fname); fprintf(stderr, "Failed to load file %s.\n", argv[i+1]);
return -1; return -1;
} }
//size check //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); fclose(fp);
if(len==256/4) if(len==256/4)
@ -309,7 +349,8 @@ int main(int argc, char* argv[])
fprintf(stderr, "\n"); 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 else if(argv[i][1]=='k') //-k - Scrambler Encryption
{ {
@ -337,7 +378,8 @@ int main(int argc, char* argv[])
else else
fprintf(stderr, "Scrambler key: 0x%06X (24-bit)\n", scrambler_seed); 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 else if(argv[i][1]=='D') //-D - Debug Mode
{ {

Wyświetl plik

@ -2,6 +2,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <time.h>
//libm17 //libm17
#include "../../libm17/m17.h" #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 pub_key[64]={0}; //public key
uint8_t sig[64]={0}; //ECDSA signature uint8_t sig[64]={0}; //ECDSA signature
//AES //encryption
uint8_t encryption=0;
typedef enum 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, AES192,
AES256 AES256
} aes_t; } aes_t;
@ -124,10 +134,10 @@ void scrambler_sequence_generator()
} }
//TODO: Set Frame Type based on scrambler_subtype value //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, "\nScrambler Key: 0x%06X; Seed: 0x%06X; Subtype: %02d;", scrambler_seed, lfsr, scrambler_subtype);
fprintf (stderr, "\n pN: "); fprintf(stderr, "\n pN: ");
} }
//run pN sequence with taps specified //run pN sequence with taps specified
@ -280,23 +290,52 @@ int main(int argc, char* argv[])
if(!strcmp(argv[i], "-s")) if(!strcmp(argv[i], "-s"))
{ {
uint16_t len=strlen(argv[i+1]); if(strstr(argv[i+1], ".")) //if the next arg contains a dot - read key from a text file
if(len!=64*2) //for secp256r1
{ {
fprintf(stderr, "Invalid private key length. Exiting...\n"); if(strlen(argv[i+1])<3)
return -1; {
} 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++; 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(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 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 check
size_t len = fread(source_str, 1, 64, fp); //TODO: check length size_t len = fread(source_str, 1, 64, fp);
fclose(fp); fclose(fp);
if(len==256/4) if(len==256/4)
@ -343,8 +382,6 @@ int main(int argc, char* argv[])
fprintf(stderr, " %02X", key[i]); fprintf(stderr, " %02X", key[i]);
} }
fprintf(stderr, "\n"); fprintf(stderr, "\n");
i++;
} }
else else
{ {
@ -375,7 +412,8 @@ int main(int argc, char* argv[])
fprintf(stderr, "\n"); 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 if(argv[i][1]=='k') //-k - Scrambler Encryption
{ {
@ -403,7 +441,7 @@ int main(int argc, char* argv[])
else else
fprintf(stderr, "Scrambler key: 0x%06X (24-bit)\n", scrambler_key); 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 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 //The Signature is not encrypted
//AES //AES
if(encryption == 2 && fn<0x7FFC) if(encryption==ENCR_AES && fn<0x7FFC)
{ {
memcpy(iv, lsf+14, 14); memcpy(iv, lsf+14, 14);
iv[14] = frame_data[1] & 0x7F; iv[14] = frame_data[1] & 0x7F;
@ -522,7 +560,7 @@ int main(int argc, char* argv[])
} }
//Scrambler //Scrambler
if(encryption == 1 && fn<0x7FFC) if(encryption==ENCR_SCRAM && fn<0x7FFC)
{ {
if ((fn % 0x8000)!=expected_next_fn) //frame skip, etc if ((fn % 0x8000)!=expected_next_fn) //frame skip, etc
scrambler_seed = scrambler_seed_calculation(scrambler_subtype, scrambler_key, fn&0x7FFF); scrambler_seed = scrambler_seed_calculation(scrambler_subtype, scrambler_key, fn&0x7FFF);