encode_values.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/der/encode_values.h"
  5. #include "base/time/time.h"
  6. #include "net/der/parse_values.h"
  7. namespace net::der {
  8. namespace {
  9. bool WriteFourDigit(uint16_t value, uint8_t out[4]) {
  10. if (value >= 10000)
  11. return false;
  12. out[3] = '0' + (value % 10);
  13. value /= 10;
  14. out[2] = '0' + (value % 10);
  15. value /= 10;
  16. out[1] = '0' + (value % 10);
  17. value /= 10;
  18. out[0] = '0' + value;
  19. return true;
  20. }
  21. bool WriteTwoDigit(uint8_t value, uint8_t out[2]) {
  22. if (value >= 100)
  23. return false;
  24. out[0] = '0' + (value / 10);
  25. out[1] = '0' + (value % 10);
  26. return true;
  27. }
  28. } // namespace
  29. bool EncodeTimeAsGeneralizedTime(const base::Time& time,
  30. GeneralizedTime* generalized_time) {
  31. base::Time::Exploded exploded;
  32. time.UTCExplode(&exploded);
  33. if (!exploded.HasValidValues())
  34. return false;
  35. generalized_time->year = exploded.year;
  36. generalized_time->month = exploded.month;
  37. generalized_time->day = exploded.day_of_month;
  38. generalized_time->hours = exploded.hour;
  39. generalized_time->minutes = exploded.minute;
  40. generalized_time->seconds = exploded.second;
  41. return true;
  42. }
  43. bool GeneralizedTimeToTime(const der::GeneralizedTime& generalized,
  44. base::Time* result) {
  45. base::Time::Exploded exploded = {0};
  46. exploded.year = generalized.year;
  47. exploded.month = generalized.month;
  48. exploded.day_of_month = generalized.day;
  49. exploded.hour = generalized.hours;
  50. exploded.minute = generalized.minutes;
  51. exploded.second = generalized.seconds;
  52. if (base::Time::FromUTCExploded(exploded, result))
  53. return true;
  54. // Fail on obviously bad dates.
  55. if (!exploded.HasValidValues())
  56. return false;
  57. // TODO(mattm): consider consolidating this with
  58. // SaturatedTimeFromUTCExploded from cookie_util.cc
  59. if (static_cast<int>(generalized.year) > base::Time::kExplodedMaxYear) {
  60. *result = base::Time::Max();
  61. return true;
  62. }
  63. if (static_cast<int>(generalized.year) < base::Time::kExplodedMinYear) {
  64. *result = base::Time::Min();
  65. return true;
  66. }
  67. return false;
  68. }
  69. bool EncodeGeneralizedTime(const GeneralizedTime& time,
  70. uint8_t out[kGeneralizedTimeLength]) {
  71. if (!WriteFourDigit(time.year, out) || !WriteTwoDigit(time.month, out + 4) ||
  72. !WriteTwoDigit(time.day, out + 6) ||
  73. !WriteTwoDigit(time.hours, out + 8) ||
  74. !WriteTwoDigit(time.minutes, out + 10) ||
  75. !WriteTwoDigit(time.seconds, out + 12)) {
  76. return false;
  77. }
  78. out[14] = 'Z';
  79. return true;
  80. }
  81. bool EncodeUTCTime(const GeneralizedTime& time, uint8_t out[kUTCTimeLength]) {
  82. if (!time.InUTCTimeRange())
  83. return false;
  84. uint16_t year = time.year - 1900;
  85. if (year >= 100)
  86. year -= 100;
  87. if (!WriteTwoDigit(year, out) || !WriteTwoDigit(time.month, out + 2) ||
  88. !WriteTwoDigit(time.day, out + 4) ||
  89. !WriteTwoDigit(time.hours, out + 6) ||
  90. !WriteTwoDigit(time.minutes, out + 8) ||
  91. !WriteTwoDigit(time.seconds, out + 10)) {
  92. return false;
  93. }
  94. out[12] = 'Z';
  95. return true;
  96. }
  97. } // namespace net::der