Botan 1.10.17
prf_ssl3.cpp
Go to the documentation of this file.
1/*
2* SSLv3 PRF
3* (C) 2004-2006 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#include <botan/prf_ssl3.h>
9#include <botan/symkey.h>
10#include <botan/exceptn.h>
11#include <botan/sha160.h>
12#include <botan/md5.h>
13#include <botan/internal/assert.h>
14#include <memory>
15
16namespace Botan {
17
18namespace {
19
20/*
21* Return the next inner hash
22*/
23OctetString next_hash(size_t where, size_t want,
24 HashFunction& md5, HashFunction& sha1,
25 const byte secret[], size_t secret_len,
26 const byte seed[], size_t seed_len)
27 {
28 BOTAN_ASSERT(want <= md5.output_length(), "Desired output too large");
29
30 const byte ASCII_A_CHAR = 0x41;
31
32 for(size_t j = 0; j != where + 1; j++)
33 sha1.update(static_cast<byte>(ASCII_A_CHAR + where));
34 sha1.update(secret, secret_len);
35 sha1.update(seed, seed_len);
36 SecureVector<byte> sha1_hash = sha1.final();
37
38 md5.update(secret, secret_len);
39 md5.update(sha1_hash);
40 SecureVector<byte> md5_hash = md5.final();
41
42 return OctetString(&md5_hash[0], want);
43 }
44
45}
46
47/*
48* SSL3 PRF
49*/
51 const byte secret[], size_t secret_len,
52 const byte seed[], size_t seed_len) const
53 {
54 if(key_len > 416)
55 throw Invalid_Argument("SSL3_PRF: Requested key length is too large");
56
57 MD5 md5;
58 SHA_160 sha1;
59
60 OctetString output;
61
62 int counter = 0;
63 while(key_len)
64 {
65 const size_t produce = std::min<size_t>(key_len, md5.output_length());
66
67 output = output + next_hash(counter++, produce, md5, sha1,
68 secret, secret_len, seed, seed_len);
69
70 key_len -= produce;
71 }
72
73 return output.bits_of();
74 }
75
76}
#define BOTAN_ASSERT(expr, msg)
Definition assert.h:19
size_t output_length() const
Definition md5.h:22
OctetString(class RandomNumberGenerator &rng, size_t len)
Definition symkey.cpp:20
SecureVector< byte > bits_of() const
Definition symkey.h:30
SecureVector< byte > derive(size_t, const byte[], size_t, const byte[], size_t) const
Definition prf_ssl3.cpp:50
std::invalid_argument Invalid_Argument
Definition exceptn.h:20