1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear SSH 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2002,2003 Matt Johnston 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2004 by Mihnea Stoenescu 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved. 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * in the Software without restriction, including without limitation the rights 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * furnished to do so, subject to the following conditions: 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The above copyright notice and this permission notice shall be included in 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all copies or substantial portions of the Software. 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SOFTWARE. */ 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "algo.h" 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dbutil.h" 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* This file (algo.c) organises the ciphers which can be used, and is used to 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * decide which ciphers/hashes/compression/signing to use during key exchange*/ 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Mappings for ciphers, parameters are 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&cipher_desc, keysize, blocksize} */ 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* NOTE: if keysize > 2*SHA1_HASH_SIZE, code such as hashkeys() 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project needs revisiting */ 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_AES256_CBC 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_aes256 = 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&aes_desc, 32, 16}; 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_AES128_CBC 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_aes128 = 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&aes_desc, 16, 16}; 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_BLOWFISH_CBC 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_blowfish = 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&blowfish_desc, 16, 8}; 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_TWOFISH256_CBC 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_twofish256 = 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&twofish_desc, 32, 16}; 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_TWOFISH128_CBC 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_twofish128 = 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&twofish_desc, 16, 16}; 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_3DES_CBC 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_cipher dropbear_3des = 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&des3_desc, 24, 8}; 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* used to indicate no encryption, as defined in rfc2410 */ 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct dropbear_cipher dropbear_nocipher = 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 16, 8}; 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Mapping of ssh hashes to libtomcrypt hashes, including keysize etc. 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&hash_desc, keysize, hashsize} */ 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_SHA1_HMAC 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_hash dropbear_sha1 = 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&sha1_desc, 20, 20}; 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_SHA1_96_HMAC 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_hash dropbear_sha1_96 = 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&sha1_desc, 20, 12}; 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_MD5_HMAC 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct dropbear_hash dropbear_md5 = 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {&md5_desc, 16, 16}; 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct dropbear_hash dropbear_nohash = 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 16, 0}; /* used initially */ 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* The following map ssh names to internal values */ 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectalgo_type sshciphers[] = { 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_AES128_CBC 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"aes128-cbc", 0, (void*)&dropbear_aes128, 1}, 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_3DES_CBC 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"3des-cbc", 0, (void*)&dropbear_3des, 1}, 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_AES256_CBC 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"aes256-cbc", 0, (void*)&dropbear_aes256, 1}, 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_TWOFISH256_CBC 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"twofish256-cbc", 0, (void*)&dropbear_twofish256, 1}, 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"twofish-cbc", 0, (void*)&dropbear_twofish256, 1}, 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_TWOFISH128_CBC 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"twofish128-cbc", 0, (void*)&dropbear_twofish128, 1}, 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_BLOWFISH_CBC 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"blowfish-cbc", 0, (void*)&dropbear_blowfish, 1}, 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 0, NULL, 0} 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectalgo_type sshhashes[] = { 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_SHA1_96_HMAC 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"hmac-sha1-96", 0, (void*)&dropbear_sha1_96, 1}, 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_SHA1_HMAC 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"hmac-sha1", 0, (void*)&dropbear_sha1, 1}, 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_MD5_HMAC 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"hmac-md5", 0, (void*)&dropbear_md5, 1}, 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 0, NULL, 0} 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectalgo_type sshcompress[] = { 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef DISABLE_ZLIB 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"zlib", DROPBEAR_COMP_ZLIB, NULL, 1}, 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"none", DROPBEAR_COMP_NONE, NULL, 1}, 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 0, NULL, 0} 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectalgo_type sshhostkey[] = { 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_RSA 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"ssh-rsa", DROPBEAR_SIGNKEY_RSA, NULL, 1}, 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_DSS 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"ssh-dss", DROPBEAR_SIGNKEY_DSS, NULL, 1}, 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 0, NULL, 0} 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectalgo_type sshkex[] = { 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {"diffie-hellman-group1-sha1", DROPBEAR_KEX_DH_GROUP1, NULL, 1}, 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project {NULL, 0, NULL, 0} 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Register the compiled in ciphers. 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * This should be run before using any of the ciphers/hashes */ 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid crypto_init() { 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project const struct ltc_cipher_descriptor *regciphers[] = { 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_AES_CBC 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &aes_desc, 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_BLOWFISH_CBC 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_desc, 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_TWOFISH_CBC 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &twofish_desc, 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_3DES_CBC 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &des3_desc, 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project NULL 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project }; 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project const struct ltc_hash_descriptor *reghashes[] = { 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* we need sha1 for hostkey stuff regardless */ 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &sha1_desc, 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DROPBEAR_MD5_HMAC 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &md5_desc, 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project NULL 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project }; 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int i; 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; regciphers[i] != NULL; i++) { 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (register_cipher(regciphers[i]) == -1) { 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dropbear_exit("error registering crypto"); 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; reghashes[i] != NULL; i++) { 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (register_hash(reghashes[i]) == -1) { 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dropbear_exit("error registering crypto"); 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* algolen specifies the length of algo, algos is our local list to match 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * against. 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Returns DROPBEAR_SUCCESS if we have a match for algo, DROPBEAR_FAILURE 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * otherwise */ 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint have_algo(char* algo, size_t algolen, algo_type algos[]) { 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int i; 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; algos[i].name != NULL; i++) { 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (strlen(algos[i].name) == algolen 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project && (strncmp(algos[i].name, algo, algolen) == 0)) { 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return DROPBEAR_SUCCESS; 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return DROPBEAR_FAILURE; 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Output a comma separated list of algorithms to a buffer */ 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid buf_put_algolist(buffer * buf, algo_type localalgos[]) { 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int i, len; 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int donefirst = 0; 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buffer *algolist = NULL; 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project algolist = buf_new(100); 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; localalgos[i].name != NULL; i++) { 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (localalgos[i].usable) { 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (donefirst) 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putbyte(algolist, ','); 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project donefirst = 1; 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project len = strlen(localalgos[i].name); 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putbytes(algolist, localalgos[i].name, len); 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(buf, algolist->data, algolist->len); 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_free(algolist); 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 231