You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

505 lines
22 KiB

  1. /* Copyright (c) 2016, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <functional>
  15. #include <string>
  16. #include <vector>
  17. #include <assert.h>
  18. #include <openssl/bytestring.h>
  19. #include <openssl/err.h>
  20. #include <openssl/evp.h>
  21. #include <openssl/rsa.h>
  22. #include <openssl/ssl.h>
  23. #include <openssl/stack.h>
  24. #include <openssl/x509.h>
  25. #include "../crypto/internal.h"
  26. static const uint8_t kCertificateDER[] = {
  27. 0x30, 0x82, 0x02, 0xff, 0x30, 0x82, 0x01, 0xe7, 0xa0, 0x03, 0x02, 0x01,
  28. 0x02, 0x02, 0x11, 0x00, 0xb1, 0x84, 0xee, 0x34, 0x99, 0x98, 0x76, 0xfb,
  29. 0x6f, 0xb2, 0x15, 0xc8, 0x47, 0x79, 0x05, 0x9b, 0x30, 0x0d, 0x06, 0x09,
  30. 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
  31. 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07,
  32. 0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30, 0x1e, 0x17, 0x0d, 0x31,
  33. 0x35, 0x31, 0x31, 0x30, 0x37, 0x30, 0x30, 0x32, 0x34, 0x35, 0x36, 0x5a,
  34. 0x17, 0x0d, 0x31, 0x36, 0x31, 0x31, 0x30, 0x36, 0x30, 0x30, 0x32, 0x34,
  35. 0x35, 0x36, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
  36. 0x04, 0x0a, 0x13, 0x07, 0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30,
  37. 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
  38. 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
  39. 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xce, 0x47, 0xcb, 0x11,
  40. 0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14, 0xaf, 0xc7, 0xea, 0xb6,
  41. 0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc, 0xfc, 0x59, 0x42, 0xb9,
  42. 0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe, 0xac, 0x03, 0x9e, 0x71,
  43. 0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac, 0x65, 0xf6, 0x03, 0xc8,
  44. 0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41, 0x92, 0x74, 0xa6, 0x57,
  45. 0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e, 0x63, 0x88, 0x22, 0xe3,
  46. 0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0, 0x4c, 0xf2, 0x3c, 0x20,
  47. 0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5, 0xc9, 0x48, 0xa0, 0xca,
  48. 0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1, 0xe3, 0x43, 0xc1, 0x2a,
  49. 0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23, 0x74, 0xa7, 0x37, 0xb0,
  50. 0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8, 0xf6, 0xdb, 0x86, 0x40,
  51. 0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15, 0x2a, 0x23, 0xca, 0xea,
  52. 0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a, 0x49, 0x49, 0x0e, 0xe7,
  53. 0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21, 0x0c, 0x26, 0x2b, 0x5d,
  54. 0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c, 0xf3, 0x3b, 0xf3, 0x09,
  55. 0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46, 0x8f, 0x76, 0x50, 0xbf,
  56. 0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1, 0x77, 0xd0, 0xfb, 0xa9,
  57. 0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41, 0x67, 0x01, 0xbe, 0x33,
  58. 0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde, 0x5d, 0xc1, 0xe8, 0xbb,
  59. 0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7, 0x18, 0xab, 0x0f, 0x94,
  60. 0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7, 0x05, 0x47, 0x10, 0x41,
  61. 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x0e, 0x06,
  62. 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x05,
  63. 0xa0, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a,
  64. 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x0c,
  65. 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00,
  66. 0x30, 0x19, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x12, 0x30, 0x10, 0x82,
  67. 0x0e, 0x66, 0x75, 0x7a, 0x7a, 0x2e, 0x62, 0x6f, 0x72, 0x69, 0x6e, 0x67,
  68. 0x73, 0x73, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
  69. 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x92,
  70. 0xde, 0xef, 0x96, 0x06, 0x7b, 0xff, 0x71, 0x7d, 0x4e, 0xa0, 0x7d, 0xae,
  71. 0xb8, 0x22, 0xb4, 0x2c, 0xf7, 0x96, 0x9c, 0x37, 0x1d, 0x8f, 0xe7, 0xd9,
  72. 0x47, 0xff, 0x3f, 0xe9, 0x35, 0x95, 0x0e, 0xdd, 0xdc, 0x7f, 0xc8, 0x8a,
  73. 0x1e, 0x36, 0x1d, 0x38, 0x47, 0xfc, 0x76, 0xd2, 0x1f, 0x98, 0xa1, 0x36,
  74. 0xac, 0xc8, 0x70, 0x38, 0x0a, 0x3d, 0x51, 0x8d, 0x0f, 0x03, 0x1b, 0xef,
  75. 0x62, 0xa1, 0xcb, 0x2b, 0x4a, 0x8c, 0x12, 0x2b, 0x54, 0x50, 0x9a, 0x6b,
  76. 0xfe, 0xaf, 0xd9, 0xf6, 0xbf, 0x58, 0x11, 0x58, 0x5e, 0xe5, 0x86, 0x1e,
  77. 0x3b, 0x6b, 0x30, 0x7e, 0x72, 0x89, 0xe8, 0x6b, 0x7b, 0xb7, 0xaf, 0xef,
  78. 0x8b, 0xa9, 0x3e, 0xb0, 0xcd, 0x0b, 0xef, 0xb0, 0x0c, 0x96, 0x2b, 0xc5,
  79. 0x3b, 0xd5, 0xf1, 0xc2, 0xae, 0x3a, 0x60, 0xd9, 0x0f, 0x75, 0x37, 0x55,
  80. 0x4d, 0x62, 0xd2, 0xed, 0x96, 0xac, 0x30, 0x6b, 0xda, 0xa1, 0x48, 0x17,
  81. 0x96, 0x23, 0x85, 0x9a, 0x57, 0x77, 0xe9, 0x22, 0xa2, 0x37, 0x03, 0xba,
  82. 0x49, 0x77, 0x40, 0x3b, 0x76, 0x4b, 0xda, 0xc1, 0x04, 0x57, 0x55, 0x34,
  83. 0x22, 0x83, 0x45, 0x29, 0xab, 0x2e, 0x11, 0xff, 0x0d, 0xab, 0x55, 0xb1,
  84. 0xa7, 0x58, 0x59, 0x05, 0x25, 0xf9, 0x1e, 0x3d, 0xb7, 0xac, 0x04, 0x39,
  85. 0x2c, 0xf9, 0xaf, 0xb8, 0x68, 0xfb, 0x8e, 0x35, 0x71, 0x32, 0xff, 0x70,
  86. 0xe9, 0x46, 0x6d, 0x5c, 0x06, 0x90, 0x88, 0x23, 0x48, 0x0c, 0x50, 0xeb,
  87. 0x0a, 0xa9, 0xae, 0xe8, 0xfc, 0xbe, 0xa5, 0x76, 0x94, 0xd7, 0x64, 0x22,
  88. 0x38, 0x98, 0x17, 0xa4, 0x3a, 0xa7, 0x59, 0x9f, 0x1d, 0x3b, 0x75, 0x90,
  89. 0x1a, 0x81, 0xef, 0x19, 0xfb, 0x2b, 0xb7, 0xa7, 0x64, 0x61, 0x22, 0xa4,
  90. 0x6f, 0x7b, 0xfa, 0x58, 0xbb, 0x8c, 0x4e, 0x77, 0x67, 0xd0, 0x5d, 0x58,
  91. 0x76, 0x8a, 0xbb,
  92. };
  93. static const uint8_t kRSAPrivateKeyDER[] = {
  94. 0x30, 0x82, 0x04, 0xa5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
  95. 0xce, 0x47, 0xcb, 0x11, 0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14,
  96. 0xaf, 0xc7, 0xea, 0xb6, 0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc,
  97. 0xfc, 0x59, 0x42, 0xb9, 0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe,
  98. 0xac, 0x03, 0x9e, 0x71, 0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac,
  99. 0x65, 0xf6, 0x03, 0xc8, 0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41,
  100. 0x92, 0x74, 0xa6, 0x57, 0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e,
  101. 0x63, 0x88, 0x22, 0xe3, 0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0,
  102. 0x4c, 0xf2, 0x3c, 0x20, 0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5,
  103. 0xc9, 0x48, 0xa0, 0xca, 0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1,
  104. 0xe3, 0x43, 0xc1, 0x2a, 0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23,
  105. 0x74, 0xa7, 0x37, 0xb0, 0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8,
  106. 0xf6, 0xdb, 0x86, 0x40, 0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15,
  107. 0x2a, 0x23, 0xca, 0xea, 0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a,
  108. 0x49, 0x49, 0x0e, 0xe7, 0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21,
  109. 0x0c, 0x26, 0x2b, 0x5d, 0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c,
  110. 0xf3, 0x3b, 0xf3, 0x09, 0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46,
  111. 0x8f, 0x76, 0x50, 0xbf, 0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1,
  112. 0x77, 0xd0, 0xfb, 0xa9, 0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41,
  113. 0x67, 0x01, 0xbe, 0x33, 0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde,
  114. 0x5d, 0xc1, 0xe8, 0xbb, 0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7,
  115. 0x18, 0xab, 0x0f, 0x94, 0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7,
  116. 0x05, 0x47, 0x10, 0x41, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
  117. 0x01, 0x00, 0xa8, 0x47, 0xb9, 0x4a, 0x06, 0x47, 0x93, 0x71, 0x3d, 0xef,
  118. 0x7b, 0xca, 0xb4, 0x7c, 0x0a, 0xe6, 0x82, 0xd0, 0xe7, 0x0d, 0xa9, 0x08,
  119. 0xf6, 0xa4, 0xfd, 0xd8, 0x73, 0xae, 0x6f, 0x56, 0x29, 0x5e, 0x25, 0x72,
  120. 0xa8, 0x30, 0x44, 0x73, 0xcf, 0x56, 0x26, 0xb9, 0x61, 0xde, 0x42, 0x81,
  121. 0xf4, 0xf0, 0x1f, 0x5d, 0xcb, 0x47, 0xf2, 0x26, 0xe9, 0xe0, 0x93, 0x28,
  122. 0xa3, 0x10, 0x3b, 0x42, 0x1e, 0x51, 0x11, 0x12, 0x06, 0x5e, 0xaf, 0xce,
  123. 0xb0, 0xa5, 0x14, 0xdd, 0x82, 0x58, 0xa1, 0xa4, 0x12, 0xdf, 0x65, 0x1d,
  124. 0x51, 0x70, 0x64, 0xd5, 0x58, 0x68, 0x11, 0xa8, 0x6a, 0x23, 0xc2, 0xbf,
  125. 0xa1, 0x25, 0x24, 0x47, 0xb3, 0xa4, 0x3c, 0x83, 0x96, 0xb7, 0x1f, 0xf4,
  126. 0x44, 0xd4, 0xd1, 0xe9, 0xfc, 0x33, 0x68, 0x5e, 0xe2, 0x68, 0x99, 0x9c,
  127. 0x91, 0xe8, 0x72, 0xc9, 0xd7, 0x8c, 0x80, 0x20, 0x8e, 0x77, 0x83, 0x4d,
  128. 0xe4, 0xab, 0xf9, 0x74, 0xa1, 0xdf, 0xd3, 0xc0, 0x0d, 0x5b, 0x05, 0x51,
  129. 0xc2, 0x6f, 0xb2, 0x91, 0x02, 0xec, 0xc0, 0x02, 0x1a, 0x5c, 0x91, 0x05,
  130. 0xf1, 0xe3, 0xfa, 0x65, 0xc2, 0xad, 0x24, 0xe6, 0xe5, 0x3c, 0xb6, 0x16,
  131. 0xf1, 0xa1, 0x67, 0x1a, 0x9d, 0x37, 0x56, 0xbf, 0x01, 0xd7, 0x3b, 0x35,
  132. 0x30, 0x57, 0x73, 0xf4, 0xf0, 0x5e, 0xa7, 0xe8, 0x0a, 0xc1, 0x94, 0x17,
  133. 0xcf, 0x0a, 0xbd, 0xf5, 0x31, 0xa7, 0x2d, 0xf7, 0xf5, 0xd9, 0x8c, 0xc2,
  134. 0x01, 0xbd, 0xda, 0x16, 0x8e, 0xb9, 0x30, 0x40, 0xa6, 0x6e, 0xbd, 0xcd,
  135. 0x4d, 0x84, 0x67, 0x4e, 0x0b, 0xce, 0xd5, 0xef, 0xf8, 0x08, 0x63, 0x02,
  136. 0xc6, 0xc7, 0xf7, 0x67, 0x92, 0xe2, 0x23, 0x9d, 0x27, 0x22, 0x1d, 0xc6,
  137. 0x67, 0x5e, 0x66, 0xbf, 0x03, 0xb8, 0xa9, 0x67, 0xd4, 0x39, 0xd8, 0x75,
  138. 0xfa, 0xe8, 0xed, 0x56, 0xb8, 0x81, 0x02, 0x81, 0x81, 0x00, 0xf7, 0x46,
  139. 0x68, 0xc6, 0x13, 0xf8, 0xba, 0x0f, 0x83, 0xdb, 0x05, 0xa8, 0x25, 0x00,
  140. 0x70, 0x9c, 0x9e, 0x8b, 0x12, 0x34, 0x0d, 0x96, 0xcf, 0x0d, 0x98, 0x9b,
  141. 0x8d, 0x9c, 0x96, 0x78, 0xd1, 0x3c, 0x01, 0x8c, 0xb9, 0x35, 0x5c, 0x20,
  142. 0x42, 0xb4, 0x38, 0xe3, 0xd6, 0x54, 0xe7, 0x55, 0xd6, 0x26, 0x8a, 0x0c,
  143. 0xf6, 0x1f, 0xe0, 0x04, 0xc1, 0x22, 0x42, 0x19, 0x61, 0xc4, 0x94, 0x7c,
  144. 0x07, 0x2e, 0x80, 0x52, 0xfe, 0x8d, 0xe6, 0x92, 0x3a, 0x91, 0xfe, 0x72,
  145. 0x99, 0xe1, 0x2a, 0x73, 0x76, 0xb1, 0x24, 0x20, 0x67, 0xde, 0x28, 0xcb,
  146. 0x0e, 0xe6, 0x52, 0xb5, 0xfa, 0xfb, 0x8b, 0x1e, 0x6a, 0x1d, 0x09, 0x26,
  147. 0xb9, 0xa7, 0x61, 0xba, 0xf8, 0x79, 0xd2, 0x66, 0x57, 0x28, 0xd7, 0x31,
  148. 0xb5, 0x0b, 0x27, 0x19, 0x1e, 0x6f, 0x46, 0xfc, 0x54, 0x95, 0xeb, 0x78,
  149. 0x01, 0xb6, 0xd9, 0x79, 0x5a, 0x4d, 0x02, 0x81, 0x81, 0x00, 0xd5, 0x8f,
  150. 0x16, 0x53, 0x2f, 0x57, 0x93, 0xbf, 0x09, 0x75, 0xbf, 0x63, 0x40, 0x3d,
  151. 0x27, 0xfd, 0x23, 0x21, 0xde, 0x9b, 0xe9, 0x73, 0x3f, 0x49, 0x02, 0xd2,
  152. 0x38, 0x96, 0xcf, 0xc3, 0xba, 0x92, 0x07, 0x87, 0x52, 0xa9, 0x35, 0xe3,
  153. 0x0c, 0xe4, 0x2f, 0x05, 0x7b, 0x37, 0xa5, 0x40, 0x9c, 0x3b, 0x94, 0xf7,
  154. 0xad, 0xa0, 0xee, 0x3a, 0xa8, 0xfb, 0x1f, 0x11, 0x1f, 0xd8, 0x9a, 0x80,
  155. 0x42, 0x3d, 0x7f, 0xa4, 0xb8, 0x9a, 0xaa, 0xea, 0x72, 0xc1, 0xe3, 0xed,
  156. 0x06, 0x60, 0x92, 0x37, 0xf9, 0xba, 0xfb, 0x9e, 0xed, 0x05, 0xa6, 0xd4,
  157. 0x72, 0x68, 0x4f, 0x63, 0xfe, 0xd6, 0x10, 0x0d, 0x4f, 0x0a, 0x93, 0xc6,
  158. 0xb9, 0xd7, 0xaf, 0xfd, 0xd9, 0x57, 0x7d, 0xcb, 0x75, 0xe8, 0x93, 0x2b,
  159. 0xae, 0x4f, 0xea, 0xd7, 0x30, 0x0b, 0x58, 0x44, 0x82, 0x0f, 0x84, 0x5d,
  160. 0x62, 0x11, 0x78, 0xea, 0x5f, 0xc5, 0x02, 0x81, 0x81, 0x00, 0x82, 0x0c,
  161. 0xc1, 0xe6, 0x0b, 0x72, 0xf1, 0x48, 0x5f, 0xac, 0xbd, 0x98, 0xe5, 0x7d,
  162. 0x09, 0xbd, 0x15, 0x95, 0x47, 0x09, 0xa1, 0x6c, 0x03, 0x91, 0xbf, 0x05,
  163. 0x70, 0xc1, 0x3e, 0x52, 0x64, 0x99, 0x0e, 0xa7, 0x98, 0x70, 0xfb, 0xf6,
  164. 0xeb, 0x9e, 0x25, 0x9d, 0x8e, 0x88, 0x30, 0xf2, 0xf0, 0x22, 0x6c, 0xd0,
  165. 0xcc, 0x51, 0x8f, 0x5c, 0x70, 0xc7, 0x37, 0xc4, 0x69, 0xab, 0x1d, 0xfc,
  166. 0xed, 0x3a, 0x03, 0xbb, 0xa2, 0xad, 0xb6, 0xea, 0x89, 0x6b, 0x67, 0x4b,
  167. 0x96, 0xaa, 0xd9, 0xcc, 0xc8, 0x4b, 0xfa, 0x18, 0x21, 0x08, 0xb2, 0xa3,
  168. 0xb9, 0x3e, 0x61, 0x99, 0xdc, 0x5a, 0x97, 0x9c, 0x73, 0x6a, 0xb9, 0xf9,
  169. 0x68, 0x03, 0x24, 0x5f, 0x55, 0x77, 0x9c, 0xb4, 0xbe, 0x7a, 0x78, 0x53,
  170. 0x68, 0x48, 0x69, 0x53, 0xc8, 0xb1, 0xf5, 0xbf, 0x98, 0x2d, 0x11, 0x1e,
  171. 0x98, 0xa8, 0x36, 0x50, 0xa0, 0xb1, 0x02, 0x81, 0x81, 0x00, 0x90, 0x88,
  172. 0x30, 0x71, 0xc7, 0xfe, 0x9b, 0x6d, 0x95, 0x37, 0x6d, 0x79, 0xfc, 0x85,
  173. 0xe7, 0x44, 0x78, 0xbc, 0x79, 0x6e, 0x47, 0x86, 0xc9, 0xf3, 0xdd, 0xc6,
  174. 0xec, 0xa9, 0x94, 0x9f, 0x40, 0xeb, 0x87, 0xd0, 0xdb, 0xee, 0xcd, 0x1b,
  175. 0x87, 0x23, 0xff, 0x76, 0xd4, 0x37, 0x8a, 0xcd, 0xb9, 0x6e, 0xd1, 0x98,
  176. 0xf6, 0x97, 0x8d, 0xe3, 0x81, 0x6d, 0xc3, 0x4e, 0xd1, 0xa0, 0xc4, 0x9f,
  177. 0xbd, 0x34, 0xe5, 0xe8, 0x53, 0x4f, 0xca, 0x10, 0xb5, 0xed, 0xe7, 0x16,
  178. 0x09, 0x54, 0xde, 0x60, 0xa7, 0xd1, 0x16, 0x6e, 0x2e, 0xb7, 0xbe, 0x7a,
  179. 0xd5, 0x9b, 0x26, 0xef, 0xe4, 0x0e, 0x77, 0xfa, 0xa9, 0xdd, 0xdc, 0xb9,
  180. 0x88, 0x19, 0x23, 0x70, 0xc7, 0xe1, 0x60, 0xaf, 0x8c, 0x73, 0x04, 0xf7,
  181. 0x71, 0x17, 0x81, 0x36, 0x75, 0xbb, 0x97, 0xd7, 0x75, 0xb6, 0x8e, 0xbc,
  182. 0xac, 0x9c, 0x6a, 0x9b, 0x24, 0x89, 0x02, 0x81, 0x80, 0x5a, 0x2b, 0xc7,
  183. 0x6b, 0x8c, 0x65, 0xdb, 0x04, 0x73, 0xab, 0x25, 0xe1, 0x5b, 0xbc, 0x3c,
  184. 0xcf, 0x5a, 0x3c, 0x04, 0xae, 0x97, 0x2e, 0xfd, 0xa4, 0x97, 0x1f, 0x05,
  185. 0x17, 0x27, 0xac, 0x7c, 0x30, 0x85, 0xb4, 0x82, 0x3f, 0x5b, 0xb7, 0x94,
  186. 0x3b, 0x7f, 0x6c, 0x0c, 0xc7, 0x16, 0xc6, 0xa0, 0xbd, 0x80, 0xb0, 0x81,
  187. 0xde, 0xa0, 0x23, 0xa6, 0xf6, 0x75, 0x33, 0x51, 0x35, 0xa2, 0x75, 0x55,
  188. 0x70, 0x4d, 0x42, 0xbb, 0xcf, 0x54, 0xe4, 0xdb, 0x2d, 0x88, 0xa0, 0x7a,
  189. 0xf2, 0x17, 0xa7, 0xdd, 0x13, 0x44, 0x9f, 0x5f, 0x6b, 0x2c, 0x42, 0x42,
  190. 0x8b, 0x13, 0x4d, 0xf9, 0x5b, 0xf8, 0x33, 0x42, 0xd9, 0x9e, 0x50, 0x1c,
  191. 0x7c, 0xbc, 0xfa, 0x62, 0x85, 0x0b, 0xcf, 0x99, 0xda, 0x9e, 0x04, 0x90,
  192. 0xb2, 0xc6, 0xb2, 0x0a, 0x2a, 0x7c, 0x6d, 0x6a, 0x40, 0xfc, 0xf5, 0x50,
  193. 0x98, 0x46, 0x89, 0x82, 0x40,
  194. };
  195. struct GlobalState {
  196. GlobalState() {
  197. const uint8_t *bufp = kRSAPrivateKeyDER;
  198. RSA *privkey = d2i_RSAPrivateKey(NULL, &bufp, sizeof(kRSAPrivateKeyDER));
  199. assert(privkey != nullptr);
  200. pkey_.reset(EVP_PKEY_new());
  201. EVP_PKEY_assign_RSA(pkey_.get(), privkey);
  202. bufp = kCertificateDER;
  203. cert_.reset(d2i_X509(NULL, &bufp, sizeof(kCertificateDER)));
  204. assert(cert_.get() != nullptr);
  205. X509_up_ref(cert_.get());
  206. certs_.reset(sk_X509_new_null());
  207. sk_X509_push(certs_.get(), cert_.get());
  208. }
  209. bssl::UniquePtr<EVP_PKEY> pkey_;
  210. bssl::UniquePtr<X509> cert_;
  211. bssl::UniquePtr<STACK_OF(X509)> certs_;
  212. };
  213. static GlobalState g_state;
  214. static bool GetString(std::string *out, CBS *cbs) {
  215. CBS str;
  216. if (!CBS_get_u8_length_prefixed(cbs, &str)) {
  217. return false;
  218. }
  219. out->assign(reinterpret_cast<const char *>(CBS_data(&str)), CBS_len(&str));
  220. return true;
  221. }
  222. extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
  223. constexpr size_t kMaxExpensiveAPIs = 100;
  224. unsigned expensive_api_count = 0;
  225. const std::function<void(SSL_CTX *, CBS *)> kAPIs[] = {
  226. [](SSL_CTX *ctx, CBS *cbs) {
  227. uint8_t b;
  228. if (!CBS_get_u8(cbs, &b)) {
  229. return;
  230. }
  231. SSL_CTX_set_quiet_shutdown(ctx, b);
  232. },
  233. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_quiet_shutdown(ctx); },
  234. [](SSL_CTX *ctx, CBS *cbs) {
  235. uint16_t version;
  236. if (!CBS_get_u16(cbs, &version)) {
  237. return;
  238. }
  239. SSL_CTX_set_min_proto_version(ctx, version);
  240. },
  241. [](SSL_CTX *ctx, CBS *cbs) {
  242. uint16_t version;
  243. if (!CBS_get_u16(cbs, &version)) {
  244. return;
  245. }
  246. SSL_CTX_set_max_proto_version(ctx, version);
  247. },
  248. [](SSL_CTX *ctx, CBS *cbs) {
  249. uint32_t options;
  250. if (!CBS_get_u32(cbs, &options)) {
  251. return;
  252. }
  253. SSL_CTX_set_options(ctx, options);
  254. },
  255. [](SSL_CTX *ctx, CBS *cbs) {
  256. uint32_t options;
  257. if (!CBS_get_u32(cbs, &options)) {
  258. return;
  259. }
  260. SSL_CTX_clear_options(ctx, options);
  261. },
  262. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_options(ctx); },
  263. [](SSL_CTX *ctx, CBS *cbs) {
  264. uint32_t mode;
  265. if (!CBS_get_u32(cbs, &mode)) {
  266. return;
  267. }
  268. SSL_CTX_set_mode(ctx, mode);
  269. },
  270. [](SSL_CTX *ctx, CBS *cbs) {
  271. uint32_t mode;
  272. if (!CBS_get_u32(cbs, &mode)) {
  273. return;
  274. }
  275. SSL_CTX_clear_mode(ctx, mode);
  276. },
  277. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_mode(ctx); },
  278. [](SSL_CTX *ctx, CBS *cbs) {
  279. SSL_CTX_use_certificate(ctx, g_state.cert_.get());
  280. },
  281. [](SSL_CTX *ctx, CBS *cbs) {
  282. SSL_CTX_use_PrivateKey(ctx, g_state.pkey_.get());
  283. },
  284. [](SSL_CTX *ctx, CBS *cbs) {
  285. SSL_CTX_set1_chain(ctx, g_state.certs_.get());
  286. },
  287. [&](SSL_CTX *ctx, CBS *cbs) {
  288. // Avoid an unbounded certificate chain.
  289. if (++expensive_api_count >= kMaxExpensiveAPIs) {
  290. return;
  291. }
  292. SSL_CTX_add1_chain_cert(ctx, g_state.cert_.get());
  293. },
  294. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_chain_certs(ctx); },
  295. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_extra_chain_certs(ctx); },
  296. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_check_private_key(ctx); },
  297. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_certificate(ctx); },
  298. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_privatekey(ctx); },
  299. [](SSL_CTX *ctx, CBS *cbs) {
  300. STACK_OF(X509) * chains;
  301. SSL_CTX_get0_chain_certs(ctx, &chains);
  302. },
  303. [](SSL_CTX *ctx, CBS *cbs) {
  304. std::string sct_data;
  305. if (!GetString(&sct_data, cbs)) {
  306. return;
  307. }
  308. SSL_CTX_set_signed_cert_timestamp_list(
  309. ctx, reinterpret_cast<const uint8_t *>(sct_data.data()),
  310. sct_data.size());
  311. },
  312. [](SSL_CTX *ctx, CBS *cbs) {
  313. std::string ocsp_data;
  314. if (!GetString(&ocsp_data, cbs)) {
  315. return;
  316. }
  317. SSL_CTX_set_ocsp_response(
  318. ctx, reinterpret_cast<const uint8_t *>(ocsp_data.data()),
  319. ocsp_data.size());
  320. },
  321. [](SSL_CTX *ctx, CBS *cbs) {
  322. std::string signing_algos;
  323. if (!GetString(&signing_algos, cbs)) {
  324. return;
  325. }
  326. SSL_CTX_set_signing_algorithm_prefs(
  327. ctx, reinterpret_cast<const uint16_t *>(signing_algos.data()),
  328. signing_algos.size() / sizeof(uint16_t));
  329. },
  330. [](SSL_CTX *ctx, CBS *cbs) {
  331. std::string ciphers;
  332. if (!GetString(&ciphers, cbs)) {
  333. return;
  334. }
  335. SSL_CTX_set_strict_cipher_list(ctx, ciphers.c_str());
  336. },
  337. [](SSL_CTX *ctx, CBS *cbs) {
  338. std::string ciphers;
  339. if (!GetString(&ciphers, cbs)) {
  340. return;
  341. }
  342. SSL_CTX_set_cipher_list(ctx, ciphers.c_str());
  343. },
  344. [](SSL_CTX *ctx, CBS *cbs) {
  345. std::string verify_algos;
  346. if (!GetString(&verify_algos, cbs)) {
  347. return;
  348. }
  349. SSL_CTX_set_verify_algorithm_prefs(
  350. ctx, reinterpret_cast<const uint16_t *>(verify_algos.data()),
  351. verify_algos.size() / sizeof(uint16_t));
  352. },
  353. [](SSL_CTX *ctx, CBS *cbs) {
  354. std::string ciphers;
  355. if (!GetString(&ciphers, cbs)) {
  356. return;
  357. }
  358. SSL_CTX_set_session_id_context(
  359. ctx, reinterpret_cast<const uint8_t *>(ciphers.data()),
  360. ciphers.size());
  361. },
  362. [](SSL_CTX *ctx, CBS *cbs) {
  363. uint32_t size;
  364. if (!CBS_get_u32(cbs, &size)) {
  365. return;
  366. }
  367. SSL_CTX_sess_set_cache_size(ctx, size);
  368. },
  369. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_get_cache_size(ctx); },
  370. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_number(ctx); },
  371. [](SSL_CTX *ctx, CBS *cbs) {
  372. uint32_t time;
  373. if (!CBS_get_u32(cbs, &time)) {
  374. return;
  375. }
  376. SSL_CTX_flush_sessions(ctx, time);
  377. },
  378. [](SSL_CTX *ctx, CBS *cbs) {
  379. std::string keys;
  380. if (!GetString(&keys, cbs)) {
  381. return;
  382. }
  383. SSL_CTX_set_tlsext_ticket_keys(
  384. ctx, reinterpret_cast<const uint8_t *>(keys.data()), keys.size());
  385. },
  386. [](SSL_CTX *ctx, CBS *cbs) {
  387. std::string curves;
  388. if (!GetString(&curves, cbs)) {
  389. return;
  390. }
  391. SSL_CTX_set1_curves(ctx, reinterpret_cast<const int *>(curves.data()),
  392. curves.size() / sizeof(int));
  393. },
  394. [](SSL_CTX *ctx, CBS *cbs) {
  395. std::string curves;
  396. if (!GetString(&curves, cbs)) {
  397. return;
  398. }
  399. SSL_CTX_set1_curves_list(ctx, curves.c_str());
  400. },
  401. [](SSL_CTX *ctx, CBS *cbs) {
  402. SSL_CTX_enable_signed_cert_timestamps(ctx);
  403. },
  404. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_enable_ocsp_stapling(ctx); },
  405. [&](SSL_CTX *ctx, CBS *cbs) {
  406. // Avoid an unbounded client CA list.
  407. if (++expensive_api_count >= kMaxExpensiveAPIs) {
  408. return;
  409. }
  410. SSL_CTX_add_client_CA(ctx, g_state.cert_.get());
  411. },
  412. [](SSL_CTX *ctx, CBS *cbs) {
  413. std::string protos;
  414. if (!GetString(&protos, cbs)) {
  415. return;
  416. }
  417. SSL_CTX_set_alpn_protos(
  418. ctx, reinterpret_cast<const uint8_t *>(protos.data()),
  419. protos.size());
  420. },
  421. [](SSL_CTX *ctx, CBS *cbs) {
  422. std::string profiles;
  423. if (!GetString(&profiles, cbs)) {
  424. return;
  425. }
  426. SSL_CTX_set_srtp_profiles(ctx, profiles.c_str());
  427. },
  428. [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_max_cert_list(ctx); },
  429. [](SSL_CTX *ctx, CBS *cbs) {
  430. uint32_t size;
  431. if (!CBS_get_u32(cbs, &size)) {
  432. return;
  433. }
  434. SSL_CTX_set_max_cert_list(ctx, size);
  435. },
  436. [](SSL_CTX *ctx, CBS *cbs) {
  437. uint32_t size;
  438. if (!CBS_get_u32(cbs, &size)) {
  439. return;
  440. }
  441. SSL_CTX_set_max_send_fragment(ctx, size);
  442. },
  443. [](SSL_CTX *ctx, CBS *cbs) {
  444. uint8_t b;
  445. if (!CBS_get_u8(cbs, &b)) {
  446. return;
  447. }
  448. SSL_CTX_set_retain_only_sha256_of_client_certs(ctx, b);
  449. },
  450. [](SSL_CTX *ctx, CBS *cbs) {
  451. uint8_t b;
  452. if (!CBS_get_u8(cbs, &b)) {
  453. return;
  454. }
  455. SSL_CTX_set_grease_enabled(ctx, b);
  456. },
  457. };
  458. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  459. // If the number of functions exceeds this limit then the code needs to do
  460. // more than sample a single uint8_t to pick the function.
  461. static_assert(OPENSSL_ARRAY_SIZE(kAPIs) < 256, "kAPIs too large");
  462. CBS cbs;
  463. CBS_init(&cbs, buf, len);
  464. for (;;) {
  465. uint8_t index;
  466. if (!CBS_get_u8(&cbs, &index)) {
  467. break;
  468. }
  469. kAPIs[index % OPENSSL_ARRAY_SIZE(kAPIs)](ctx.get(), &cbs);
  470. }
  471. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  472. ERR_clear_error();
  473. return 0;
  474. }