procedure
TForm1
.
Button3Click(Sender: TObject);
var
nameAttr: CERT_RDN_ATTR;
nameString:
PChar
;
rdn: CERT_RDN;
nameInfo: CERT_NAME_INFO;
certReqInfo: CERT_REQUEST_INFO;
subjNameBlob: CERT_NAME_BLOB;
encNameLen: DWORD;
encName: PBYTE;
prov: HCRYPTPROV;
pubKeyInfoLen: DWORD;
pubKeyInfo: PCERT_PUBLIC_KEY_INFO;
encCertReqLen: DWORD;
params: CRYPT_OBJID_BLOB;
sigAlg: CRYPT_ALGORITHM_IDENTIFIER;
signedEncCertReq: PBYTE;
cont:
PChar
;
err:
string
;
encType: DWORD;
f:
file
;
begin
nameString := StrAlloc(length(LabeledEdit1
.
Text) +
1
);
StrPCopy(nameString, LabeledEdit1
.
Text);
nameAttr
.
pszObjId :=
'2.5.4.3'
;
nameAttr
.
dwValueType := CERT_RDN_UTF8_STRING;
nameAttr
.
Value
.
cbData := length(LabeledEdit1
.
Text);
nameAttr
.
Value
.
pbData := PBYTE(nameString);
rdn
.
cRDNAttr :=
1
;
rdn
.
rgRDNAttr := @nameAttr;
nameInfo
.
cRDN :=
1
;
nameInfo
.
rgRDN := @rdn;
if
not
CryptEncodeObject(encType, X509_NAME, @nameInfo,
nil
, encNameLen)
or
(encNameLen <
1
)
then
begin
MessageDlg(
'CryptEncodeObject ошибка '
+ inttostr(GetLastError), mtError, [mbOk],
0
);
StrDispose(nameString);
exit;
end
;
GetMem(encName, encNameLen);
if
not
CryptEncodeObject(PKCS_7_ASN_ENCODING
or
X509_ASN_ENCODING, X509_NAME, @nameInfo, encName, encNameLen)
or
(encNameLen <
1
)
then
begin
MessageDlg(
'2nd CryptEncodeObject ошибка '
+ inttostr(GetLastError), mtError, [mbOk],
0
);
StrDispose(nameString);
FreeMem(encName, encNameLen);
exit;
end
;
subjNameBlob
.
cbData := encNameLen;
subjNameBlob
.
pbData := encName;
certReqInfo
.
Subject := subjNameBlob;
certReqInfo
.
cAttribute :=
0
;
certReqInfo
.
rgAttribute :=
nil
;
certReqInfo
.
dwVersion := CERT_REQUEST_V1;
if
length(LabeledEdit10
.
Text) =
0
then
cont :=
nil
else
begin
err := LabeledEdit10
.
Text;
cont := StrAlloc(length(err) +
1
);
StrPCopy(cont, err);
end
;
if
not
CryptAcquireContext(prov, cont,
nil
, PROV_RSA_FULL,
0
)
then
begin
case
int64
(GetLastError)
of
ERROR_INVALID_PARAMETER:
err :=
'ERROR_INVALID_PARAMETER'
;
ERROR_NOT_ENOUGH_MEMORY:
err :=
'ERROR_NOT_ENOUGH_MEMORY'
;
NTE_BAD_FLAGS:
err :=
'NTE_BAD_FLAGS'
;
NTE_BAD_KEYSET:
err :=
'NTE_BAD_KEYSET'
;
NTE_BAD_KEYSET_PARAM:
err :=
'NTE_BAD_KEYSET_PARAM'
;
NTE_BAD_PROV_TYPE:
err :=
'NTE_BAD_PROV_TYPE'
;
NTE_BAD_SIGNATURE:
err :=
'NTE_BAD_SIGNATURE'
;
NTE_EXISTS:
err :=
'NTE_EXISTS'
;
NTE_KEYSET_ENTRY_BAD:
err :=
'NTE_KEYSET_ENTRY_BAD'
;
NTE_KEYSET_NOT_DEF:
err :=
'NTE_KEYSET_NOT_DEF'
;
NTE_NO_MEMORY:
err :=
'NTE_NO_MEMORY'
;
NTE_PROV_DLL_NOT_FOUND:
err :=
'NTE_PROV_DLL_NOT_FOUND'
;
NTE_PROV_TYPE_ENTRY_BAD:
err :=
'NTE_PROV_TYPE_ENTRY_BAD'
;
NTE_PROV_TYPE_NO_MATCH:
err :=
'NTE_PROV_TYPE_NO_MATCH'
;
NTE_PROV_TYPE_NOT_DEF:
err :=
'NTE_PROV_TYPE_NOT_DEF'
;
NTE_PROVIDER_DLL_FAIL:
err :=
'NTE_PROVIDER_DLL_FAIL'
;
NTE_SIGNATURE_FILE_BAD:
err :=
'NTE_SIGNATURE_FILE_BAD'
;
else
err :=
'Неизвестная ошибка'
;
end
;
MessageDlg(
'Ошибка создания контейнера: '
+ err, mtError, [mbOk],
0
);
StrDispose(nameString);
FreeMem(encName, encNameLen);
if
cont <>
nil
then
StrDispose(cont);
exit;
...