172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/secure_hash.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/third_party/nss/blapi.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/third_party/nss/sha256.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace crypto {
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass SecureHashSHA256NSS : public SecureHash {
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SecureHashSHA256NSS() {
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SHA256_Begin(&ctx_);
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SecureHashSHA256NSS() {
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Update(const void* input, size_t len) {
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SHA256_Update(&ctx_, static_cast<const unsigned char*>(input), len);
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Finish(void* output, size_t len) {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SHA256_End(&ctx_, static_cast<unsigned char*>(output), NULL,
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               static_cast<unsigned int>(len));
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SHA256Context ctx_;
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSecureHash* SecureHash::Create(Algorithm algorithm) {
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (algorithm) {
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case SHA256:
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return new SecureHashSHA256NSS();
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default:
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NOTIMPLEMENTED();
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return NULL;
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace crypto
50