/* -*- 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 http://mozilla.org/MPL/2.0/. */

#include "secder.h"
#include "secerr.h"

#include <climits>
#include <memory>

#include "gtest/gtest.h"

namespace nss_test {

class DERIntegerDecodingTest : public ::testing::Test {
 public:
  void TestGetInteger(long number, unsigned char *der_number,
                      unsigned int len) {
    SECItem input = {siBuffer, der_number, len};
    EXPECT_EQ(number, DER_GetInteger(&input));
  }

  void GetDerLongMax(unsigned char *der_number, unsigned int len) {
    der_number[0] = 0x7F;
    for (unsigned int i = 1; i < len; ++i) {
      der_number[i] = 0xFF;
    }
  }

  void GetDerLongMin(unsigned char *der_number, unsigned int len) {
    der_number[0] = 0x80;
    for (unsigned int i = 1; i < len; ++i) {
      der_number[i] = 0x00;
    }
  }
};

TEST_F(DERIntegerDecodingTest, DecodeLongMinus126) {
  unsigned char der[] = {0x82};
  TestGetInteger(-126, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLong130) {
  unsigned char der[] = {0x00, 0x82};
  TestGetInteger(130, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLong130Padded) {
  unsigned char der[sizeof(long) * 2] = {0};
  der[sizeof(der) - 1] = {0x82};
  TestGetInteger(130, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLong0) {
  unsigned char der[] = {0x00};
  TestGetInteger(0, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLong1) {
  unsigned char der[] = {0x01};
  TestGetInteger(1, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMinus1) {
  unsigned char der[] = {0xFF};
  TestGetInteger(-1, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMinus1Padded) {
  unsigned char der[sizeof(long) * 2];
  memset(der, 0xFF, sizeof(der));
  TestGetInteger(-1, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMax) {
  unsigned char der[sizeof(long)];
  GetDerLongMax(der, sizeof(long));
  TestGetInteger(LONG_MAX, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMin) {
  unsigned char der[sizeof(long)];
  GetDerLongMin(der, sizeof(long));
  TestGetInteger(LONG_MIN, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMaxMinus1) {
  unsigned char der[sizeof(long)];
  GetDerLongMax(der, sizeof(long));
  der[sizeof(long) - 1] = 0xFE;
  TestGetInteger(LONG_MAX - 1, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMinPlus1) {
  unsigned char der[sizeof(long)];
  GetDerLongMin(der, sizeof(long));
  der[sizeof(long) - 1] = 0x01;
  TestGetInteger(LONG_MIN + 1, der, sizeof(der));
}

TEST_F(DERIntegerDecodingTest, DecodeLongMinMinus1) {
  unsigned char der[sizeof(long) + 1];
  GetDerLongMax(der, sizeof(long) + 1);
  der[0] = 0xFF;
  der[1] = 0x7F;
  TestGetInteger(LONG_MIN, der, sizeof(der));
  EXPECT_EQ(SEC_ERROR_BAD_DER, PORT_GetError());
}

TEST_F(DERIntegerDecodingTest, DecodeLongMaxPlus1) {
  unsigned char der[sizeof(long) + 1];
  GetDerLongMin(der, sizeof(long) + 1);
  der[0] = 0x00;
  der[1] = 0x80;
  TestGetInteger(LONG_MAX, der, sizeof(der));
  EXPECT_EQ(SEC_ERROR_BAD_DER, PORT_GetError());
}

}  // namespace nss_test
