Create and store the master secret see page 32, 6.1
| 975 | |
| 976 | // Create and store the master secret see page 32, 6.1 |
| 977 | void SSL::makeMasterSecret() |
| 978 | { |
| 979 | if (isTLS()) |
| 980 | makeTLSMasterSecret(); |
| 981 | else { |
| 982 | opaque sha_output[SHA_LEN]; |
| 983 | |
| 984 | const uint& preSz = secure_.get_connection().pre_secret_len_; |
| 985 | output_buffer md5_input(preSz + SHA_LEN); |
| 986 | output_buffer sha_input(PREFIX + preSz + 2 * RAN_LEN); |
| 987 | |
| 988 | MD5 md5; |
| 989 | SHA sha; |
| 990 | |
| 991 | md5_input.write(secure_.get_connection().pre_master_secret_, preSz); |
| 992 | |
| 993 | for (int i = 0; i < MASTER_ROUNDS; ++i) { |
| 994 | opaque prefix[PREFIX]; |
| 995 | if (!setPrefix(prefix, i)) { |
| 996 | SetError(prefix_error); |
| 997 | return; |
| 998 | } |
| 999 | |
| 1000 | sha_input.set_current(0); |
| 1001 | sha_input.write(prefix, i + 1); |
| 1002 | |
| 1003 | sha_input.write(secure_.get_connection().pre_master_secret_,preSz); |
| 1004 | sha_input.write(secure_.get_connection().client_random_, RAN_LEN); |
| 1005 | sha_input.write(secure_.get_connection().server_random_, RAN_LEN); |
| 1006 | sha.get_digest(sha_output, sha_input.get_buffer(), |
| 1007 | sha_input.get_size()); |
| 1008 | |
| 1009 | md5_input.set_current(preSz); |
| 1010 | md5_input.write(sha_output, SHA_LEN); |
| 1011 | md5.get_digest(&secure_.use_connection().master_secret_[i*MD5_LEN], |
| 1012 | md5_input.get_buffer(), md5_input.get_size()); |
| 1013 | } |
| 1014 | deriveKeys(); |
| 1015 | } |
| 1016 | secure_.use_connection().CleanPreMaster(); |
| 1017 | } |
| 1018 | |
| 1019 | |
| 1020 | // create TLSv1 master secret |
no test coverage detected