Leaked source code of windows server 2003
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.

789 lines
23 KiB

  1. #include <windows.h>
  2. #include "spnego.h"
  3. ASN1module_t SPNEGO_Module = NULL;
  4. static int ASN1CALL ASN1Enc_SavedMechTypeList(ASN1encoding_t enc, ASN1uint32_t tag, SavedMechTypeList *val);
  5. static int ASN1CALL ASN1Enc_MechTypeList(ASN1encoding_t enc, ASN1uint32_t tag, PMechTypeList *val);
  6. static int ASN1CALL ASN1Enc_NegHints(ASN1encoding_t enc, ASN1uint32_t tag, NegHints *val);
  7. static int ASN1CALL ASN1Enc_NegTokenInit(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenInit *val);
  8. static int ASN1CALL ASN1Enc_NegTokenInit2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenInit2 *val);
  9. static int ASN1CALL ASN1Enc_NegTokenTarg(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenTarg *val);
  10. static int ASN1CALL ASN1Enc_NegotiationToken(ASN1encoding_t enc, ASN1uint32_t tag, NegotiationToken *val);
  11. static int ASN1CALL ASN1Enc_InitialNegToken(ASN1encoding_t enc, ASN1uint32_t tag, InitialNegToken *val);
  12. static int ASN1CALL ASN1Dec_SavedMechTypeList(ASN1decoding_t dec, ASN1uint32_t tag, SavedMechTypeList *val);
  13. static int ASN1CALL ASN1Dec_MechTypeList(ASN1decoding_t dec, ASN1uint32_t tag, PMechTypeList *val);
  14. static int ASN1CALL ASN1Dec_NegHints(ASN1decoding_t dec, ASN1uint32_t tag, NegHints *val);
  15. static int ASN1CALL ASN1Dec_NegTokenInit(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenInit *val);
  16. static int ASN1CALL ASN1Dec_NegTokenInit2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenInit2 *val);
  17. static int ASN1CALL ASN1Dec_NegTokenTarg(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenTarg *val);
  18. static int ASN1CALL ASN1Dec_NegotiationToken(ASN1decoding_t dec, ASN1uint32_t tag, NegotiationToken *val);
  19. static int ASN1CALL ASN1Dec_InitialNegToken(ASN1decoding_t dec, ASN1uint32_t tag, InitialNegToken *val);
  20. static void ASN1CALL ASN1Free_SavedMechTypeList(SavedMechTypeList *val);
  21. static void ASN1CALL ASN1Free_MechTypeList(PMechTypeList *val);
  22. static void ASN1CALL ASN1Free_NegHints(NegHints *val);
  23. static void ASN1CALL ASN1Free_NegTokenInit(NegTokenInit *val);
  24. static void ASN1CALL ASN1Free_NegTokenInit2(NegTokenInit2 *val);
  25. static void ASN1CALL ASN1Free_NegTokenTarg(NegTokenTarg *val);
  26. static void ASN1CALL ASN1Free_NegotiationToken(NegotiationToken *val);
  27. static void ASN1CALL ASN1Free_InitialNegToken(InitialNegToken *val);
  28. typedef ASN1BerEncFun_t ASN1EncFun_t;
  29. static const ASN1EncFun_t encfntab[3] = {
  30. (ASN1EncFun_t) ASN1Enc_SavedMechTypeList,
  31. (ASN1EncFun_t) ASN1Enc_NegotiationToken,
  32. (ASN1EncFun_t) ASN1Enc_InitialNegToken,
  33. };
  34. typedef ASN1BerDecFun_t ASN1DecFun_t;
  35. static const ASN1DecFun_t decfntab[3] = {
  36. (ASN1DecFun_t) ASN1Dec_SavedMechTypeList,
  37. (ASN1DecFun_t) ASN1Dec_NegotiationToken,
  38. (ASN1DecFun_t) ASN1Dec_InitialNegToken,
  39. };
  40. static const ASN1FreeFun_t freefntab[3] = {
  41. (ASN1FreeFun_t) ASN1Free_SavedMechTypeList,
  42. (ASN1FreeFun_t) ASN1Free_NegotiationToken,
  43. (ASN1FreeFun_t) ASN1Free_InitialNegToken,
  44. };
  45. static const ULONG sizetab[3] = {
  46. SIZE_SPNEGO_Module_PDU_0,
  47. SIZE_SPNEGO_Module_PDU_1,
  48. SIZE_SPNEGO_Module_PDU_2,
  49. };
  50. /* forward declarations of values: */
  51. /* definitions of value components: */
  52. /* definitions of values: */
  53. void ASN1CALL SPNEGO_Module_Startup(void)
  54. {
  55. SPNEGO_Module = ASN1_CreateModule(0x10000, ASN1_BER_RULE_DER, ASN1FLAGS_NONE, 3, (const ASN1GenericFun_t *) encfntab, (const ASN1GenericFun_t *) decfntab, freefntab, sizetab, 0x656e7073);
  56. }
  57. void ASN1CALL SPNEGO_Module_Cleanup(void)
  58. {
  59. ASN1_CloseModule(SPNEGO_Module);
  60. SPNEGO_Module = NULL;
  61. }
  62. static int ASN1CALL ASN1Enc_SavedMechTypeList(ASN1encoding_t enc, ASN1uint32_t tag, SavedMechTypeList *val)
  63. {
  64. if (!ASN1Enc_MechTypeList(enc, tag, val))
  65. {
  66. return 0;
  67. }
  68. return 1;
  69. }
  70. static int ASN1CALL ASN1Dec_SavedMechTypeList(ASN1decoding_t dec, ASN1uint32_t tag, SavedMechTypeList *val)
  71. {
  72. if (!ASN1Dec_MechTypeList(dec, tag, val))
  73. {
  74. return 0;
  75. }
  76. return 1;
  77. }
  78. static void ASN1CALL ASN1Free_SavedMechTypeList(SavedMechTypeList *val)
  79. {
  80. if (val) {
  81. ASN1Free_MechTypeList(val);
  82. }
  83. }
  84. static int ASN1CALL ASN1Enc_MechTypeList(ASN1encoding_t enc, ASN1uint32_t tag, PMechTypeList *val)
  85. {
  86. PMechTypeList f;
  87. ASN1uint32_t nLenOff;
  88. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
  89. {
  90. return 0;
  91. }
  92. for (f = *val; f; f = f->next) {
  93. if (!ASN1BEREncObjectIdentifier(enc, 0x6, &f->value))
  94. {
  95. return 0;
  96. }
  97. }
  98. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  99. {
  100. return 0;
  101. }
  102. return 1;
  103. }
  104. static int ASN1CALL ASN1Dec_MechTypeList(ASN1decoding_t dec, ASN1uint32_t tag, PMechTypeList *val)
  105. {
  106. PMechTypeList *f;
  107. ASN1decoding_t dd;
  108. ASN1octet_t *di;
  109. ASN1uint32_t t;
  110. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
  111. {
  112. return 0;
  113. }
  114. f = val;
  115. while (ASN1BERDecNotEndOfContents(dd, di)) {
  116. if (!ASN1BERDecPeekTag(dd, &t))
  117. {
  118. return 0;
  119. }
  120. if (!(*f = (PMechTypeList)ASN1DecAlloc(dd, sizeof(**f))))
  121. {
  122. return 0;
  123. }
  124. if (!ASN1BERDecObjectIdentifier(dd, 0x6, &(*f)->value))
  125. {
  126. return 0;
  127. }
  128. f = &(*f)->next;
  129. }
  130. *f = NULL;
  131. if (!ASN1BERDecEndOfContents(dec, dd, di))
  132. {
  133. return 0;
  134. }
  135. return 1;
  136. }
  137. static void ASN1CALL ASN1Free_MechTypeList(PMechTypeList *val)
  138. {
  139. PMechTypeList f, ff;
  140. if (val) {
  141. for (f = *val; f; f = ff) {
  142. ASN1objectidentifier_free(&f->value);
  143. ff = f->next;
  144. ASN1Free(f);
  145. }
  146. }
  147. }
  148. static int ASN1CALL ASN1Enc_NegHints(ASN1encoding_t enc, ASN1uint32_t tag, NegHints *val)
  149. {
  150. ASN1uint32_t nLenOff;
  151. ASN1uint32_t t;
  152. ASN1uint32_t nLenOff0;
  153. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
  154. return 0;
  155. if ((val)->o[0] & 0x80) {
  156. t = lstrlenA((val)->hintName);
  157. if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
  158. return 0;
  159. if (!ASN1DEREncCharString(enc, 0x1b, t, (val)->hintName))
  160. return 0;
  161. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  162. return 0;
  163. }
  164. if ((val)->o[0] & 0x40) {
  165. if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
  166. return 0;
  167. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->hintAddress).length, ((val)->hintAddress).value))
  168. return 0;
  169. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  170. return 0;
  171. }
  172. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  173. return 0;
  174. return 1;
  175. }
  176. static int ASN1CALL ASN1Dec_NegHints(ASN1decoding_t dec, ASN1uint32_t tag, NegHints *val)
  177. {
  178. ASN1decoding_t dd;
  179. ASN1octet_t *di;
  180. ASN1uint32_t t;
  181. ASN1decoding_t dd0;
  182. ASN1octet_t *di0;
  183. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
  184. return 0;
  185. ZeroMemory((val)->o, 1);
  186. ASN1BERDecPeekTag(dd, &t);
  187. if (t == 0x80000000) {
  188. (val)->o[0] |= 0x80;
  189. if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
  190. return 0;
  191. if (!ASN1BERDecZeroCharString(dd0, 0x1b, &(val)->hintName))
  192. return 0;
  193. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  194. return 0;
  195. }
  196. ASN1BERDecPeekTag(dd, &t);
  197. if (t == 0x80000001) {
  198. (val)->o[0] |= 0x40;
  199. if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
  200. return 0;
  201. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->hintAddress))
  202. return 0;
  203. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  204. return 0;
  205. }
  206. if (!ASN1BERDecEndOfContents(dec, dd, di))
  207. return 0;
  208. return 1;
  209. }
  210. static void ASN1CALL ASN1Free_NegHints(NegHints *val)
  211. {
  212. if (val) {
  213. if ((val)->o[0] & 0x80) {
  214. ASN1ztcharstring_free((val)->hintName);
  215. }
  216. if ((val)->o[0] & 0x40) {
  217. ASN1octetstring_free(&(val)->hintAddress);
  218. }
  219. }
  220. }
  221. static int ASN1CALL ASN1Enc_NegTokenInit(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenInit *val)
  222. {
  223. ASN1uint32_t nLenOff;
  224. ASN1uint32_t nLenOff0;
  225. ASN1uint32_t r;
  226. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
  227. return 0;
  228. if ((val)->o[0] & 0x80) {
  229. if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
  230. return 0;
  231. if (!ASN1Enc_MechTypeList(enc, 0, &(val)->mechTypes))
  232. return 0;
  233. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  234. return 0;
  235. }
  236. if ((val)->o[0] & 0x40) {
  237. r = ((val)->reqFlags).length;
  238. ASN1BEREncRemoveZeroBits(&r, ((val)->reqFlags).value);
  239. if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
  240. return 0;
  241. if (!ASN1DEREncBitString(enc, 0x3, r, ((val)->reqFlags).value))
  242. return 0;
  243. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  244. return 0;
  245. }
  246. if ((val)->o[0] & 0x20) {
  247. if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
  248. return 0;
  249. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechToken).length, ((val)->mechToken).value))
  250. return 0;
  251. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  252. return 0;
  253. }
  254. if ((val)->o[0] & 0x10) {
  255. if (!ASN1BEREncExplicitTag(enc, 0x80000003, &nLenOff0))
  256. return 0;
  257. if (!ASN1Enc_NegHints(enc, 0, &(val)->negHints))
  258. return 0;
  259. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  260. return 0;
  261. }
  262. if ((val)->o[0] & 0x8) {
  263. if (!ASN1BEREncExplicitTag(enc, 0x80000004, &nLenOff0))
  264. return 0;
  265. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechListMIC).length, ((val)->mechListMIC).value))
  266. return 0;
  267. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  268. return 0;
  269. }
  270. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  271. return 0;
  272. return 1;
  273. }
  274. static int ASN1CALL ASN1Dec_NegTokenInit(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenInit *val)
  275. {
  276. ASN1decoding_t dd;
  277. ASN1octet_t *di;
  278. ASN1uint32_t t;
  279. ASN1decoding_t dd0;
  280. ASN1octet_t *di0;
  281. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
  282. return 0;
  283. ZeroMemory((val)->o, 1);
  284. ASN1BERDecPeekTag(dd, &t);
  285. if (t == 0x80000000) {
  286. (val)->o[0] |= 0x80;
  287. if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
  288. return 0;
  289. if (!ASN1Dec_MechTypeList(dd0, 0, &(val)->mechTypes))
  290. return 0;
  291. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  292. return 0;
  293. }
  294. ASN1BERDecPeekTag(dd, &t);
  295. if (t == 0x80000001) {
  296. (val)->o[0] |= 0x40;
  297. if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
  298. return 0;
  299. if (!ASN1BERDecBitString(dd0, 0x3, &(val)->reqFlags))
  300. return 0;
  301. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  302. return 0;
  303. }
  304. ASN1BERDecPeekTag(dd, &t);
  305. if (t == 0x80000002) {
  306. (val)->o[0] |= 0x20;
  307. if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
  308. return 0;
  309. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechToken))
  310. return 0;
  311. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  312. return 0;
  313. }
  314. ASN1BERDecPeekTag(dd, &t);
  315. if (t == 0x80000003) {
  316. (val)->o[0] |= 0x10;
  317. if (!ASN1BERDecExplicitTag(dd, 0x80000003, &dd0, &di0))
  318. return 0;
  319. if (!ASN1Dec_NegHints(dd0, 0, &(val)->negHints))
  320. return 0;
  321. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  322. return 0;
  323. }
  324. ASN1BERDecPeekTag(dd, &t);
  325. if (t == 0x80000004) {
  326. (val)->o[0] |= 0x8;
  327. if (!ASN1BERDecExplicitTag(dd, 0x80000004, &dd0, &di0))
  328. return 0;
  329. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechListMIC))
  330. return 0;
  331. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  332. return 0;
  333. }
  334. if (!ASN1BERDecEndOfContents(dec, dd, di))
  335. return 0;
  336. return 1;
  337. }
  338. static void ASN1CALL ASN1Free_NegTokenInit(NegTokenInit *val)
  339. {
  340. if (val) {
  341. if ((val)->o[0] & 0x80) {
  342. ASN1Free_MechTypeList(&(val)->mechTypes);
  343. }
  344. if ((val)->o[0] & 0x40) {
  345. ASN1bitstring_free(&(val)->reqFlags);
  346. }
  347. if ((val)->o[0] & 0x20) {
  348. ASN1octetstring_free(&(val)->mechToken);
  349. }
  350. if ((val)->o[0] & 0x10) {
  351. ASN1Free_NegHints(&(val)->negHints);
  352. }
  353. if ((val)->o[0] & 0x8) {
  354. ASN1octetstring_free(&(val)->mechListMIC);
  355. }
  356. }
  357. }
  358. static int ASN1CALL ASN1Enc_NegTokenInit2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenInit2 *val)
  359. {
  360. ASN1uint32_t nLenOff;
  361. ASN1uint32_t nLenOff0;
  362. ASN1uint32_t r;
  363. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
  364. return 0;
  365. if ((val)->o[0] & 0x80) {
  366. if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
  367. return 0;
  368. if (!ASN1Enc_MechTypeList(enc, 0, &(val)->mechTypes))
  369. return 0;
  370. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  371. return 0;
  372. }
  373. if ((val)->o[0] & 0x40) {
  374. r = ((val)->reqFlags).length;
  375. ASN1BEREncRemoveZeroBits(&r, ((val)->reqFlags).value);
  376. if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
  377. return 0;
  378. if (!ASN1DEREncBitString(enc, 0x3, r, ((val)->reqFlags).value))
  379. return 0;
  380. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  381. return 0;
  382. }
  383. if ((val)->o[0] & 0x20) {
  384. if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
  385. return 0;
  386. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechToken).length, ((val)->mechToken).value))
  387. return 0;
  388. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  389. return 0;
  390. }
  391. if ((val)->o[0] & 0x10) {
  392. if (!ASN1BEREncExplicitTag(enc, 0x80000003, &nLenOff0))
  393. return 0;
  394. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechListMIC).length, ((val)->mechListMIC).value))
  395. return 0;
  396. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  397. return 0;
  398. }
  399. if ((val)->o[0] & 0x8) {
  400. if (!ASN1BEREncExplicitTag(enc, 0x80000004, &nLenOff0))
  401. return 0;
  402. if (!ASN1Enc_NegHints(enc, 0, &(val)->negHints))
  403. return 0;
  404. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  405. return 0;
  406. }
  407. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  408. return 0;
  409. return 1;
  410. }
  411. static int ASN1CALL ASN1Dec_NegTokenInit2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenInit2 *val)
  412. {
  413. ASN1decoding_t dd;
  414. ASN1octet_t *di;
  415. ASN1uint32_t t;
  416. ASN1decoding_t dd0;
  417. ASN1octet_t *di0;
  418. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
  419. return 0;
  420. ZeroMemory((val)->o, 1);
  421. ASN1BERDecPeekTag(dd, &t);
  422. if (t == 0x80000000) {
  423. (val)->o[0] |= 0x80;
  424. if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
  425. return 0;
  426. if (!ASN1Dec_MechTypeList(dd0, 0, &(val)->mechTypes))
  427. return 0;
  428. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  429. return 0;
  430. }
  431. ASN1BERDecPeekTag(dd, &t);
  432. if (t == 0x80000001) {
  433. (val)->o[0] |= 0x40;
  434. if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
  435. return 0;
  436. if (!ASN1BERDecBitString(dd0, 0x3, &(val)->reqFlags))
  437. return 0;
  438. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  439. return 0;
  440. }
  441. ASN1BERDecPeekTag(dd, &t);
  442. if (t == 0x80000002) {
  443. (val)->o[0] |= 0x20;
  444. if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
  445. return 0;
  446. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechToken))
  447. return 0;
  448. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  449. return 0;
  450. }
  451. ASN1BERDecPeekTag(dd, &t);
  452. if (t == 0x80000003) {
  453. (val)->o[0] |= 0x10;
  454. if (!ASN1BERDecExplicitTag(dd, 0x80000003, &dd0, &di0))
  455. return 0;
  456. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechListMIC))
  457. return 0;
  458. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  459. return 0;
  460. }
  461. ASN1BERDecPeekTag(dd, &t);
  462. if (t == 0x80000004) {
  463. (val)->o[0] |= 0x8;
  464. if (!ASN1BERDecExplicitTag(dd, 0x80000004, &dd0, &di0))
  465. return 0;
  466. if (!ASN1Dec_NegHints(dd0, 0, &(val)->negHints))
  467. return 0;
  468. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  469. return 0;
  470. }
  471. if (!ASN1BERDecEndOfContents(dec, dd, di))
  472. return 0;
  473. return 1;
  474. }
  475. static void ASN1CALL ASN1Free_NegTokenInit2(NegTokenInit2 *val)
  476. {
  477. if (val) {
  478. if ((val)->o[0] & 0x80) {
  479. ASN1Free_MechTypeList(&(val)->mechTypes);
  480. }
  481. if ((val)->o[0] & 0x40) {
  482. ASN1bitstring_free(&(val)->reqFlags);
  483. }
  484. if ((val)->o[0] & 0x20) {
  485. ASN1octetstring_free(&(val)->mechToken);
  486. }
  487. if ((val)->o[0] & 0x10) {
  488. ASN1octetstring_free(&(val)->mechListMIC);
  489. }
  490. if ((val)->o[0] & 0x8) {
  491. ASN1Free_NegHints(&(val)->negHints);
  492. }
  493. }
  494. }
  495. static int ASN1CALL ASN1Enc_NegTokenTarg(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenTarg *val)
  496. {
  497. ASN1uint32_t nLenOff;
  498. ASN1uint32_t nLenOff0;
  499. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
  500. return 0;
  501. if ((val)->o[0] & 0x80) {
  502. if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
  503. return 0;
  504. if (!ASN1BEREncU32(enc, 0xa, (val)->negResult))
  505. return 0;
  506. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  507. return 0;
  508. }
  509. if ((val)->o[0] & 0x40) {
  510. if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
  511. return 0;
  512. if (!ASN1BEREncObjectIdentifier(enc, 0x6, &(val)->supportedMech))
  513. return 0;
  514. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  515. return 0;
  516. }
  517. if ((val)->o[0] & 0x20) {
  518. if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
  519. return 0;
  520. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->responseToken).length, ((val)->responseToken).value))
  521. return 0;
  522. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  523. return 0;
  524. }
  525. if ((val)->o[0] & 0x10) {
  526. if (!ASN1BEREncExplicitTag(enc, 0x80000003, &nLenOff0))
  527. return 0;
  528. if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechListMIC).length, ((val)->mechListMIC).value))
  529. return 0;
  530. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  531. return 0;
  532. }
  533. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  534. return 0;
  535. return 1;
  536. }
  537. static int ASN1CALL ASN1Dec_NegTokenTarg(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenTarg *val)
  538. {
  539. ASN1decoding_t dd;
  540. ASN1octet_t *di;
  541. ASN1uint32_t t;
  542. ASN1decoding_t dd0;
  543. ASN1octet_t *di0;
  544. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
  545. return 0;
  546. ZeroMemory((val)->o, 1);
  547. ASN1BERDecPeekTag(dd, &t);
  548. if (t == 0x80000000) {
  549. (val)->o[0] |= 0x80;
  550. if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
  551. return 0;
  552. if (!ASN1BERDecU32Val(dd0, 0xa, (ASN1uint32_t *) &(val)->negResult))
  553. return 0;
  554. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  555. return 0;
  556. }
  557. ASN1BERDecPeekTag(dd, &t);
  558. if (t == 0x80000001) {
  559. (val)->o[0] |= 0x40;
  560. if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
  561. return 0;
  562. if (!ASN1BERDecObjectIdentifier(dd0, 0x6, &(val)->supportedMech))
  563. return 0;
  564. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  565. return 0;
  566. }
  567. ASN1BERDecPeekTag(dd, &t);
  568. if (t == 0x80000002) {
  569. (val)->o[0] |= 0x20;
  570. if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
  571. return 0;
  572. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->responseToken))
  573. return 0;
  574. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  575. return 0;
  576. }
  577. ASN1BERDecPeekTag(dd, &t);
  578. if (t == 0x80000003) {
  579. (val)->o[0] |= 0x10;
  580. if (!ASN1BERDecExplicitTag(dd, 0x80000003, &dd0, &di0))
  581. return 0;
  582. if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechListMIC))
  583. return 0;
  584. if (!ASN1BERDecEndOfContents(dd, dd0, di0))
  585. return 0;
  586. }
  587. if (!ASN1BERDecEndOfContents(dec, dd, di))
  588. return 0;
  589. return 1;
  590. }
  591. static void ASN1CALL ASN1Free_NegTokenTarg(NegTokenTarg *val)
  592. {
  593. if (val) {
  594. if ((val)->o[0] & 0x40) {
  595. ASN1objectidentifier_free(&(val)->supportedMech);
  596. }
  597. if ((val)->o[0] & 0x20) {
  598. ASN1octetstring_free(&(val)->responseToken);
  599. }
  600. if ((val)->o[0] & 0x10) {
  601. ASN1octetstring_free(&(val)->mechListMIC);
  602. }
  603. }
  604. }
  605. static int ASN1CALL ASN1Enc_NegotiationToken(ASN1encoding_t enc, ASN1uint32_t tag, NegotiationToken *val)
  606. {
  607. ASN1uint32_t nLenOff0;
  608. switch ((val)->choice) {
  609. case 1:
  610. if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
  611. return 0;
  612. if (!ASN1Enc_NegTokenInit(enc, 0, &(val)->u.negTokenInit))
  613. return 0;
  614. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  615. return 0;
  616. break;
  617. case 2:
  618. if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
  619. return 0;
  620. if (!ASN1Enc_NegTokenTarg(enc, 0, &(val)->u.negTokenTarg))
  621. return 0;
  622. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  623. return 0;
  624. break;
  625. case 3:
  626. if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
  627. return 0;
  628. if (!ASN1Enc_NegTokenInit2(enc, 0, &(val)->u.negTokenInit2))
  629. return 0;
  630. if (!ASN1BEREncEndOfContents(enc, nLenOff0))
  631. return 0;
  632. break;
  633. }
  634. return 1;
  635. }
  636. static int ASN1CALL ASN1Dec_NegotiationToken(ASN1decoding_t dec, ASN1uint32_t tag, NegotiationToken *val)
  637. {
  638. ASN1uint32_t t;
  639. ASN1decoding_t dd0;
  640. ASN1octet_t *di0;
  641. if (!ASN1BERDecPeekTag(dec, &t))
  642. return 0;
  643. switch (t) {
  644. case 0x80000000:
  645. (val)->choice = 1;
  646. if (!ASN1BERDecExplicitTag(dec, 0x80000000, &dd0, &di0))
  647. return 0;
  648. if (!ASN1Dec_NegTokenInit(dd0, 0, &(val)->u.negTokenInit))
  649. return 0;
  650. if (!ASN1BERDecEndOfContents(dec, dd0, di0))
  651. return 0;
  652. break;
  653. case 0x80000001:
  654. (val)->choice = 2;
  655. if (!ASN1BERDecExplicitTag(dec, 0x80000001, &dd0, &di0))
  656. return 0;
  657. if (!ASN1Dec_NegTokenTarg(dd0, 0, &(val)->u.negTokenTarg))
  658. return 0;
  659. if (!ASN1BERDecEndOfContents(dec, dd0, di0))
  660. return 0;
  661. break;
  662. case 0x80000002:
  663. (val)->choice = 3;
  664. if (!ASN1BERDecExplicitTag(dec, 0x80000002, &dd0, &di0))
  665. return 0;
  666. if (!ASN1Dec_NegTokenInit2(dd0, 0, &(val)->u.negTokenInit2))
  667. return 0;
  668. if (!ASN1BERDecEndOfContents(dec, dd0, di0))
  669. return 0;
  670. break;
  671. default:
  672. ASN1DecSetError(dec, ASN1_ERR_CORRUPT);
  673. return 0;
  674. }
  675. return 1;
  676. }
  677. static void ASN1CALL ASN1Free_NegotiationToken(NegotiationToken *val)
  678. {
  679. if (val) {
  680. switch ((val)->choice) {
  681. case 1:
  682. ASN1Free_NegTokenInit(&(val)->u.negTokenInit);
  683. break;
  684. case 2:
  685. ASN1Free_NegTokenTarg(&(val)->u.negTokenTarg);
  686. break;
  687. case 3:
  688. ASN1Free_NegTokenInit2(&(val)->u.negTokenInit2);
  689. break;
  690. }
  691. }
  692. }
  693. static int ASN1CALL ASN1Enc_InitialNegToken(ASN1encoding_t enc, ASN1uint32_t tag, InitialNegToken *val)
  694. {
  695. ASN1uint32_t nLenOff;
  696. if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x40000000, &nLenOff))
  697. {
  698. return 0;
  699. }
  700. if (!ASN1BEREncObjectIdentifier(enc, 0x6, &(val)->spnegoMech))
  701. {
  702. return 0;
  703. }
  704. if (!ASN1Enc_NegotiationToken(enc, 0, &(val)->negToken))
  705. {
  706. return 0;
  707. }
  708. if (!ASN1BEREncEndOfContents(enc, nLenOff))
  709. {
  710. return 0;
  711. }
  712. return 1;
  713. }
  714. static int ASN1CALL ASN1Dec_InitialNegToken(ASN1decoding_t dec, ASN1uint32_t tag, InitialNegToken *val)
  715. {
  716. ASN1decoding_t dd;
  717. ASN1octet_t *di;
  718. if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x40000000, &dd, &di))
  719. {
  720. return 0;
  721. }
  722. if (!ASN1BERDecObjectIdentifier(dd, 0x6, &(val)->spnegoMech))
  723. {
  724. return 0;
  725. }
  726. if (!ASN1Dec_NegotiationToken(dd, 0, &(val)->negToken))
  727. {
  728. return 0;
  729. }
  730. if (!ASN1BERDecEndOfContents(dec, dd, di))
  731. {
  732. return 0;
  733. }
  734. return 1;
  735. }
  736. static void ASN1CALL ASN1Free_InitialNegToken(InitialNegToken *val)
  737. {
  738. if (val) {
  739. ASN1objectidentifier_free(&(val)->spnegoMech);
  740. ASN1Free_NegotiationToken(&(val)->negToken);
  741. }
  742. }