Как я могу реализовать функцию CryptSignMessage из Crypt32.dll в node.js? - PullRequest
0 голосов
/ 22 октября 2019

Клиент попросил меня использовать функцию 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 и, если это невозможно, какие рекомендации вы мне дадите, чтобы рассказать клиенту об использовании языка.

Спасибо!

...