1

CERT_KEY_IDENTIFIER_PROP_IDX509 証明書の を計算して、(ステージング中に) Windows Mobile デバイスのレジストリにサイレントに追加したいと考えています。このサイトの時点では、次のように計算されます。

SEQ[SEQ[rsa], key]

だと思いますkeycert.GetPublicKey()、ここで何を意味してrsaいますか (私が推測するアルゴリズムではありません)?

Web を 3 時間検索していますが、誰かが私を正しい方向に向けてくれたらとてもうれしいです。

4

1 に答える 1

3

レジストリ キーに書き込む必要があるプロパティを読み取るために、最終的に次の CryptoAPI メソッドを使用しました。

[DllImport("crypt32.dll", SetLastError = true)]
private static extern IntPtr CertCreateCertificateContext(int dwCertEncodingType, byte[] pbCertEncoded, int cbCertEncoded);

[DllImport("crypt32.dll", SetLastError = true)]
private static extern bool CertFreeCertificateContext(IntPtr pCertContext);

[DllImport("crypt32.dll", SetLastError = true)]
private static extern bool CertGetCertificateContextProperty(IntPtr pCertContext, int dwPropId, IntPtr pvData, ref int pcbData);

private byte[] GetKeyIdentifier(X509Certificate certificate)
{
  var data = certificate.GetRawCertData();

  var context = CertCreateCertificateContext(1, data, data.Length);

  try
  {
    return ReadProperty(context, 0x14);
  }
  finally
  {
    CertFreeCertificateContext(context);
  }
}

private byte[] ReadProperty(IntPtr context, int property)
{
  var length = 0;

  // determine the ammount of memory to allocate for the data
  if (CertGetCertificateContextProperty(context, property, IntPtr.Zero, ref length))
  {
    var pointer = Marshal.AllocCoTaskMem(length);

    try
    {
      // query the property which is written to the allocated memory
      if (CertGetCertificateContextProperty(context, property, pointer, ref length) == false)
      {
        throw new InvalidOperationException(string.Format("Failed to query property {0}.", property));
      }

      // extract the data from the unmanaged memory
      var buffer = new byte[length];
      Marshal.Copy(pointer, buffer, 0, length);

      return buffer;
    }
    finally
    {
      Marshal.FreeCoTaskMem(pointer);
    }
  }
  else
  {
    throw new InvalidOperationException(string.Format("Failed to query property {0}.", property));
  }
}
于 2013-08-07T11:52:27.480 に答える