Клиент попросил меня использовать функцию CryptSignMessage из библиотеки Crypt32.dll в nodejs. Я попробовал код, но мне не повезло. Я много занимался серфингом и не мог видеть ценную информацию, чтобы получить меня на дороге. Я исследовал stackoverflow и не видел этого вопроса, поэтому думаю, что, возможно, эксперт по C ++ или Crypto api может мне помочь.
Я использую библиотеку 'ffi' (https://github.com/node-ffi/node-ffi) иЯ успешно запустил фиктивные функции из скомпилированного кода C, и я также мог выполнить другие функции из этой библиотеки (например, CryptUnprotectData и CryptProtectData), но, как я уже сказал, я не могу заставить CryptSignMessage работать правильно.
Этокод, который у меня есть. Я собираюсь вставить все это (это не так много), чтобы прояснить вам эту проблему.
const ref = require("ref");
const ffi = require("ffi");
const Struct = require("ref-struct");
const ArrayType = require('ref-array');
const PKCS_7_ASN_ENCODING = 0x00010000;
const X509_ASN_ENCODING = 0x00000001;
const szOID_OIWSEC_sha1 = "1.3.14.3.2.26";
// const CRYPTOAPI_BLOB = Struct({
// cbData: ref.types.int32,
// pbData: ref.types.int,
// })
const CRYPT_ALGORITHM_IDENTIFIER = Struct({
pszObjId: ref.types.CString,
Parameters: ref.types.int //new ref.refType(CRYPTOAPI_BLOB)
})
const CRYPT_SIGN_MESSAGE_PARA = Struct({
cbSize: ref.types.int32,
dwMsgEncodingType: ref.types.int32,
pSigningCert: ref.types.int,
HashAlgorithm: new ref.refType(CRYPT_ALGORITHM_IDENTIFIER),
pvHashAuxInfo: ref.types.int,
cMsgCert: ref.types.int32,
rgpMsgCert: ref.types.int,
cMsgCrl: ref.types.int32,
rgpMsgCrl: ref.types.int,
cAuthAttr: ref.types.int32,
rgAuthAttr: ref.types.int,
cUnauthAttr: ref.types.int32,
rgUnauthAttr: ref.types.int,
dwFlags: ref.types.int32,
dwInnerContentType: ref.types.int32
})
const SIGN_STRUCTURE = new ref.refType(CRYPT_SIGN_MESSAGE_PARA);
const Crypto = new ffi.Library('Crypt32', {
"CryptSignMessage" : ['bool', [SIGN_STRUCTURE, 'bool', 'int', ArrayType(ref.types.int), ArrayType(ref.types.int32), ref.types.int, ref.types.long]],
});
const signData = new CRYPT_SIGN_MESSAGE_PARA()
signData.cbSize = Object.keys(signData).length;
signData.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
signData.pSigningCert = 0; // possible struct
signData.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;
signData.HashAlgorithm.Parameters = 0;
signData.pvHashAuxInfo = 0;
signData.cMsgCert = 1;
signData.rgpMsgCert = ref.NULL;
signData.cMsgCrl = 0;
signData.rgpMsgCrl = ref.NULL_POINTER;
signData.cAuthAttr = 0;
signData.rgAuthAttr = 0;
signData.cUnauthAttr = 0;
signData.rgUnauthAttr = ref.NULL_POINTER;
signData.dwFlags = 0;
signData.dwInnerContentType = 0;
const messageArray = ['a message'];
const messageArraySize = messageArray.length;
const cbSignedMessageBlob = 0;
const result = Crypto.CryptSignMessage(signData.ref(), false, 1, messageArray, messageArraySize, 0, cbSignedMessageBlob)
console.log(result)
Я запускаю это с узлом, и я не получаю ошибку, но я знаю,что он не реализуется должным образом и что мне нужно больше информации о том, как сделать это правильно
Я хочу, чтобы кто-нибудь мог подробно рассказать мне, какой правильный путь я должен предпринять для реализации такой функции в nodejs и, если это невозможно, какие рекомендации вы мне дадите, чтобы рассказать клиенту об использовании языка.
Спасибо!