diff options
author | Martin Willi <martin@revosec.ch> | 2015-03-27 14:02:08 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2015-04-15 11:35:26 +0200 |
commit | 22d0c934cd2a38d03109400ee3b8d40532861a42 (patch) | |
tree | 623775b88beaaee4fe2fa3057ee1dbc9c8aa0bfe | |
parent | 3935d812b72da7fc85d8b05c8190a45beac625ac (diff) | |
download | strongswan-22d0c934cd2a38d03109400ee3b8d40532861a42.tar.bz2 strongswan-22d0c934cd2a38d03109400ee3b8d40532861a42.tar.xz |
crypt-burn: Support burning signers
-rw-r--r-- | scripts/crypt_burn.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/scripts/crypt_burn.c b/scripts/crypt_burn.c index 092306c13..c0143d0a5 100644 --- a/scripts/crypt_burn.c +++ b/scripts/crypt_burn.c @@ -124,6 +124,56 @@ static bool burn_aead(const proposal_token_t *token, u_int limit, u_int len) return ok; } +static int burn_signer(const proposal_token_t *token, u_int limit, u_int len) +{ + chunk_t key, data, sig; + signer_t *signer; + int i = 0; + bool ok; + + signer = lib->crypto->create_signer(lib->crypto, token->algorithm); + if (!signer) + { + fprintf(stderr, "%N not supported\n", + integrity_algorithm_names, token->algorithm); + return FALSE; + } + + data = chunk_alloc(len); + memset(data.ptr, 0xDD, data.len); + key = chunk_alloc(signer->get_key_size(signer)); + memset(key.ptr, 0xAA, key.len); + sig = chunk_alloc(signer->get_block_size(signer)); + + ok = signer->set_key(signer, key); + while (ok) + { + if (!signer->get_signature(signer, data, sig.ptr)) + { + fprintf(stderr, "creating signature failed!\n"); + ok = FALSE; + break; + } + if (!signer->verify_signature(signer, data, sig)) + { + fprintf(stderr, "verifying signature failed!\n"); + ok = FALSE; + break; + } + if (limit && ++i == limit) + { + break; + } + } + signer->destroy(signer); + + free(data.ptr); + free(key.ptr); + free(sig.ptr); + + return ok; +} + int main(int argc, char *argv[]) { const proposal_token_t *token; @@ -170,6 +220,9 @@ int main(int argc, char *argv[]) ok = burn_crypter(token, limit, len); } break; + case INTEGRITY_ALGORITHM: + ok = burn_signer(token, limit, len); + break; default: fprintf(stderr, "'%s' is not a crypter/aead algorithm!\n", argv[1]); ok = FALSE; |