Annotation of embedaddon/strongswan/scripts/crypt_burn.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2010 Martin Willi
! 3: * Copyright (C) 2010 revosec AG
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include <stdio.h>
! 17: #include <library.h>
! 18:
! 19: static int burn_crypter(const proposal_token_t *token, u_int limit, u_int len)
! 20: {
! 21: chunk_t iv, key, data;
! 22: crypter_t *crypter;
! 23: int i = 0;
! 24: bool ok;
! 25:
! 26: crypter = lib->crypto->create_crypter(lib->crypto, token->algorithm,
! 27: token->keysize / 8);
! 28: if (!crypter)
! 29: {
! 30: fprintf(stderr, "%N-%zu not supported\n",
! 31: encryption_algorithm_names, token->algorithm, token->keysize);
! 32: return FALSE;
! 33: }
! 34:
! 35: iv = chunk_alloc(crypter->get_iv_size(crypter));
! 36: memset(iv.ptr, 0xFF, iv.len);
! 37: data = chunk_alloc(round_up(len, crypter->get_block_size(crypter)));
! 38: memset(data.ptr, 0xDD, data.len);
! 39: key = chunk_alloc(crypter->get_key_size(crypter));
! 40: memset(key.ptr, 0xAA, key.len);
! 41:
! 42: ok = crypter->set_key(crypter, key);
! 43: while (ok)
! 44: {
! 45: if (!crypter->encrypt(crypter, data, iv, NULL))
! 46: {
! 47: fprintf(stderr, "encryption failed!\n");
! 48: ok = FALSE;
! 49: break;
! 50: }
! 51: if (!crypter->decrypt(crypter, data, iv, NULL))
! 52: {
! 53: fprintf(stderr, "decryption failed!\n");
! 54: ok = FALSE;
! 55: break;
! 56: }
! 57: if (limit && ++i == limit)
! 58: {
! 59: break;
! 60: }
! 61: }
! 62: crypter->destroy(crypter);
! 63:
! 64: free(iv.ptr);
! 65: free(data.ptr);
! 66: free(key.ptr);
! 67:
! 68: return ok;
! 69: }
! 70:
! 71: static bool burn_aead(const proposal_token_t *token, u_int limit, u_int len)
! 72: {
! 73: chunk_t iv, key, data, dataicv, assoc;
! 74: aead_t *aead;
! 75: int i = 0;
! 76: bool ok;
! 77:
! 78: aead = lib->crypto->create_aead(lib->crypto, token->algorithm,
! 79: token->keysize / 8, 0);
! 80: if (!aead)
! 81: {
! 82: fprintf(stderr, "%N-%zu not supported\n",
! 83: encryption_algorithm_names, token->algorithm, token->keysize);
! 84: return FALSE;
! 85: }
! 86:
! 87: iv = chunk_alloc(aead->get_iv_size(aead));
! 88: memset(iv.ptr, 0xFF, iv.len);
! 89: dataicv = chunk_alloc(round_up(len, aead->get_block_size(aead)) +
! 90: aead->get_icv_size(aead));
! 91: data = chunk_create(dataicv.ptr, dataicv.len - aead->get_icv_size(aead));
! 92: memset(data.ptr, 0xDD, data.len);
! 93: assoc = chunk_alloc(13);
! 94: memset(assoc.ptr, 0xCC, assoc.len);
! 95: key = chunk_alloc(aead->get_key_size(aead));
! 96: memset(key.ptr, 0xAA, key.len);
! 97:
! 98: ok = aead->set_key(aead, key);
! 99: while (ok)
! 100: {
! 101: if (!aead->encrypt(aead, data, assoc, iv, NULL))
! 102: {
! 103: fprintf(stderr, "aead encryption failed!\n");
! 104: ok = FALSE;
! 105: break;
! 106: }
! 107: if (!aead->decrypt(aead, dataicv, assoc, iv, NULL))
! 108: {
! 109: fprintf(stderr, "aead integrity check failed!\n");
! 110: ok = FALSE;
! 111: break;
! 112: }
! 113: if (limit && ++i == limit)
! 114: {
! 115: break;
! 116: }
! 117: }
! 118: aead->destroy(aead);
! 119:
! 120: free(iv.ptr);
! 121: free(data.ptr);
! 122: free(key.ptr);
! 123: free(assoc.ptr);
! 124:
! 125: return ok;
! 126: }
! 127:
! 128: static int burn_signer(const proposal_token_t *token, u_int limit, u_int len)
! 129: {
! 130: chunk_t key, data, sig;
! 131: signer_t *signer;
! 132: int i = 0;
! 133: bool ok;
! 134:
! 135: signer = lib->crypto->create_signer(lib->crypto, token->algorithm);
! 136: if (!signer)
! 137: {
! 138: fprintf(stderr, "%N not supported\n",
! 139: integrity_algorithm_names, token->algorithm);
! 140: return FALSE;
! 141: }
! 142:
! 143: data = chunk_alloc(len);
! 144: memset(data.ptr, 0xDD, data.len);
! 145: key = chunk_alloc(signer->get_key_size(signer));
! 146: memset(key.ptr, 0xAA, key.len);
! 147: sig = chunk_alloc(signer->get_block_size(signer));
! 148:
! 149: ok = signer->set_key(signer, key);
! 150: while (ok)
! 151: {
! 152: if (!signer->get_signature(signer, data, sig.ptr))
! 153: {
! 154: fprintf(stderr, "creating signature failed!\n");
! 155: ok = FALSE;
! 156: break;
! 157: }
! 158: if (!signer->verify_signature(signer, data, sig))
! 159: {
! 160: fprintf(stderr, "verifying signature failed!\n");
! 161: ok = FALSE;
! 162: break;
! 163: }
! 164: if (limit && ++i == limit)
! 165: {
! 166: break;
! 167: }
! 168: }
! 169: signer->destroy(signer);
! 170:
! 171: free(data.ptr);
! 172: free(key.ptr);
! 173: free(sig.ptr);
! 174:
! 175: return ok;
! 176: }
! 177:
! 178: int main(int argc, char *argv[])
! 179: {
! 180: const proposal_token_t *token;
! 181: u_int limit = 0, len = 1024;
! 182: bool ok;
! 183:
! 184: library_init(NULL, "crypt_burn");
! 185: lib->plugins->load(lib->plugins, getenv("PLUGINS") ?: PLUGINS);
! 186: atexit(library_deinit);
! 187:
! 188: fprintf(stderr, "loaded: %s\n", lib->plugins->loaded_plugins(lib->plugins));
! 189:
! 190: if (argc < 2)
! 191: {
! 192: fprintf(stderr, "usage: %s <algorithm> [buflen=%u] [rounds=%u]\n",
! 193: argv[0], len, limit);
! 194: return 1;
! 195: }
! 196: if (argc > 2)
! 197: {
! 198: len = atoi(argv[2]);
! 199: if (len > (1 << 30))
! 200: {
! 201: fprintf(stderr, "buffer too large (1 GiB limit)\n");
! 202: return 1;
! 203: }
! 204: }
! 205: if (argc > 3)
! 206: {
! 207: limit = atoi(argv[3]);
! 208: }
! 209:
! 210: token = lib->proposal->get_token(lib->proposal, argv[1]);
! 211: if (!token)
! 212: {
! 213: fprintf(stderr, "algorithm '%s' unknown!\n", argv[1]);
! 214: return 1;
! 215: }
! 216:
! 217: switch (token->type)
! 218: {
! 219: case ENCRYPTION_ALGORITHM:
! 220: if (encryption_algorithm_is_aead(token->algorithm))
! 221: {
! 222: ok = burn_aead(token, limit, len);
! 223: }
! 224: else
! 225: {
! 226: ok = burn_crypter(token, limit, len);
! 227: }
! 228: break;
! 229: case INTEGRITY_ALGORITHM:
! 230: ok = burn_signer(token, limit, len);
! 231: break;
! 232: default:
! 233: fprintf(stderr, "'%s' is not a crypter/aead algorithm!\n", argv[1]);
! 234: ok = FALSE;
! 235: break;
! 236: }
! 237: return !ok;
! 238: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>