tls_parser.cc 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. #include "tls_parser.h"
  7. namespace nss_test {
  8. bool TlsParser::Read(uint8_t* val) {
  9. if (remaining() < 1) {
  10. return false;
  11. }
  12. *val = *ptr();
  13. consume(1);
  14. return true;
  15. }
  16. bool TlsParser::Read(uint32_t* val, size_t size) {
  17. if (size > sizeof(uint32_t)) {
  18. return false;
  19. }
  20. uint32_t v = 0;
  21. for (size_t i = 0; i < size; ++i) {
  22. uint8_t tmp;
  23. if (!Read(&tmp)) {
  24. return false;
  25. }
  26. v = (v << 8) | tmp;
  27. }
  28. *val = v;
  29. return true;
  30. }
  31. bool TlsParser::Read(DataBuffer* val, size_t len) {
  32. if (remaining() < len) {
  33. return false;
  34. }
  35. val->Assign(ptr(), len);
  36. consume(len);
  37. return true;
  38. }
  39. bool TlsParser::ReadFromMark(DataBuffer* val, size_t len, size_t mark) {
  40. auto saved = offset_;
  41. offset_ = mark;
  42. if (remaining() < len) {
  43. offset_ = saved;
  44. return false;
  45. }
  46. val->Assign(ptr(), len);
  47. offset_ = saved;
  48. return true;
  49. }
  50. bool TlsParser::ReadVariable(DataBuffer* val, size_t len_size) {
  51. uint32_t len;
  52. if (!Read(&len, len_size)) {
  53. return false;
  54. }
  55. return Read(val, len);
  56. }
  57. bool TlsParser::Skip(size_t len) {
  58. if (len > remaining()) {
  59. return false;
  60. }
  61. consume(len);
  62. return true;
  63. }
  64. bool TlsParser::SkipVariable(size_t len_size) {
  65. uint32_t len;
  66. if (!Read(&len, len_size)) {
  67. return false;
  68. }
  69. return Skip(len);
  70. }
  71. } // namespace nss_test