1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_OPENSSLDIGEST_H_
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_OPENSSLDIGEST_H_
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <openssl/evp.h>
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/messagedigest.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// An implementation of the digest class that uses OpenSSL.
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass OpenSSLDigest : public MessageDigest {
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Creates an OpenSSLDigest with |algorithm| as the hash algorithm.
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  explicit OpenSSLDigest(const std::string& algorithm);
2567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  ~OpenSSLDigest() override;
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Returns the digest output size (e.g. 16 bytes for MD5).
2767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  size_t Size() const override;
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Updates the digest with |len| bytes from |buf|.
2967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  void Update(const void* buf, size_t len) override;
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Outputs the digest value to |buf| with length |len|.
3167186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  size_t Finish(void* buf, size_t len) override;
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Helper function to look up a digest's EVP by name.
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static bool GetDigestEVP(const std::string &algorithm,
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           const EVP_MD** md);
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Helper function to look up a digest's name by EVP.
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static bool GetDigestName(const EVP_MD* md,
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            std::string* algorithm);
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Helper function to get the length of a digest.
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static bool GetDigestSize(const std::string &algorithm,
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                            size_t* len);
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EVP_MD_CTX ctx_;
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  const EVP_MD* md_;
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // WEBRTC_BASE_OPENSSLDIGEST_H_
51