// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_BROWSER_DEVICE_AUTHENTICATION_H_
#define COBALT_BROWSER_DEVICE_AUTHENTICATION_H_

#include <string>

#include "starboard/configuration.h"
#include "starboard/types.h"

namespace cobalt {
namespace browser {

#if SB_API_VERSION >= 11

// Returns a base64 encoded SHA256 hash representing the device authentication
// signature based on the device certification scope and the current time.
std::string GetDeviceAuthenticationSignedURLQueryString();

// The following methods are deterministic helper functions used in the
// implementation of the public method above.  They are declared here so that
// they can be tested in (white box) unit tests.

// Similar to the method above, but all platform queries are resolved to make
// this a deterministic and testable function.
std::string GetDeviceAuthenticationSignedURLQueryStringFromComponents(
    const std::string& cert_scope, const std::string& start_time,
    const std::string& base64_signature);

// Given the certification parameters, computes a message to be used as input
// to the signing process.
std::string ComputeMessage(const std::string& cert_scope,
                           const std::string& start_time);

// Given a message (arbitrary sequence of bytes) and a base64-encoded key
// key, compute the HMAC-SHA256 signature and store it in the |signature_hash|
// out parameter.  Note that 32 bytes will be written to the output hash, it is
// an error if |signature_hash_size_in_bytes| is less than 32.
void ComputeHMACSHA256SignatureWithProvidedKey(
    const std::string& message, const std::string& base64_key,
    uint8_t* signature_hash, size_t signature_hash_size_in_bytes);

#endif  // SB_API_VERSION >= 11

}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_DEVICE_AUTHENTICATION_H_
