cya_u
Fork of CyaSSL-forEncrypt by
keys.c@2:d0516dc143b1, 2017-05-10 (annotated)
- Committer:
- vbahl2
- Date:
- Wed May 10 18:20:47 2017 +0000
- Revision:
- 2:d0516dc143b1
- Parent:
- 0:5045d2638c29
updated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
toddouska | 0:5045d2638c29 | 1 | /* keys.c |
toddouska | 0:5045d2638c29 | 2 | * |
toddouska | 0:5045d2638c29 | 3 | * Copyright (C) 2006-2009 Sawtooth Consulting Ltd. |
toddouska | 0:5045d2638c29 | 4 | * |
toddouska | 0:5045d2638c29 | 5 | * This file is part of CyaSSL. |
toddouska | 0:5045d2638c29 | 6 | * |
toddouska | 0:5045d2638c29 | 7 | * CyaSSL is free software; you can redistribute it and/or modify |
toddouska | 0:5045d2638c29 | 8 | * it under the terms of the GNU General Public License as published by |
toddouska | 0:5045d2638c29 | 9 | * the Free Software Foundation; either version 2 of the License, or |
toddouska | 0:5045d2638c29 | 10 | * (at your option) any later version. |
toddouska | 0:5045d2638c29 | 11 | * |
toddouska | 0:5045d2638c29 | 12 | * CyaSSL is distributed in the hope that it will be useful, |
toddouska | 0:5045d2638c29 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
toddouska | 0:5045d2638c29 | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
toddouska | 0:5045d2638c29 | 15 | * GNU General Public License for more details. |
toddouska | 0:5045d2638c29 | 16 | * |
toddouska | 0:5045d2638c29 | 17 | * You should have received a copy of the GNU General Public License |
toddouska | 0:5045d2638c29 | 18 | * along with this program; if not, write to the Free Software |
toddouska | 0:5045d2638c29 | 19 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
toddouska | 0:5045d2638c29 | 20 | */ |
toddouska | 0:5045d2638c29 | 21 | |
toddouska | 0:5045d2638c29 | 22 | |
toddouska | 0:5045d2638c29 | 23 | |
toddouska | 0:5045d2638c29 | 24 | #include "cyassl_int.h" |
toddouska | 0:5045d2638c29 | 25 | #include "cyassl_error.h" |
toddouska | 0:5045d2638c29 | 26 | #ifdef SHOW_SECRETS |
toddouska | 0:5045d2638c29 | 27 | #include <stdio.h> |
toddouska | 0:5045d2638c29 | 28 | #endif |
toddouska | 0:5045d2638c29 | 29 | |
toddouska | 0:5045d2638c29 | 30 | |
toddouska | 0:5045d2638c29 | 31 | #ifndef NO_TLS |
toddouska | 0:5045d2638c29 | 32 | int MakeTlsMasterSecret(SSL*); |
toddouska | 0:5045d2638c29 | 33 | void TLS_hmac(SSL* ssl, byte* digest, const byte* buffer, word32 sz, |
toddouska | 0:5045d2638c29 | 34 | int content, int verify); |
toddouska | 0:5045d2638c29 | 35 | #endif |
toddouska | 0:5045d2638c29 | 36 | |
toddouska | 0:5045d2638c29 | 37 | |
toddouska | 0:5045d2638c29 | 38 | |
toddouska | 0:5045d2638c29 | 39 | int SetCipherSpecs(SSL* ssl) |
toddouska | 0:5045d2638c29 | 40 | { |
toddouska | 0:5045d2638c29 | 41 | switch (ssl->options.cipherSuite) { |
toddouska | 0:5045d2638c29 | 42 | |
toddouska | 0:5045d2638c29 | 43 | #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA |
toddouska | 0:5045d2638c29 | 44 | case SSL_RSA_WITH_RC4_128_SHA : |
toddouska | 0:5045d2638c29 | 45 | ssl->specs.bulk_cipher_algorithm = rc4; |
toddouska | 0:5045d2638c29 | 46 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 47 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 48 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 49 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 50 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 51 | ssl->specs.key_size = RC4_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 52 | ssl->specs.iv_size = 0; |
toddouska | 0:5045d2638c29 | 53 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 54 | |
toddouska | 0:5045d2638c29 | 55 | break; |
toddouska | 0:5045d2638c29 | 56 | #endif |
toddouska | 0:5045d2638c29 | 57 | |
toddouska | 0:5045d2638c29 | 58 | #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA |
toddouska | 0:5045d2638c29 | 59 | case TLS_NTRU_RSA_WITH_RC4_128_SHA : |
toddouska | 0:5045d2638c29 | 60 | ssl->specs.bulk_cipher_algorithm = rc4; |
toddouska | 0:5045d2638c29 | 61 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 62 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 63 | ssl->specs.kea = ntru_kea; |
toddouska | 0:5045d2638c29 | 64 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 65 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 66 | ssl->specs.key_size = RC4_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 67 | ssl->specs.iv_size = 0; |
toddouska | 0:5045d2638c29 | 68 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 69 | |
toddouska | 0:5045d2638c29 | 70 | break; |
toddouska | 0:5045d2638c29 | 71 | #endif |
toddouska | 0:5045d2638c29 | 72 | |
toddouska | 0:5045d2638c29 | 73 | #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5 |
toddouska | 0:5045d2638c29 | 74 | case SSL_RSA_WITH_RC4_128_MD5 : |
toddouska | 0:5045d2638c29 | 75 | ssl->specs.bulk_cipher_algorithm = rc4; |
toddouska | 0:5045d2638c29 | 76 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 77 | ssl->specs.mac_algorithm = md5_mac; |
toddouska | 0:5045d2638c29 | 78 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 79 | ssl->specs.hash_size = MD5_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 80 | ssl->specs.pad_size = PAD_MD5; |
toddouska | 0:5045d2638c29 | 81 | ssl->specs.key_size = RC4_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 82 | ssl->specs.iv_size = 0; |
toddouska | 0:5045d2638c29 | 83 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 84 | |
toddouska | 0:5045d2638c29 | 85 | break; |
toddouska | 0:5045d2638c29 | 86 | #endif |
toddouska | 0:5045d2638c29 | 87 | |
toddouska | 0:5045d2638c29 | 88 | #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA |
toddouska | 0:5045d2638c29 | 89 | case SSL_RSA_WITH_3DES_EDE_CBC_SHA : |
toddouska | 0:5045d2638c29 | 90 | ssl->specs.bulk_cipher_algorithm = triple_des; |
toddouska | 0:5045d2638c29 | 91 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 92 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 93 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 94 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 95 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 96 | ssl->specs.key_size = DES3_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 97 | ssl->specs.block_size = DES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 98 | ssl->specs.iv_size = DES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 99 | |
toddouska | 0:5045d2638c29 | 100 | break; |
toddouska | 0:5045d2638c29 | 101 | #endif |
toddouska | 0:5045d2638c29 | 102 | |
toddouska | 0:5045d2638c29 | 103 | #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA |
toddouska | 0:5045d2638c29 | 104 | case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA : |
toddouska | 0:5045d2638c29 | 105 | ssl->specs.bulk_cipher_algorithm = triple_des; |
toddouska | 0:5045d2638c29 | 106 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 107 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 108 | ssl->specs.kea = ntru_kea; |
toddouska | 0:5045d2638c29 | 109 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 110 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 111 | ssl->specs.key_size = DES3_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 112 | ssl->specs.block_size = DES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 113 | ssl->specs.iv_size = DES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 114 | |
toddouska | 0:5045d2638c29 | 115 | break; |
toddouska | 0:5045d2638c29 | 116 | #endif |
toddouska | 0:5045d2638c29 | 117 | |
toddouska | 0:5045d2638c29 | 118 | #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA |
toddouska | 0:5045d2638c29 | 119 | case TLS_RSA_WITH_AES_128_CBC_SHA : |
toddouska | 0:5045d2638c29 | 120 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 121 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 122 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 123 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 124 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 125 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 126 | ssl->specs.key_size = AES_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 127 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 128 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 129 | |
toddouska | 0:5045d2638c29 | 130 | break; |
toddouska | 0:5045d2638c29 | 131 | #endif |
toddouska | 0:5045d2638c29 | 132 | |
toddouska | 0:5045d2638c29 | 133 | #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA |
toddouska | 0:5045d2638c29 | 134 | case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA : |
toddouska | 0:5045d2638c29 | 135 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 136 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 137 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 138 | ssl->specs.kea = ntru_kea; |
toddouska | 0:5045d2638c29 | 139 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 140 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 141 | ssl->specs.key_size = AES_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 142 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 143 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 144 | |
toddouska | 0:5045d2638c29 | 145 | break; |
toddouska | 0:5045d2638c29 | 146 | #endif |
toddouska | 0:5045d2638c29 | 147 | |
toddouska | 0:5045d2638c29 | 148 | #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA |
toddouska | 0:5045d2638c29 | 149 | case TLS_RSA_WITH_AES_256_CBC_SHA : |
toddouska | 0:5045d2638c29 | 150 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 151 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 152 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 153 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 154 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 155 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 156 | ssl->specs.key_size = AES_256_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 157 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 158 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 159 | |
toddouska | 0:5045d2638c29 | 160 | break; |
toddouska | 0:5045d2638c29 | 161 | #endif |
toddouska | 0:5045d2638c29 | 162 | |
toddouska | 0:5045d2638c29 | 163 | #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA |
toddouska | 0:5045d2638c29 | 164 | case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA : |
toddouska | 0:5045d2638c29 | 165 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 166 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 167 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 168 | ssl->specs.kea = ntru_kea; |
toddouska | 0:5045d2638c29 | 169 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 170 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 171 | ssl->specs.key_size = AES_256_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 172 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 173 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 174 | |
toddouska | 0:5045d2638c29 | 175 | break; |
toddouska | 0:5045d2638c29 | 176 | #endif |
toddouska | 0:5045d2638c29 | 177 | |
toddouska | 0:5045d2638c29 | 178 | #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA |
toddouska | 0:5045d2638c29 | 179 | case TLS_PSK_WITH_AES_128_CBC_SHA : |
toddouska | 0:5045d2638c29 | 180 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 181 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 182 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 183 | ssl->specs.kea = psk_kea; |
toddouska | 0:5045d2638c29 | 184 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 185 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 186 | ssl->specs.key_size = AES_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 187 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 188 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 189 | |
toddouska | 0:5045d2638c29 | 190 | ssl->options.usingPSK_cipher = 1; |
toddouska | 0:5045d2638c29 | 191 | break; |
toddouska | 0:5045d2638c29 | 192 | #endif |
toddouska | 0:5045d2638c29 | 193 | |
toddouska | 0:5045d2638c29 | 194 | #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA |
toddouska | 0:5045d2638c29 | 195 | case TLS_PSK_WITH_AES_256_CBC_SHA : |
toddouska | 0:5045d2638c29 | 196 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 197 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 198 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 199 | ssl->specs.kea = psk_kea; |
toddouska | 0:5045d2638c29 | 200 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 201 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 202 | ssl->specs.key_size = AES_256_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 203 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 204 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 205 | |
toddouska | 0:5045d2638c29 | 206 | ssl->options.usingPSK_cipher = 1; |
toddouska | 0:5045d2638c29 | 207 | break; |
toddouska | 0:5045d2638c29 | 208 | #endif |
toddouska | 0:5045d2638c29 | 209 | |
toddouska | 0:5045d2638c29 | 210 | #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA |
toddouska | 0:5045d2638c29 | 211 | case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : |
toddouska | 0:5045d2638c29 | 212 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 213 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 214 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 215 | ssl->specs.kea = diffie_hellman_kea; |
toddouska | 0:5045d2638c29 | 216 | ssl->specs.sig_algo = rsa_sa_algo; |
toddouska | 0:5045d2638c29 | 217 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 218 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 219 | ssl->specs.key_size = AES_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 220 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 221 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 222 | |
toddouska | 0:5045d2638c29 | 223 | break; |
toddouska | 0:5045d2638c29 | 224 | #endif |
toddouska | 0:5045d2638c29 | 225 | |
toddouska | 0:5045d2638c29 | 226 | #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA |
toddouska | 0:5045d2638c29 | 227 | case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : |
toddouska | 0:5045d2638c29 | 228 | ssl->specs.bulk_cipher_algorithm = aes; |
toddouska | 0:5045d2638c29 | 229 | ssl->specs.cipher_type = block; |
toddouska | 0:5045d2638c29 | 230 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 231 | ssl->specs.kea = diffie_hellman_kea; |
toddouska | 0:5045d2638c29 | 232 | ssl->specs.sig_algo = rsa_sa_algo; |
toddouska | 0:5045d2638c29 | 233 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 234 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 235 | ssl->specs.key_size = AES_256_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 236 | ssl->specs.block_size = AES_BLOCK_SIZE; |
toddouska | 0:5045d2638c29 | 237 | ssl->specs.iv_size = AES_IV_SIZE; |
toddouska | 0:5045d2638c29 | 238 | |
toddouska | 0:5045d2638c29 | 239 | break; |
toddouska | 0:5045d2638c29 | 240 | #endif |
toddouska | 0:5045d2638c29 | 241 | |
toddouska | 0:5045d2638c29 | 242 | #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_MD5 |
toddouska | 0:5045d2638c29 | 243 | case TLS_RSA_WITH_HC_128_CBC_MD5 : |
toddouska | 0:5045d2638c29 | 244 | ssl->specs.bulk_cipher_algorithm = hc128; |
toddouska | 0:5045d2638c29 | 245 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 246 | ssl->specs.mac_algorithm = md5_mac; |
toddouska | 0:5045d2638c29 | 247 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 248 | ssl->specs.hash_size = MD5_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 249 | ssl->specs.pad_size = PAD_MD5; |
toddouska | 0:5045d2638c29 | 250 | ssl->specs.key_size = HC_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 251 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 252 | ssl->specs.iv_size = HC_128_IV_SIZE; |
toddouska | 0:5045d2638c29 | 253 | |
toddouska | 0:5045d2638c29 | 254 | break; |
toddouska | 0:5045d2638c29 | 255 | #endif |
toddouska | 0:5045d2638c29 | 256 | |
toddouska | 0:5045d2638c29 | 257 | #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_SHA |
toddouska | 0:5045d2638c29 | 258 | case TLS_RSA_WITH_HC_128_CBC_SHA : |
toddouska | 0:5045d2638c29 | 259 | ssl->specs.bulk_cipher_algorithm = hc128; |
toddouska | 0:5045d2638c29 | 260 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 261 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 262 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 263 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 264 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 265 | ssl->specs.key_size = HC_128_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 266 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 267 | ssl->specs.iv_size = HC_128_IV_SIZE; |
toddouska | 0:5045d2638c29 | 268 | |
toddouska | 0:5045d2638c29 | 269 | break; |
toddouska | 0:5045d2638c29 | 270 | #endif |
toddouska | 0:5045d2638c29 | 271 | |
toddouska | 0:5045d2638c29 | 272 | #ifdef BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA |
toddouska | 0:5045d2638c29 | 273 | case TLS_RSA_WITH_RABBIT_CBC_SHA : |
toddouska | 0:5045d2638c29 | 274 | ssl->specs.bulk_cipher_algorithm = rabbit; |
toddouska | 0:5045d2638c29 | 275 | ssl->specs.cipher_type = stream; |
toddouska | 0:5045d2638c29 | 276 | ssl->specs.mac_algorithm = sha_mac; |
toddouska | 0:5045d2638c29 | 277 | ssl->specs.kea = rsa_kea; |
toddouska | 0:5045d2638c29 | 278 | ssl->specs.hash_size = SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 279 | ssl->specs.pad_size = PAD_SHA; |
toddouska | 0:5045d2638c29 | 280 | ssl->specs.key_size = RABBIT_KEY_SIZE; |
toddouska | 0:5045d2638c29 | 281 | ssl->specs.block_size = 0; |
toddouska | 0:5045d2638c29 | 282 | ssl->specs.iv_size = RABBIT_IV_SIZE; |
toddouska | 0:5045d2638c29 | 283 | |
toddouska | 0:5045d2638c29 | 284 | break; |
toddouska | 0:5045d2638c29 | 285 | #endif |
toddouska | 0:5045d2638c29 | 286 | |
toddouska | 0:5045d2638c29 | 287 | default: |
toddouska | 0:5045d2638c29 | 288 | return UNSUPPORTED_SUITE; |
toddouska | 0:5045d2638c29 | 289 | } |
toddouska | 0:5045d2638c29 | 290 | |
toddouska | 0:5045d2638c29 | 291 | /* set TLS if it hasn't been turned off */ |
toddouska | 0:5045d2638c29 | 292 | if (ssl->version.major == 3 && ssl->version.minor >= 1) { |
toddouska | 0:5045d2638c29 | 293 | #ifndef NO_TLS |
toddouska | 0:5045d2638c29 | 294 | ssl->options.tls = 1; |
toddouska | 0:5045d2638c29 | 295 | ssl->hmac = TLS_hmac; |
toddouska | 0:5045d2638c29 | 296 | if (ssl->version.minor == 2) |
toddouska | 0:5045d2638c29 | 297 | ssl->options.tls1_1 = 1; |
toddouska | 0:5045d2638c29 | 298 | #endif |
toddouska | 0:5045d2638c29 | 299 | } |
toddouska | 0:5045d2638c29 | 300 | |
toddouska | 0:5045d2638c29 | 301 | #ifdef CYASSL_DTLS |
toddouska | 0:5045d2638c29 | 302 | if (ssl->options.dtls) |
toddouska | 0:5045d2638c29 | 303 | ssl->hmac = TLS_hmac; |
toddouska | 0:5045d2638c29 | 304 | #endif |
toddouska | 0:5045d2638c29 | 305 | |
toddouska | 0:5045d2638c29 | 306 | return 0; |
toddouska | 0:5045d2638c29 | 307 | } |
toddouska | 0:5045d2638c29 | 308 | |
toddouska | 0:5045d2638c29 | 309 | |
toddouska | 0:5045d2638c29 | 310 | enum KeyStuff { |
toddouska | 0:5045d2638c29 | 311 | MASTER_ROUNDS = 3, |
toddouska | 0:5045d2638c29 | 312 | PREFIX = 3, /* up to three letters for master prefix */ |
toddouska | 0:5045d2638c29 | 313 | KEY_PREFIX = 7 /* up to 7 prefix letters for key rounds */ |
toddouska | 0:5045d2638c29 | 314 | |
toddouska | 0:5045d2638c29 | 315 | |
toddouska | 0:5045d2638c29 | 316 | }; |
toddouska | 0:5045d2638c29 | 317 | |
toddouska | 0:5045d2638c29 | 318 | |
toddouska | 0:5045d2638c29 | 319 | /* true or false, zero for error */ |
toddouska | 0:5045d2638c29 | 320 | static int SetPrefix(byte* sha_input, int index) |
toddouska | 0:5045d2638c29 | 321 | { |
toddouska | 0:5045d2638c29 | 322 | switch (index) { |
toddouska | 0:5045d2638c29 | 323 | case 0: |
toddouska | 0:5045d2638c29 | 324 | XMEMCPY(sha_input, "A", 1); |
toddouska | 0:5045d2638c29 | 325 | break; |
toddouska | 0:5045d2638c29 | 326 | case 1: |
toddouska | 0:5045d2638c29 | 327 | XMEMCPY(sha_input, "BB", 2); |
toddouska | 0:5045d2638c29 | 328 | break; |
toddouska | 0:5045d2638c29 | 329 | case 2: |
toddouska | 0:5045d2638c29 | 330 | XMEMCPY(sha_input, "CCC", 3); |
toddouska | 0:5045d2638c29 | 331 | break; |
toddouska | 0:5045d2638c29 | 332 | case 3: |
toddouska | 0:5045d2638c29 | 333 | XMEMCPY(sha_input, "DDDD", 4); |
toddouska | 0:5045d2638c29 | 334 | break; |
toddouska | 0:5045d2638c29 | 335 | case 4: |
toddouska | 0:5045d2638c29 | 336 | XMEMCPY(sha_input, "EEEEE", 5); |
toddouska | 0:5045d2638c29 | 337 | break; |
toddouska | 0:5045d2638c29 | 338 | case 5: |
toddouska | 0:5045d2638c29 | 339 | XMEMCPY(sha_input, "FFFFFF", 6); |
toddouska | 0:5045d2638c29 | 340 | break; |
toddouska | 0:5045d2638c29 | 341 | case 6: |
toddouska | 0:5045d2638c29 | 342 | XMEMCPY(sha_input, "GGGGGGG", 7); |
toddouska | 0:5045d2638c29 | 343 | break; |
toddouska | 0:5045d2638c29 | 344 | default: |
toddouska | 0:5045d2638c29 | 345 | return 0; |
toddouska | 0:5045d2638c29 | 346 | } |
toddouska | 0:5045d2638c29 | 347 | return 1; |
toddouska | 0:5045d2638c29 | 348 | } |
toddouska | 0:5045d2638c29 | 349 | |
toddouska | 0:5045d2638c29 | 350 | |
toddouska | 0:5045d2638c29 | 351 | static int SetKeys(Ciphers* encrypt, Ciphers* decrypt, Keys* keys, |
toddouska | 0:5045d2638c29 | 352 | CipherSpecs* specs, byte side) |
toddouska | 0:5045d2638c29 | 353 | { |
toddouska | 0:5045d2638c29 | 354 | #ifdef BUILD_ARC4 |
toddouska | 0:5045d2638c29 | 355 | word32 sz = specs->key_size; |
toddouska | 0:5045d2638c29 | 356 | if (specs->bulk_cipher_algorithm == rc4) { |
toddouska | 0:5045d2638c29 | 357 | if (side == CLIENT_END) { |
toddouska | 0:5045d2638c29 | 358 | Arc4SetKey(&encrypt->arc4, keys->client_write_key, sz); |
toddouska | 0:5045d2638c29 | 359 | Arc4SetKey(&decrypt->arc4, keys->server_write_key, sz); |
toddouska | 0:5045d2638c29 | 360 | } |
toddouska | 0:5045d2638c29 | 361 | else { |
toddouska | 0:5045d2638c29 | 362 | Arc4SetKey(&encrypt->arc4, keys->server_write_key, sz); |
toddouska | 0:5045d2638c29 | 363 | Arc4SetKey(&decrypt->arc4, keys->client_write_key, sz); |
toddouska | 0:5045d2638c29 | 364 | } |
toddouska | 0:5045d2638c29 | 365 | } |
toddouska | 0:5045d2638c29 | 366 | #endif |
toddouska | 0:5045d2638c29 | 367 | |
toddouska | 0:5045d2638c29 | 368 | #ifdef BUILD_HC128 |
toddouska | 0:5045d2638c29 | 369 | if (specs->bulk_cipher_algorithm == hc128) { |
toddouska | 0:5045d2638c29 | 370 | if (side == CLIENT_END) { |
toddouska | 0:5045d2638c29 | 371 | Hc128_SetKey(&encrypt->hc128, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 372 | keys->client_write_IV); |
toddouska | 0:5045d2638c29 | 373 | Hc128_SetKey(&decrypt->hc128, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 374 | keys->server_write_IV); |
toddouska | 0:5045d2638c29 | 375 | } |
toddouska | 0:5045d2638c29 | 376 | else { |
toddouska | 0:5045d2638c29 | 377 | Hc128_SetKey(&encrypt->hc128, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 378 | keys->server_write_IV); |
toddouska | 0:5045d2638c29 | 379 | Hc128_SetKey(&decrypt->hc128, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 380 | keys->client_write_IV); |
toddouska | 0:5045d2638c29 | 381 | } |
toddouska | 0:5045d2638c29 | 382 | } |
toddouska | 0:5045d2638c29 | 383 | #endif |
toddouska | 0:5045d2638c29 | 384 | |
toddouska | 0:5045d2638c29 | 385 | #ifdef BUILD_RABBIT |
toddouska | 0:5045d2638c29 | 386 | if (specs->bulk_cipher_algorithm == rabbit) { |
toddouska | 0:5045d2638c29 | 387 | if (side == CLIENT_END) { |
toddouska | 0:5045d2638c29 | 388 | RabbitSetKey(&encrypt->rabbit, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 389 | keys->client_write_IV); |
toddouska | 0:5045d2638c29 | 390 | RabbitSetKey(&decrypt->rabbit, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 391 | keys->server_write_IV); |
toddouska | 0:5045d2638c29 | 392 | } |
toddouska | 0:5045d2638c29 | 393 | else { |
toddouska | 0:5045d2638c29 | 394 | RabbitSetKey(&encrypt->rabbit, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 395 | keys->server_write_IV); |
toddouska | 0:5045d2638c29 | 396 | RabbitSetKey(&decrypt->rabbit, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 397 | keys->client_write_IV); |
toddouska | 0:5045d2638c29 | 398 | } |
toddouska | 0:5045d2638c29 | 399 | } |
toddouska | 0:5045d2638c29 | 400 | #endif |
toddouska | 0:5045d2638c29 | 401 | |
toddouska | 0:5045d2638c29 | 402 | #ifdef BUILD_DES3 |
toddouska | 0:5045d2638c29 | 403 | if (specs->bulk_cipher_algorithm == triple_des) { |
toddouska | 0:5045d2638c29 | 404 | if (side == CLIENT_END) { |
toddouska | 0:5045d2638c29 | 405 | Des3_SetKey(&encrypt->des3, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 406 | keys->client_write_IV, DES_ENCRYPTION); |
toddouska | 0:5045d2638c29 | 407 | Des3_SetKey(&decrypt->des3, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 408 | keys->server_write_IV, DES_DECRYPTION); |
toddouska | 0:5045d2638c29 | 409 | } |
toddouska | 0:5045d2638c29 | 410 | else { |
toddouska | 0:5045d2638c29 | 411 | Des3_SetKey(&encrypt->des3, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 412 | keys->server_write_IV, DES_ENCRYPTION); |
toddouska | 0:5045d2638c29 | 413 | Des3_SetKey(&decrypt->des3, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 414 | keys->client_write_IV, DES_DECRYPTION); |
toddouska | 0:5045d2638c29 | 415 | } |
toddouska | 0:5045d2638c29 | 416 | } |
toddouska | 0:5045d2638c29 | 417 | #endif |
toddouska | 0:5045d2638c29 | 418 | |
toddouska | 0:5045d2638c29 | 419 | #ifdef BUILD_AES |
toddouska | 0:5045d2638c29 | 420 | if (specs->bulk_cipher_algorithm == aes) { |
toddouska | 0:5045d2638c29 | 421 | if (side == CLIENT_END) { |
toddouska | 0:5045d2638c29 | 422 | AesSetKey(&encrypt->aes, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 423 | specs->key_size, keys->client_write_IV, |
toddouska | 0:5045d2638c29 | 424 | AES_ENCRYPTION); |
toddouska | 0:5045d2638c29 | 425 | AesSetKey(&decrypt->aes, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 426 | specs->key_size, keys->server_write_IV, |
toddouska | 0:5045d2638c29 | 427 | AES_DECRYPTION); |
toddouska | 0:5045d2638c29 | 428 | } |
toddouska | 0:5045d2638c29 | 429 | else { |
toddouska | 0:5045d2638c29 | 430 | AesSetKey(&encrypt->aes, keys->server_write_key, |
toddouska | 0:5045d2638c29 | 431 | specs->key_size, keys->server_write_IV, |
toddouska | 0:5045d2638c29 | 432 | AES_ENCRYPTION); |
toddouska | 0:5045d2638c29 | 433 | AesSetKey(&decrypt->aes, keys->client_write_key, |
toddouska | 0:5045d2638c29 | 434 | specs->key_size, keys->client_write_IV, |
toddouska | 0:5045d2638c29 | 435 | AES_DECRYPTION); |
toddouska | 0:5045d2638c29 | 436 | } |
toddouska | 0:5045d2638c29 | 437 | } |
toddouska | 0:5045d2638c29 | 438 | #endif |
toddouska | 0:5045d2638c29 | 439 | |
toddouska | 0:5045d2638c29 | 440 | keys->sequence_number = 0; |
toddouska | 0:5045d2638c29 | 441 | keys->peer_sequence_number = 0; |
toddouska | 0:5045d2638c29 | 442 | keys->encryptionOn = 0; |
toddouska | 0:5045d2638c29 | 443 | |
toddouska | 0:5045d2638c29 | 444 | return 0; |
toddouska | 0:5045d2638c29 | 445 | } |
toddouska | 0:5045d2638c29 | 446 | |
toddouska | 0:5045d2638c29 | 447 | |
toddouska | 0:5045d2638c29 | 448 | /* TLS can call too */ |
toddouska | 0:5045d2638c29 | 449 | int StoreKeys(SSL* ssl, const byte* keyData) |
toddouska | 0:5045d2638c29 | 450 | { |
toddouska | 0:5045d2638c29 | 451 | int sz = ssl->specs.hash_size, i; |
toddouska | 0:5045d2638c29 | 452 | |
toddouska | 0:5045d2638c29 | 453 | XMEMCPY(ssl->keys.client_write_MAC_secret, keyData, sz); |
toddouska | 0:5045d2638c29 | 454 | i = sz; |
toddouska | 0:5045d2638c29 | 455 | XMEMCPY(ssl->keys.server_write_MAC_secret,&keyData[i], sz); |
toddouska | 0:5045d2638c29 | 456 | i += sz; |
toddouska | 0:5045d2638c29 | 457 | |
toddouska | 0:5045d2638c29 | 458 | sz = ssl->specs.key_size; |
toddouska | 0:5045d2638c29 | 459 | XMEMCPY(ssl->keys.client_write_key, &keyData[i], sz); |
toddouska | 0:5045d2638c29 | 460 | i += sz; |
toddouska | 0:5045d2638c29 | 461 | XMEMCPY(ssl->keys.server_write_key, &keyData[i], sz); |
toddouska | 0:5045d2638c29 | 462 | i += sz; |
toddouska | 0:5045d2638c29 | 463 | |
toddouska | 0:5045d2638c29 | 464 | sz = ssl->specs.iv_size; |
toddouska | 0:5045d2638c29 | 465 | XMEMCPY(ssl->keys.client_write_IV, &keyData[i], sz); |
toddouska | 0:5045d2638c29 | 466 | i += sz; |
toddouska | 0:5045d2638c29 | 467 | XMEMCPY(ssl->keys.server_write_IV, &keyData[i], sz); |
toddouska | 0:5045d2638c29 | 468 | |
toddouska | 0:5045d2638c29 | 469 | return SetKeys(&ssl->encrypt, &ssl->decrypt, &ssl->keys, &ssl->specs, |
toddouska | 0:5045d2638c29 | 470 | ssl->options.side); |
toddouska | 0:5045d2638c29 | 471 | } |
toddouska | 0:5045d2638c29 | 472 | |
toddouska | 0:5045d2638c29 | 473 | |
toddouska | 0:5045d2638c29 | 474 | int DeriveKeys(SSL* ssl) |
toddouska | 0:5045d2638c29 | 475 | { |
toddouska | 0:5045d2638c29 | 476 | int length = 2 * ssl->specs.hash_size + |
toddouska | 0:5045d2638c29 | 477 | 2 * ssl->specs.key_size + |
toddouska | 0:5045d2638c29 | 478 | 2 * ssl->specs.iv_size; |
toddouska | 0:5045d2638c29 | 479 | int rounds = (length + MD5_DIGEST_SIZE - 1 ) / MD5_DIGEST_SIZE, i; |
toddouska | 0:5045d2638c29 | 480 | |
toddouska | 0:5045d2638c29 | 481 | byte shaOutput[SHA_DIGEST_SIZE]; |
toddouska | 0:5045d2638c29 | 482 | byte md5Input[SECRET_LEN + SHA_DIGEST_SIZE]; |
toddouska | 0:5045d2638c29 | 483 | byte shaInput[KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN]; |
toddouska | 0:5045d2638c29 | 484 | |
toddouska | 0:5045d2638c29 | 485 | Md5 md5; |
toddouska | 0:5045d2638c29 | 486 | Sha sha; |
toddouska | 0:5045d2638c29 | 487 | |
toddouska | 0:5045d2638c29 | 488 | byte keyData[KEY_PREFIX * MD5_DIGEST_SIZE]; /* max size */ |
toddouska | 0:5045d2638c29 | 489 | |
toddouska | 0:5045d2638c29 | 490 | InitMd5(&md5); |
toddouska | 0:5045d2638c29 | 491 | InitSha(&sha); |
toddouska | 0:5045d2638c29 | 492 | |
toddouska | 0:5045d2638c29 | 493 | XMEMCPY(md5Input, ssl->arrays.masterSecret, SECRET_LEN); |
toddouska | 0:5045d2638c29 | 494 | |
toddouska | 0:5045d2638c29 | 495 | for (i = 0; i < rounds; ++i) { |
toddouska | 0:5045d2638c29 | 496 | int j = i + 1; |
toddouska | 0:5045d2638c29 | 497 | int idx = j; |
toddouska | 0:5045d2638c29 | 498 | |
toddouska | 0:5045d2638c29 | 499 | if (!SetPrefix(shaInput, i)) { |
toddouska | 0:5045d2638c29 | 500 | return PREFIX_ERROR; |
toddouska | 0:5045d2638c29 | 501 | } |
toddouska | 0:5045d2638c29 | 502 | |
toddouska | 0:5045d2638c29 | 503 | XMEMCPY(shaInput + idx, ssl->arrays.masterSecret, SECRET_LEN); |
toddouska | 0:5045d2638c29 | 504 | idx += SECRET_LEN; |
toddouska | 0:5045d2638c29 | 505 | XMEMCPY(shaInput + idx, ssl->arrays.serverRandom, RAN_LEN); |
toddouska | 0:5045d2638c29 | 506 | idx += RAN_LEN; |
toddouska | 0:5045d2638c29 | 507 | XMEMCPY(shaInput + idx, ssl->arrays.clientRandom, RAN_LEN); |
toddouska | 0:5045d2638c29 | 508 | idx += RAN_LEN; |
toddouska | 0:5045d2638c29 | 509 | |
toddouska | 0:5045d2638c29 | 510 | ShaUpdate(&sha, shaInput, sizeof(shaInput) - KEY_PREFIX + j); |
toddouska | 0:5045d2638c29 | 511 | ShaFinal(&sha, shaOutput); |
toddouska | 0:5045d2638c29 | 512 | |
toddouska | 0:5045d2638c29 | 513 | XMEMCPY(&md5Input[SECRET_LEN], shaOutput, SHA_DIGEST_SIZE); |
toddouska | 0:5045d2638c29 | 514 | Md5Update(&md5, md5Input, sizeof(md5Input)); |
toddouska | 0:5045d2638c29 | 515 | Md5Final(&md5, keyData + i * MD5_DIGEST_SIZE); |
toddouska | 0:5045d2638c29 | 516 | } |
toddouska | 0:5045d2638c29 | 517 | |
toddouska | 0:5045d2638c29 | 518 | return StoreKeys(ssl, keyData); |
toddouska | 0:5045d2638c29 | 519 | } |
toddouska | 0:5045d2638c29 | 520 | |
toddouska | 0:5045d2638c29 | 521 | |
toddouska | 0:5045d2638c29 | 522 | void CleanPreMaster(SSL* ssl) |
toddouska | 0:5045d2638c29 | 523 | { |
toddouska | 0:5045d2638c29 | 524 | int i, sz = ssl->arrays.preMasterSz; |
toddouska | 0:5045d2638c29 | 525 | |
toddouska | 0:5045d2638c29 | 526 | for (i = 0; i < sz; i++) |
toddouska | 0:5045d2638c29 | 527 | ssl->arrays.preMasterSecret[i] = 0; |
toddouska | 0:5045d2638c29 | 528 | |
toddouska | 0:5045d2638c29 | 529 | RNG_GenerateBlock(&ssl->rng, ssl->arrays.preMasterSecret, sz); |
toddouska | 0:5045d2638c29 | 530 | |
toddouska | 0:5045d2638c29 | 531 | for (i = 0; i < sz; i++) |
toddouska | 0:5045d2638c29 | 532 | ssl->arrays.preMasterSecret[i] = 0; |
toddouska | 0:5045d2638c29 | 533 | |
toddouska | 0:5045d2638c29 | 534 | } |
toddouska | 0:5045d2638c29 | 535 | |
toddouska | 0:5045d2638c29 | 536 | |
toddouska | 0:5045d2638c29 | 537 | /* Create and store the master secret see page 32, 6.1 */ |
toddouska | 0:5045d2638c29 | 538 | int MakeMasterSecret(SSL* ssl) |
toddouska | 0:5045d2638c29 | 539 | { |
toddouska | 0:5045d2638c29 | 540 | byte shaOutput[SHA_DIGEST_SIZE]; |
toddouska | 0:5045d2638c29 | 541 | byte md5Input[ENCRYPT_LEN + SHA_DIGEST_SIZE]; |
toddouska | 0:5045d2638c29 | 542 | byte shaInput[PREFIX + ENCRYPT_LEN + 2 * RAN_LEN]; |
toddouska | 0:5045d2638c29 | 543 | int i; |
toddouska | 0:5045d2638c29 | 544 | word32 idx; |
toddouska | 0:5045d2638c29 | 545 | word32 pmsSz = ssl->arrays.preMasterSz; |
toddouska | 0:5045d2638c29 | 546 | |
toddouska | 0:5045d2638c29 | 547 | Md5 md5; |
toddouska | 0:5045d2638c29 | 548 | Sha sha; |
toddouska | 0:5045d2638c29 | 549 | |
toddouska | 0:5045d2638c29 | 550 | #ifdef SHOW_SECRETS |
toddouska | 0:5045d2638c29 | 551 | { |
toddouska | 0:5045d2638c29 | 552 | int j; |
toddouska | 0:5045d2638c29 | 553 | printf("pre master secret: "); |
toddouska | 0:5045d2638c29 | 554 | for (j = 0; j < pmsSz; j++) |
toddouska | 0:5045d2638c29 | 555 | printf("%02x", ssl->arrays.preMasterSecret[j]); |
toddouska | 0:5045d2638c29 | 556 | printf("\n"); |
toddouska | 0:5045d2638c29 | 557 | } |
toddouska | 0:5045d2638c29 | 558 | #endif |
toddouska | 0:5045d2638c29 | 559 | |
toddouska | 0:5045d2638c29 | 560 | #ifndef NO_TLS |
toddouska | 0:5045d2638c29 | 561 | if (ssl->options.tls) return MakeTlsMasterSecret(ssl); |
toddouska | 0:5045d2638c29 | 562 | #endif |
toddouska | 0:5045d2638c29 | 563 | |
toddouska | 0:5045d2638c29 | 564 | InitMd5(&md5); |
toddouska | 0:5045d2638c29 | 565 | InitSha(&sha); |
toddouska | 0:5045d2638c29 | 566 | |
toddouska | 0:5045d2638c29 | 567 | XMEMCPY(md5Input, ssl->arrays.preMasterSecret, pmsSz); |
toddouska | 0:5045d2638c29 | 568 | |
toddouska | 0:5045d2638c29 | 569 | for (i = 0; i < MASTER_ROUNDS; ++i) { |
toddouska | 0:5045d2638c29 | 570 | byte prefix[PREFIX]; |
toddouska | 0:5045d2638c29 | 571 | if (!SetPrefix(prefix, i)) { |
toddouska | 0:5045d2638c29 | 572 | return PREFIX_ERROR; |
toddouska | 0:5045d2638c29 | 573 | } |
toddouska | 0:5045d2638c29 | 574 | |
toddouska | 0:5045d2638c29 | 575 | idx = 0; |
toddouska | 0:5045d2638c29 | 576 | XMEMCPY(shaInput, prefix, i + 1); |
toddouska | 0:5045d2638c29 | 577 | idx += i + 1; |
toddouska | 0:5045d2638c29 | 578 | |
toddouska | 0:5045d2638c29 | 579 | XMEMCPY(shaInput + idx, ssl->arrays.preMasterSecret, pmsSz); |
toddouska | 0:5045d2638c29 | 580 | idx += pmsSz; |
toddouska | 0:5045d2638c29 | 581 | XMEMCPY(shaInput + idx, ssl->arrays.clientRandom, RAN_LEN); |
toddouska | 0:5045d2638c29 | 582 | idx += RAN_LEN; |
toddouska | 0:5045d2638c29 | 583 | XMEMCPY(shaInput + idx, ssl->arrays.serverRandom, RAN_LEN); |
toddouska | 0:5045d2638c29 | 584 | idx += RAN_LEN; |
toddouska | 0:5045d2638c29 | 585 | ShaUpdate(&sha, shaInput, idx); |
toddouska | 0:5045d2638c29 | 586 | ShaFinal(&sha, shaOutput); |
toddouska | 0:5045d2638c29 | 587 | |
toddouska | 0:5045d2638c29 | 588 | idx = pmsSz; /* preSz */ |
toddouska | 0:5045d2638c29 | 589 | XMEMCPY(md5Input + idx, shaOutput, SHA_DIGEST_SIZE); |
toddouska | 0:5045d2638c29 | 590 | idx += SHA_DIGEST_SIZE; |
toddouska | 0:5045d2638c29 | 591 | Md5Update(&md5, md5Input, idx); |
toddouska | 0:5045d2638c29 | 592 | Md5Final(&md5, &ssl->arrays.masterSecret[i * MD5_DIGEST_SIZE]); |
toddouska | 0:5045d2638c29 | 593 | } |
toddouska | 0:5045d2638c29 | 594 | |
toddouska | 0:5045d2638c29 | 595 | #ifdef SHOW_SECRETS |
toddouska | 0:5045d2638c29 | 596 | { |
toddouska | 0:5045d2638c29 | 597 | int i; |
toddouska | 0:5045d2638c29 | 598 | printf("master secret: "); |
toddouska | 0:5045d2638c29 | 599 | for (i = 0; i < SECRET_LEN; i++) |
toddouska | 0:5045d2638c29 | 600 | printf("%02x", ssl->arrays.masterSecret[i]); |
toddouska | 0:5045d2638c29 | 601 | printf("\n"); |
toddouska | 0:5045d2638c29 | 602 | } |
toddouska | 0:5045d2638c29 | 603 | #endif |
toddouska | 0:5045d2638c29 | 604 | |
toddouska | 0:5045d2638c29 | 605 | DeriveKeys(ssl); |
toddouska | 0:5045d2638c29 | 606 | CleanPreMaster(ssl); |
toddouska | 0:5045d2638c29 | 607 | |
toddouska | 0:5045d2638c29 | 608 | return 0; |
toddouska | 0:5045d2638c29 | 609 | } |
toddouska | 0:5045d2638c29 | 610 | |
toddouska | 0:5045d2638c29 | 611 | |
toddouska | 0:5045d2638c29 | 612 | |
toddouska | 0:5045d2638c29 | 613 |