author tbirdbld
Fri, 13 Feb 2015 17:51:11 -0500
changeset 243774 fa98dcdc9406fa36b418b7dc97ebb6a8b7d50ef2
parent 210716 12ac0e627154b65954fd0c5cd49ddd227dd4efcd
child 244593 7fde5994aee5d053baee4bc9142a8ea79a567fcc
permissions -rw-r--r--
Added THUNDERBIRD_36_0b1_RELEASE THUNDERBIRD_36_0b1_BUILD2 tag(s) for changeset bbb250fc79b7. DONTBUILD CLOSED TREE a=release

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at */
#ifndef dtls_identity_h__
#define dtls_identity_h__

#include <string>

#include "m_cpp_utils.h"
#include "mozilla/RefPtr.h"
#include "nsISupportsImpl.h"
#include "ScopedNSSTypes.h"

// All code in this module requires NSS to be live.
// Callers must initialize NSS and implement the nsNSSShutdownObject
// protocol.
namespace mozilla {

class DtlsIdentity {

  // Generate an identity with a random name.
  static TemporaryRef<DtlsIdentity> Generate();

  // Note: the following two functions just provide access. They
  // do not transfer ownership. If you want a pointer that lasts
  // past the lifetime of the DtlsIdentity, you must make
  // a copy yourself.
  CERTCertificate *cert() { return cert_; }
  SECKEYPrivateKey *privkey() { return privkey_; }

  std::string GetFormattedFingerprint(const std::string &algorithm = DEFAULT_HASH_ALGORITHM);

  nsresult ComputeFingerprint(const std::string algorithm,
                              unsigned char *digest,
                              std::size_t size,
                              std::size_t *digest_length);

  static nsresult ComputeFingerprint(const CERTCertificate *cert,
                                     const std::string algorithm,
                                     unsigned char *digest,
                                     std::size_t size,
                                     std::size_t *digest_length);

  static nsresult ParseFingerprint(const std::string fp,
                                   unsigned char *digest,
                                   size_t size, size_t *length);


  DtlsIdentity(SECKEYPrivateKey *privkey, CERTCertificate *cert)
      : privkey_(privkey), cert_(cert) {}

  static const std::string DEFAULT_HASH_ALGORITHM;
  static const size_t HASH_ALGORITHM_MAX_LENGTH;

  std::string FormatFingerprint(const unsigned char *digest,
                                std::size_t size);

  ScopedSECKEYPrivateKey privkey_;
  CERTCertificate *cert_;  // TODO: Using a smart pointer here causes link
                           // errors.
}  // close namespace