// Copyright 2026 Google LLC
//
// 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
//
//    https://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.
//

#include "salt/random_salt_generator.h"

#include <cstdint>
#include <string>

#include "absl/base/no_destructor.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "openssl/rand.h"
#include "salt/salt_generator.h"

namespace credentio {

const RandomSaltGenerator& RandomSaltGenerator::Default() {
  static const absl::NoDestructor<RandomSaltGenerator> kDefaultSaltGenerator;
  return *kDefaultSaltGenerator;
}

absl::StatusOr<std::string> RandomSaltGenerator::Generate() const {
  std::string salt(kDefaultSaltLength, '\0');
  if (RAND_bytes(reinterpret_cast<uint8_t*>(salt.data()), salt.size()) != 1) {
    return absl::InternalError("Failed to generate random salt.");
  }
  return salt;
}

}  // namespace credentio
