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