summaryrefslogtreecommitdiff
path: root/firmware/bdb/host.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/bdb/host.c')
-rw-r--r--firmware/bdb/host.c72
1 files changed, 70 insertions, 2 deletions
diff --git a/firmware/bdb/host.c b/firmware/bdb/host.c
index 62b2c410..730d17d9 100644
--- a/firmware/bdb/host.c
+++ b/firmware/bdb/host.c
@@ -5,10 +5,10 @@
* Host functions for signing
*/
-#include <stdio.h>
-#include <string.h>
#include <unistd.h>
+#include "2sysincludes.h"
+#include "2common.h"
#include "2sha.h"
#include "bdb.h"
#include "host.h"
@@ -224,6 +224,74 @@ struct bdb_sig *bdb_create_sig(const void *data,
return sig;
}
+int bdb_sign_datakey(uint8_t **bdb, struct rsa_st *key)
+{
+ const struct bdb_header *header = bdb_get_header(*bdb);
+ const struct bdb_key *bdbkey = bdb_get_bdbkey(*bdb);
+ const void *oem = bdb_get_oem_area_0(*bdb);
+ const struct bdb_sig *sig = bdb_get_header_sig(*bdb);
+ struct bdb_sig *new_sig;
+ uint8_t *new_bdb, *src, *dst;
+ size_t len;
+
+ new_sig = bdb_create_sig(oem, header->signed_size,
+ key, bdbkey->sig_alg, NULL);
+ new_bdb = calloc(1, header->bdb_size
+ + (new_sig->struct_size - sig->struct_size));
+ if (!new_bdb)
+ return BDB_ERROR_UNKNOWN;
+
+ /* copy up to sig */
+ src = *bdb;
+ dst = new_bdb;
+ len = bdb_offset_of_header_sig(*bdb);
+ memcpy(dst, src, len);
+
+ /* copy new sig */
+ src += len;
+ dst += len;
+ memcpy(dst, new_sig, new_sig->struct_size);
+
+ /* copy the rest */
+ src += sig->struct_size;
+ dst += new_sig->struct_size;
+ len = bdb_size_of(*bdb) - vb2_offset_of(*bdb, src);
+ memcpy(dst, src, len);
+
+ free(*bdb);
+ free(new_sig);
+ *bdb = new_bdb;
+
+ return BDB_SUCCESS;
+}
+
+int bdb_sign_data(uint8_t **bdb, struct rsa_st *key)
+{
+ const struct bdb_key *datakey = bdb_get_datakey(*bdb);
+ const struct bdb_data *data = bdb_get_data(*bdb);
+ const uint64_t sig_offset = vb2_offset_of(*bdb, bdb_get_data_sig(*bdb));
+ struct bdb_sig *new_sig;
+ uint8_t *new_bdb;
+
+ new_sig = bdb_create_sig(data, data->signed_size,
+ key, datakey->sig_alg, NULL);
+ new_bdb = calloc(1, sig_offset + new_sig->struct_size);
+ if (!new_bdb)
+ return BDB_ERROR_UNKNOWN;
+
+ /* copy all data up to the data sig */
+ memcpy(new_bdb, *bdb, sig_offset);
+
+ /* copy the new signature */
+ memcpy(new_bdb + sig_offset, new_sig, new_sig->struct_size);
+
+ free(*bdb);
+ free(new_sig);
+ *bdb = new_bdb;
+
+ return BDB_SUCCESS;
+}
+
struct bdb_header *bdb_create(struct bdb_create_params *p)
{
size_t bdb_size = 0;