| Index: src/platform/vboot_reference/utils/file_keys.c
|
| diff --git a/src/platform/vboot_reference/utils/file_keys.c b/src/platform/vboot_reference/utils/file_keys.c
|
| index 8a8a2cb2c0f1b605d8236e4ecb98b12f69d147f7..bcba749a4bb92c1d629959db629a3138d5d07453 100644
|
| --- a/src/platform/vboot_reference/utils/file_keys.c
|
| +++ b/src/platform/vboot_reference/utils/file_keys.c
|
| @@ -15,6 +15,7 @@
|
| #include <sys/types.h>
|
| #include <unistd.h>
|
|
|
| +#include "padding.h"
|
| #include "rsa_utility.h"
|
| #include "utility.h"
|
|
|
| @@ -55,3 +56,41 @@ RSAPublicKey* RSAPublicKeyFromFile(char* input_file) {
|
| Free(buf);
|
| return key;
|
| }
|
| +
|
| +uint8_t* SignatureFile(char* input_file, char* key_file, int algorithm) {
|
| + char* sign_utility = "./sign_data.sh";
|
| + char* cmd; /* Command line to invoke. */
|
| + int cmd_len;
|
| + FILE* cmd_out; /* File descriptor to command output. */
|
| + uint8_t* signature = NULL;
|
| + int signature_size = siglen_map[algorithm] * sizeof(uint32_t);
|
| +
|
| + /* Build command line:
|
| + * sign_data.sh <algorithm> <key file> <input file>
|
| + */
|
| + cmd_len = (strlen(sign_utility) + 1 + /* +1 for space. */
|
| + 2 + 1 + /* For [algorithm]. */
|
| + strlen(key_file) + 1 + /* +1 for space. */
|
| + strlen(input_file) +
|
| + 1); /* For the trailing '\0'. */
|
| + cmd = (char*) Malloc(cmd_len);
|
| + snprintf(cmd, cmd_len, "%s %d %s %s", sign_utility, algorithm, key_file,
|
| + input_file);
|
| + cmd_out = popen(cmd, "r");
|
| + Free(cmd);
|
| + if (!cmd_out) {
|
| + fprintf(stderr, "Couldn't execute: %s\n", cmd);
|
| + return NULL;
|
| + }
|
| +
|
| + signature = (uint8_t*) Malloc(signature_size);
|
| + if (fread(signature, signature_size, 1, cmd_out) != 1) {
|
| + fprintf(stderr, "Couldn't read signature.\n");
|
| + pclose(cmd_out);
|
| + Free(signature);
|
| + return NULL;
|
| + }
|
| +
|
| + pclose(cmd_out);
|
| + return signature;
|
| +}
|
|
|