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.

165 lines
4.3 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1996 - 1999
  6. //
  7. // File: meminfo.cpp
  8. //
  9. // Contents: Microsoft Internet Security Catalog Utilities
  10. //
  11. // Functions: CatalogDecodeMemberInfo
  12. // CatalogReallyDecodeMemberInfo
  13. // CatalogEncodeMemberInfo
  14. //
  15. // History: 16-May-1997 pberkman created
  16. // 01-Oct-1997 pberkman add lazy decode
  17. //
  18. //--------------------------------------------------------------------------
  19. #include "global.hxx"
  20. #include "mscat32.h"
  21. BOOL CatalogDecodeMemberInfo(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember, CRYPT_ATTRIBUTE *pAttr)
  22. {
  23. DELETE_OBJECT(pMember->sEncodedMemberInfo.pbData);
  24. if (pAttr->rgValue->cbData < 1)
  25. {
  26. return(FALSE);
  27. }
  28. if (!(pMember->sEncodedMemberInfo.pbData = (BYTE *)CatalogNew(pAttr->rgValue->cbData)))
  29. {
  30. pMember->sEncodedMemberInfo.cbData = 0;
  31. return(FALSE);
  32. }
  33. pMember->sEncodedMemberInfo.cbData = pAttr->rgValue->cbData;
  34. memcpy(pMember->sEncodedMemberInfo.pbData, pAttr->rgValue->pbData, pAttr->rgValue->cbData);
  35. return(TRUE);
  36. }
  37. BOOL CatalogReallyDecodeMemberInfo(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember, CRYPT_ATTR_BLOB *pAttr)
  38. {
  39. DWORD cbDecode;
  40. CAT_MEMBERINFO *pCatMemberInfo;
  41. cbDecode = 0;
  42. CryptDecodeObject(pCat->dwEncodingType,
  43. CAT_MEMBERINFO_STRUCT,
  44. pAttr->pbData,
  45. pAttr->cbData,
  46. 0,
  47. NULL,
  48. &cbDecode);
  49. if (cbDecode > 0)
  50. {
  51. if (!(pCatMemberInfo = (CAT_MEMBERINFO *)CatalogNew(cbDecode)))
  52. {
  53. return(FALSE);
  54. }
  55. if (!(CryptDecodeObject(pCat->dwEncodingType,
  56. CAT_MEMBERINFO_STRUCT,
  57. pAttr->pbData,
  58. pAttr->cbData,
  59. 0,
  60. pCatMemberInfo,
  61. &cbDecode)))
  62. {
  63. delete pCatMemberInfo;
  64. return(FALSE);
  65. }
  66. if (pCatMemberInfo->pwszSubjGuid)
  67. {
  68. if (!(wstr2guid(pCatMemberInfo->pwszSubjGuid, &pMember->gSubjectType)))
  69. {
  70. delete pCatMemberInfo;
  71. return(FALSE);
  72. }
  73. pMember->dwCertVersion = pCatMemberInfo->dwCertVersion;
  74. delete pCatMemberInfo;
  75. return(TRUE);
  76. }
  77. delete pCatMemberInfo;
  78. }
  79. return(FALSE);
  80. }
  81. BOOL CatalogEncodeMemberInfo(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember,
  82. PCRYPT_ATTRIBUTE pCryptAttr)
  83. {
  84. if (!(pCryptAttr->rgValue = (PCRYPT_ATTR_BLOB)CatalogNew(sizeof(CRYPT_ATTR_BLOB))))
  85. {
  86. return(FALSE);
  87. }
  88. pCryptAttr->cValue = 1;
  89. memset(pCryptAttr->rgValue, 0x00, sizeof(CRYPT_ATTR_BLOB));
  90. pCryptAttr->pszObjId = CAT_MEMBERINFO_OBJID;
  91. DWORD cbEncoded;
  92. CAT_MEMBERINFO sCatMemberInfo;
  93. WCHAR wszGuid[41];
  94. sCatMemberInfo.pwszSubjGuid = &wszGuid[0];
  95. if (!(guid2wstr(&pMember->gSubjectType, sCatMemberInfo.pwszSubjGuid)))
  96. {
  97. assert(0);
  98. DELETE_OBJECT(pCryptAttr->rgValue);
  99. return(FALSE);
  100. }
  101. sCatMemberInfo.dwCertVersion = pMember->dwCertVersion;
  102. cbEncoded = 0;
  103. CryptEncodeObject(pCat->dwEncodingType,
  104. pCryptAttr->pszObjId,
  105. &sCatMemberInfo,
  106. NULL,
  107. &cbEncoded);
  108. if (cbEncoded > 0)
  109. {
  110. if (!(pCryptAttr->rgValue->pbData = (BYTE *)CatalogNew(cbEncoded)))
  111. {
  112. return(FALSE);
  113. }
  114. pCryptAttr->rgValue->cbData = cbEncoded;
  115. if (!(CryptEncodeObject(pCat->dwEncodingType,
  116. pCryptAttr->pszObjId,
  117. &sCatMemberInfo,
  118. pCryptAttr->rgValue->pbData,
  119. &cbEncoded)))
  120. {
  121. return(FALSE);
  122. }
  123. return(TRUE);
  124. }
  125. return(FALSE);
  126. }