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.
172 lines
4.1 KiB
172 lines
4.1 KiB
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996
|
|
//
|
|
// File: tdotoid.cpp
|
|
//
|
|
// Contents: Convert Dot OID ("1.2.3") to ASN.1 encoded content octets.
|
|
//
|
|
// See Usage() for list of test options.
|
|
//
|
|
//
|
|
// Functions: main
|
|
//
|
|
// History: 04-Jan-01 philh created
|
|
//--------------------------------------------------------------------------
|
|
#include <windows.h>
|
|
#include <assert.h>
|
|
|
|
#include "wincrypt.h"
|
|
#include "certtest.h"
|
|
#include "unicode.h"
|
|
#include "asn1util.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <memory.h>
|
|
#include <time.h>
|
|
|
|
const BYTE rgbSeqTag[] = {ASN1UTIL_TAG_SEQ, 0};
|
|
const BYTE rgbOIDTag[] = {ASN1UTIL_TAG_OID, 0};
|
|
|
|
const ASN1UTIL_EXTRACT_VALUE_PARA rgExtractAttrPara[] = {
|
|
// 0 - Attribute ::= SEQUENCE {
|
|
ASN1UTIL_STEP_INTO_VALUE_OP, rgbSeqTag,
|
|
// 1 - type EncodedObjectID,
|
|
ASN1UTIL_RETURN_CONTENT_BLOB_FLAG |
|
|
ASN1UTIL_STEP_OVER_VALUE_OP, rgbOIDTag,
|
|
};
|
|
|
|
#define ATTR_OID_VALUE_INDEX 1
|
|
#define ATTR_VALUE_COUNT \
|
|
(sizeof(rgExtractAttrPara) / sizeof(rgExtractAttrPara[0]))
|
|
|
|
BOOL fDecode = FALSE;
|
|
|
|
void DotValToEncodedOid(
|
|
LPCSTR pszDotVal
|
|
)
|
|
{
|
|
CRYPT_ATTRIBUTE Attr;
|
|
BYTE rgbEncoded[512];
|
|
DWORD cbEncoded;
|
|
CRYPT_DER_BLOB rgValueBlob[ATTR_VALUE_COUNT];
|
|
DWORD cValue;
|
|
DWORD i;
|
|
BYTE *pb;
|
|
DWORD cb;
|
|
|
|
// Encode an Attribute that only has the OID.
|
|
Attr.pszObjId = (LPSTR) pszDotVal;
|
|
Attr.cValue = 0;
|
|
Attr.rgValue = NULL;
|
|
|
|
cbEncoded = sizeof(rgbEncoded);
|
|
if (!CryptEncodeObject(
|
|
X509_ASN_ENCODING,
|
|
PKCS_ATTRIBUTE,
|
|
&Attr,
|
|
rgbEncoded,
|
|
&cbEncoded
|
|
)) {
|
|
printf("\n");
|
|
printf("Asn1Encode(%s)", pszDotVal);
|
|
PrintLastError("");
|
|
return;
|
|
}
|
|
|
|
cValue = ATTR_VALUE_COUNT;
|
|
if (0 >= Asn1UtilExtractValues(
|
|
rgbEncoded,
|
|
cbEncoded,
|
|
0, // dwFlags
|
|
&cValue,
|
|
rgExtractAttrPara,
|
|
rgValueBlob
|
|
) || ATTR_OID_VALUE_INDEX >= cValue) {
|
|
printf("\n");
|
|
printf("ExtractValues(%s)", pszDotVal);
|
|
PrintLastError("");
|
|
return;
|
|
}
|
|
|
|
pb = rgValueBlob[ATTR_OID_VALUE_INDEX].pbData;
|
|
cb = rgValueBlob[ATTR_OID_VALUE_INDEX].cbData;
|
|
|
|
printf("\n// \"%s\"\n{", pszDotVal);
|
|
for (i = 0; i < cb; i++) {
|
|
printf("0x%02X", pb[i]);
|
|
if ((i+1) < cb)
|
|
printf(", ");
|
|
}
|
|
printf("};\n\n");
|
|
|
|
if (fDecode) {
|
|
PCRYPT_ATTRIBUTE pDecodedAttr = NULL;
|
|
DWORD cbDecodedAttr;
|
|
|
|
if (!CryptDecodeObject(
|
|
X509_ASN_ENCODING,
|
|
PKCS_ATTRIBUTE,
|
|
rgbEncoded,
|
|
cbEncoded,
|
|
CRYPT_DECODE_ALLOC_FLAG,
|
|
(void *) &pDecodedAttr,
|
|
&cbDecodedAttr
|
|
))
|
|
PrintLastError("CryptDecodeObject");
|
|
else {
|
|
printf("Decoded OID:: %s\n", pDecodedAttr->pszObjId);
|
|
LocalFree(pDecodedAttr);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Usage(void)
|
|
{
|
|
int i;
|
|
|
|
printf("Usage: tdotoid <OID String 1> <OID String 2> ...\n");
|
|
printf("Options are:\n");
|
|
printf(" -d - Decode after encoding\n");
|
|
printf(" -h - This message\n");
|
|
printf("\n");
|
|
}
|
|
|
|
|
|
int _cdecl main(int argc, char * argv[])
|
|
{
|
|
|
|
int ReturnStatus;
|
|
|
|
while (--argc>0)
|
|
{
|
|
if (**++argv == '-')
|
|
{
|
|
switch(argv[0][1])
|
|
{
|
|
case 'd':
|
|
fDecode = TRUE;
|
|
break;
|
|
case 'h':
|
|
default:
|
|
goto BadUsage;
|
|
}
|
|
} else
|
|
DotValToEncodedOid(argv[0]);
|
|
}
|
|
|
|
ReturnStatus = 0;
|
|
CommonReturn:
|
|
return ReturnStatus;
|
|
|
|
BadUsage:
|
|
Usage();
|
|
ReturnStatus = -1;
|
|
goto CommonReturn;
|
|
}
|