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>