kopia lustrzana https://github.com/M17-Project/M17_Implementations
load ECDSA keys from file
rodzic
9177ef79c3
commit
58e4d0bc5e
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Ładowanie…
Reference in New Issue