der_getint_unittest.cc (3361B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "secder.h" 8 #include "secerr.h" 9 10 #include <climits> 11 #include <memory> 12 13 #include "gtest/gtest.h" 14 15 namespace nss_test { 16 17 class DERIntegerDecodingTest : public ::testing::Test { 18 public: 19 void TestGetInteger(long number, unsigned char *der_number, 20 unsigned int len) { 21 SECItem input = {siBuffer, der_number, len}; 22 EXPECT_EQ(number, DER_GetInteger(&input)); 23 } 24 25 void GetDerLongMax(unsigned char *der_number, unsigned int len) { 26 der_number[0] = 0x7F; 27 for (unsigned int i = 1; i < len; ++i) { 28 der_number[i] = 0xFF; 29 } 30 } 31 32 void GetDerLongMin(unsigned char *der_number, unsigned int len) { 33 der_number[0] = 0x80; 34 for (unsigned int i = 1; i < len; ++i) { 35 der_number[i] = 0x00; 36 } 37 } 38 }; 39 40 TEST_F(DERIntegerDecodingTest, DecodeLongMinus126) { 41 unsigned char der[] = {0x82}; 42 TestGetInteger(-126, der, sizeof(der)); 43 } 44 45 TEST_F(DERIntegerDecodingTest, DecodeLong130) { 46 unsigned char der[] = {0x00, 0x82}; 47 TestGetInteger(130, der, sizeof(der)); 48 } 49 50 TEST_F(DERIntegerDecodingTest, DecodeLong130Padded) { 51 unsigned char der[sizeof(long) * 2] = {0}; 52 der[sizeof(der) - 1] = {0x82}; 53 TestGetInteger(130, der, sizeof(der)); 54 } 55 56 TEST_F(DERIntegerDecodingTest, DecodeLong0) { 57 unsigned char der[] = {0x00}; 58 TestGetInteger(0, der, sizeof(der)); 59 } 60 61 TEST_F(DERIntegerDecodingTest, DecodeLong1) { 62 unsigned char der[] = {0x01}; 63 TestGetInteger(1, der, sizeof(der)); 64 } 65 66 TEST_F(DERIntegerDecodingTest, DecodeLongMinus1) { 67 unsigned char der[] = {0xFF}; 68 TestGetInteger(-1, der, sizeof(der)); 69 } 70 71 TEST_F(DERIntegerDecodingTest, DecodeLongMinus1Padded) { 72 unsigned char der[sizeof(long) * 2]; 73 memset(der, 0xFF, sizeof(der)); 74 TestGetInteger(-1, der, sizeof(der)); 75 } 76 77 TEST_F(DERIntegerDecodingTest, DecodeLongMax) { 78 unsigned char der[sizeof(long)]; 79 GetDerLongMax(der, sizeof(long)); 80 TestGetInteger(LONG_MAX, der, sizeof(der)); 81 } 82 83 TEST_F(DERIntegerDecodingTest, DecodeLongMin) { 84 unsigned char der[sizeof(long)]; 85 GetDerLongMin(der, sizeof(long)); 86 TestGetInteger(LONG_MIN, der, sizeof(der)); 87 } 88 89 TEST_F(DERIntegerDecodingTest, DecodeLongMaxMinus1) { 90 unsigned char der[sizeof(long)]; 91 GetDerLongMax(der, sizeof(long)); 92 der[sizeof(long) - 1] = 0xFE; 93 TestGetInteger(LONG_MAX - 1, der, sizeof(der)); 94 } 95 96 TEST_F(DERIntegerDecodingTest, DecodeLongMinPlus1) { 97 unsigned char der[sizeof(long)]; 98 GetDerLongMin(der, sizeof(long)); 99 der[sizeof(long) - 1] = 0x01; 100 TestGetInteger(LONG_MIN + 1, der, sizeof(der)); 101 } 102 103 TEST_F(DERIntegerDecodingTest, DecodeLongMinMinus1) { 104 unsigned char der[sizeof(long) + 1]; 105 GetDerLongMax(der, sizeof(long) + 1); 106 der[0] = 0xFF; 107 der[1] = 0x7F; 108 TestGetInteger(LONG_MIN, der, sizeof(der)); 109 EXPECT_EQ(SEC_ERROR_BAD_DER, PORT_GetError()); 110 } 111 112 TEST_F(DERIntegerDecodingTest, DecodeLongMaxPlus1) { 113 unsigned char der[sizeof(long) + 1]; 114 GetDerLongMin(der, sizeof(long) + 1); 115 der[0] = 0x00; 116 der[1] = 0x80; 117 TestGetInteger(LONG_MAX, der, sizeof(der)); 118 EXPECT_EQ(SEC_ERROR_BAD_DER, PORT_GetError()); 119 } 120 121 } // namespace nss_test