/* Pack a .keyb file into a .vbpubk, or a .pem into a .vbprivk */ static int Pack(const char *infile, const char *outfile, uint64_t algorithm, uint64_t version) { VbPublicKey* pubkey; VbPrivateKey* privkey; if (!infile || !outfile) { fprintf(stderr, "vbutil_key: Must specify --in and --out\n"); return 1; } if ((pubkey = PublicKeyReadKeyb(infile, algorithm, version))) { if (0 != PublicKeyWrite(outfile, pubkey)) { fprintf(stderr, "vbutil_key: Error writing key.\n"); return 1; } free(pubkey); return 0; } if ((privkey = PrivateKeyReadPem(infile, algorithm))) { if (0 != PrivateKeyWrite(outfile, privkey)) { fprintf(stderr, "vbutil_key: Error writing key.\n"); return 1; } free(privkey); return 0; } VbExError("Unable to parse either .keyb or .pem from %s\n", infile); return 1; }
int test_permutation(int signing_key_algorithm, int data_key_algorithm, const char *keys_dir) { char filename[1024]; int signing_rsa_len = siglen_map[signing_key_algorithm] * 8; int data_rsa_len = siglen_map[data_key_algorithm] * 8; VbPrivateKey *signing_private_key = NULL; VbPublicKey *signing_public_key = NULL; VbPublicKey *data_public_key = NULL; printf("***Testing signing algorithm: %s\n", algo_strings[signing_key_algorithm]); printf("***With data key algorithm: %s\n", algo_strings[data_key_algorithm]); sprintf(filename, "%s/key_rsa%d.pem", keys_dir, signing_rsa_len); signing_private_key = PrivateKeyReadPem(filename, signing_key_algorithm); if (!signing_private_key) { fprintf(stderr, "Error reading signing_private_key: %s\n", filename); return 1; } sprintf(filename, "%s/key_rsa%d.keyb", keys_dir, signing_rsa_len); signing_public_key = PublicKeyReadKeyb(filename, signing_key_algorithm, 1); if (!signing_public_key) { fprintf(stderr, "Error reading signing_public_key: %s\n", filename); return 1; } sprintf(filename, "%s/key_rsa%d.keyb", keys_dir, data_rsa_len); data_public_key = PublicKeyReadKeyb(filename, data_key_algorithm, 1); if (!data_public_key) { fprintf(stderr, "Error reading data_public_key: %s\n", filename); return 1; } test_verify_keyblock(signing_public_key, signing_private_key, data_public_key); test_verify_fw_preamble(signing_public_key, signing_private_key, data_public_key); if (signing_public_key) free(signing_public_key); if (signing_private_key) free(signing_private_key); if (data_public_key) free(data_public_key); return 0; }
int test_algorithm(int key_algorithm, const char *keys_dir) { char filename[1024]; int rsa_len = siglen_map[key_algorithm] * 8; VbPrivateKey *private_key = NULL; VbPublicKey *public_key = NULL; printf("***Testing algorithm: %s\n", algo_strings[key_algorithm]); sprintf(filename, "%s/key_rsa%d.pem", keys_dir, rsa_len); private_key = PrivateKeyReadPem(filename, key_algorithm); if (!private_key) { fprintf(stderr, "Error reading private_key: %s\n", filename); return 1; } sprintf(filename, "%s/key_rsa%d.keyb", keys_dir, rsa_len); public_key = PublicKeyReadKeyb(filename, key_algorithm, 1); if (!public_key) { fprintf(stderr, "Error reading public_key: %s\n", filename); return 1; } VerifyPublicKeyToRSA(public_key); VerifyDataTest(public_key, private_key); VerifyDigestTest(public_key, private_key); VerifyKernelPreambleTest(public_key, private_key); if (public_key) free(public_key); if (private_key) free(private_key); return 0; }