10
10
#define ENV_NAME "displayName"
11
11
12
12
#define SHA256_HASH_SIZE 32
13
- #define SECRET_KEY "THIS_IS_THE_SECRET_KEY"
13
+ #define SECRET_KEY_FILE "/etc/prairielearn.key"
14
+ #define MAX_KEY_LEN 10000
14
15
15
16
char * iso8601Now () {
16
17
time_t current_time ;
@@ -30,7 +31,7 @@ char *iso8601Now() {
30
31
return time_string ;
31
32
}
32
33
33
- char * sha256Signature (char * uid , char * name , char * date ) {
34
+ char * sha256Signature (char * uid , char * name , char * date , char * key ) {
34
35
size_t msg_size , sig_size , i ;
35
36
char * msg ;
36
37
char hash [SHA256_HASH_SIZE ];
@@ -50,7 +51,7 @@ char *sha256Signature(char *uid, char *name, char *date) {
50
51
msg [i ++ ] = '/' ;
51
52
strncpy (& msg [i ], date , strlen (date ));
52
53
53
- hmac_sha256 (SECRET_KEY , strlen (SECRET_KEY ), msg , msg_size , hash , SHA256_HASH_SIZE );
54
+ hmac_sha256 (key , strlen (key ), msg , msg_size , hash , SHA256_HASH_SIZE );
54
55
55
56
sig_size = 2 * SHA256_HASH_SIZE + 1 ;
56
57
if (!(sig = malloc (sig_size * sizeof (char )))) {
@@ -63,12 +64,36 @@ char *sha256Signature(char *uid, char *name, char *date) {
63
64
return sig ;
64
65
}
65
66
67
+ void readkey (char * key ) {
68
+ FILE * keyfile ;
69
+ size_t keysize ;
70
+
71
+ if (!(keyfile = fopen (SECRET_KEY_FILE , "rb" ))) {
72
+ fprintf (stderr , "Error: unable to open key file: %s\n" , SECRET_KEY_FILE );
73
+ exit (1 );
74
+ }
75
+ keysize = fread (key , sizeof (char ), MAX_KEY_LEN , keyfile );
76
+ if (!feof (keyfile )) {
77
+ fprintf (stderr , "Error: key file too large: %s\n" , SECRET_KEY_FILE );
78
+ exit (1 );
79
+ }
80
+ if (ferror (keyfile )) {
81
+ fprintf (stderr , "Error: unable to read key from file: %s\n" , SECRET_KEY_FILE );
82
+ exit (1 );
83
+ }
84
+ while (keysize > 1 && (key [keysize - 1 ] == '\n' || key [keysize - 1 ] == '\r' ))
85
+ keysize -- ;
86
+ key [keysize ] = 0 ;
87
+ }
88
+
66
89
int main () {
67
90
char * uid , * name ;
68
91
char * time_string ;
69
92
char * signature ;
93
+ char key [MAX_KEY_LEN + 1 ];
70
94
// char **env;
71
95
96
+ readkey (key );
72
97
if (!(uid = getenv (ENV_UID ))) {
73
98
fprintf (stderr , "Error: unable to get environment variable: %s\n" , ENV_UID );
74
99
exit (1 );
@@ -83,7 +108,7 @@ int main() {
83
108
printf (" \"name\": \"%s\",\n" , name );
84
109
time_string = iso8601Now ();
85
110
printf (" \"date\": \"%s\",\n" , time_string );
86
- signature = sha256Signature (uid , name , time_string );
111
+ signature = sha256Signature (uid , name , time_string , key );
87
112
printf (" \"signature\": \"%s\"\n" , signature );
88
113
printf ("}\n" );
89
114
/*
0 commit comments