forked from gentilkiwi/mimikatz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkull_m_asn1.c
122 lines (111 loc) · 3.1 KB
/
kull_m_asn1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* Benjamin DELPY `gentilkiwi`
https://blog.gentilkiwi.com
Licence : https://creativecommons.org/licenses/by/4.0/
*/
#include "kull_m_asn1.h"
ASN1module_t hASN1Module = NULL;
ASN1encoding_t ASN1enc = NULL;
ASN1decoding_t ASN1dec = NULL;
void kull_m_asn1_BitStringFromULONG(BerElement * pBer, ULONG data)
{
BYTE flagBuffer[5] = {0};
*(PDWORD) (flagBuffer + 1) = _byteswap_ulong(data);
ber_printf(pBer, "X", flagBuffer, sizeof(flagBuffer));
}
void kull_m_asn1_GenTime(BerElement * pBer, PFILETIME localtime)
{
SYSTEMTIME st;
char buffer[4 + 2 + 2 + 2 + 2 + 2 + 1 + 1];
if(FileTimeToSystemTime(localtime, &st))
if(sprintf_s(buffer, sizeof(buffer), "%04hu%02hu%02hu%02hu%02hu%02huZ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond) > 0)
ber_printf(pBer, "to", DIRTY_ASN1_ID_GENERALIZED_TIME, buffer, sizeof(buffer) - 1);
}
void kull_m_asn1_GenString(BerElement * pBer, PCUNICODE_STRING String)
{
ANSI_STRING aString;
if(NT_SUCCESS(RtlUnicodeStringToAnsiString(&aString, String, TRUE)))
{
ber_printf(pBer, "to", DIRTY_ASN1_ID_GENERAL_STRING, aString.Buffer, aString.Length);
RtlFreeAnsiString(&aString);
}
}
static const ASN1GenericFun_t kull_m_asn1_encdecfreefntab[] = {NULL};
static const ASN1uint32_t kull_m_asn1_sizetab[] = {0};
BOOL kull_m_asn1_init()
{
BOOL status = FALSE;
int ret;
if(hASN1Module = ASN1_CreateModule(ASN1_THIS_VERSION, ASN1_BER_RULE_DER, ASN1FLAGS_NOASSERT, 1, kull_m_asn1_encdecfreefntab, kull_m_asn1_encdecfreefntab, (const ASN1FreeFun_t *) kull_m_asn1_encdecfreefntab, kull_m_asn1_sizetab, 'iwik'))
{
ret = ASN1_CreateEncoder(hASN1Module, &ASN1enc, NULL, 0, NULL);
if(ASN1_FAILED(ret))
{
PRINT_ERROR(L"ASN1_CreateEncoder: %i\n", ret);
ASN1enc = NULL;
}
else
{
ret = ASN1_CreateDecoder(hASN1Module, &ASN1dec, NULL, 0, NULL);
if(ASN1_FAILED(ret))
{
PRINT_ERROR(L"ASN1_CreateDecoder: %i\n", ret);
ASN1dec = NULL;
}
}
}
else PRINT_ERROR(L"ASN1_CreateModule\n");
status = hASN1Module && ASN1enc && ASN1dec;
if(!status)
kull_m_asn1_term();
return status;
}
void kull_m_asn1_term()
{
if(ASN1dec)
{
ASN1_CloseDecoder(ASN1dec);
ASN1dec = NULL;
}
if(ASN1enc)
{
ASN1_CloseEncoder(ASN1enc);
ASN1enc = NULL;
}
if(hASN1Module)
{
ASN1_CloseModule(hASN1Module);
hASN1Module = NULL;
}
}
BOOL kull_m_asn1_DotVal2Eoid(__in const ASN1char_t *dotOID, __out OssEncodedOID *encodedOID)
{
BOOL status = FALSE;
if(ASN1enc && dotOID && encodedOID)
{
encodedOID->length = 0;
encodedOID->value = NULL;
status = ASN1BERDotVal2Eoid(ASN1enc, dotOID, encodedOID);
}
return status;
}
void kull_m_asn1_freeEnc(void *pBuf)
{
if(ASN1enc && pBuf)
ASN1_FreeEncoded(ASN1enc, pBuf);
}
BOOL kull_m_asn1_Eoid2DotVal(__in const OssEncodedOID *encodedOID, __out ASN1char_t **dotOID)
{
BOOL status = FALSE;
if(ASN1dec && encodedOID && dotOID)
{
*dotOID = NULL;
status = ASN1BEREoid2DotVal(ASN1dec, encodedOID, dotOID);
}
return status;
}
void kull_m_asn1_freeDec(void *pBuf)
{
if(pBuf)
ASN1Free(pBuf);
}