// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_GCM_DRIVER_CRYPTO_ENCRYPTION_HEADER_PARSERS_H_
#define COMPONENTS_GCM_DRIVER_CRYPTO_ENCRYPTION_HEADER_PARSERS_H_

#include <stdint.h>
#include <string>
#include <vector>

#include "base/strings/string_piece.h"
#include "net/http/http_util.h"

namespace gcm {

// Iterates over a header that follows the syntax of the Encryption HTTP header
// per the Encrypted Content-Encoding for HTTP draft. This header follows the
// #list syntax from the extended ABNF syntax defined in section 1.2 of RFC7230.
//
// https://tools.ietf.org/html/draft-thomson-http-encryption#section-3
// https://tools.ietf.org/html/rfc7230#section-1.2
class EncryptionHeaderIterator {
 public:
  EncryptionHeaderIterator(std::string::const_iterator header_begin,
                           std::string::const_iterator header_end);
  ~EncryptionHeaderIterator();

  // Advances the iterator to the next header value, if any. Returns true if
  // there is a next value. Use the keyid(), salt() and rs() methods to access
  // the key-value pairs included in the header value.
  bool GetNext();

  const std::string& keyid() const {
    return keyid_;
  }

  const std::string& salt() const {
    return salt_;
  }

  uint64_t rs() const {
    return rs_;
  }

 private:
  net::HttpUtil::ValuesIterator iterator_;

  std::string keyid_;
  std::string salt_;
  uint64_t rs_;
};

// Iterates over a header that follows the syntax of the Crypto-Key HTTP header
// per the Encrypted Content-Encoding for HTTP draft. This header follows the
// #list syntax from the extended ABNF syntax defined in section 1.2 of RFC7230.
//
// https://tools.ietf.org/html/draft-thomson-http-encryption#section-4
// https://tools.ietf.org/html/rfc7230#section-1.2
class CryptoKeyHeaderIterator {
 public:
  CryptoKeyHeaderIterator(std::string::const_iterator header_begin,
                          std::string::const_iterator header_end);
  ~CryptoKeyHeaderIterator();

  // Advances the iterator to the next header value, if any. Returns true if
  // there is a next value. Use the keyid(), aesgcm128() and dh() methods to
  // access the key-value pairs included in the header value.
  bool GetNext();

  const std::string& keyid() const {
    return keyid_;
  }

  const std::string& aesgcm128() const {
    return aesgcm128_;
  }

  const std::string& dh() const {
    return dh_;
  }

 private:
  net::HttpUtil::ValuesIterator iterator_;

  std::string keyid_;
  std::string aesgcm128_;
  std::string dh_;
};

}  // namespace gcm

#endif  // COMPONENTS_GCM_DRIVER_CRYPTO_ENCRYPTION_HEADER_PARSERS_H_
