HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1220
そらTwitterへ投稿できない(SHAハッシュの作成に失敗する)4解決


そら

リンク

2021/12/20(Mon) 19:56:14|NO.94732

TsubuyakiSoupを用いてTwitterへの投稿を行いたいのですが、
sigEncode内のgetHmacSha1でエラー(return 0)が返ってきます。
getHmacSha1のソースコードは以下の通りです。

#defcfunc getHmacSha1 str _p1, str _p2 ghc_p1 = _p1 ghc_p2 = _p2 hProv = 0 hKey = 0 hHash = 0 ghc_dataLength = 0 sdim hmacInfo,14 lpoke hmacInfo, 0, CALG_SHA1 ghc_p2Length = strlen(ghc_p2) dim keyBlob, 3+(ghc_p2Length/4)+1 poke keyBlob, 0, PLAINTEXTKEYBLOB poke keyBlob, 1, CUR_BLOB_VERSION wpoke keyBlob, 2, 0 lpoke keyBlob, 4, CALG_RC2 lpoke keyBlob, 8, ghc_p2Length memcpy keyBlob, ghc_p2, ghc_p2Length, 12, 0 //コンテキストの取得 if ( 1!_CryptAcquireContext(hProv, 0, 0, PROV_RSA_FULL, 0) ) { return 0 } //キーのインポート if ( 1!_CryptImportKey(hProv, keyBlob, (12+ghc_p2Length), 0, CRYPT_IPSEC_HMAC_KEY, hKey) ) { return 0 } //ハッシュ初期化 if ( 1!_CryptCreateHash(hProv, CALG_HMAC, hKey, 0, hHash) ) { return 0 } //ハッシュパラメータの設定 if ( 1!_CryptSetHashParam(hHash, HP_HMAC_INFO, hmacInfo, 0) ) { return 0 } //ハッシュに書き込み if ( 1!_CryptHashData(hHash, ghc_p1, strlen(ghc_p1), 0) ) { return 0 } //ハッシュ取得 if ( 1!_CryptGetHashParam(hHash, HP_HASHVAL, 0, ghc_dataLength, 0) ) { return 0 } sdim ghc_dest, ghc_dataLength if ( _CryptGetHashParam(hHash, HP_HASHVAL, varptr(ghc_dest), ghc_dataLength, 0) ) { } //ハッシュハンドルの破棄 _CryptDestroyHash hHash //キーハンドルの破棄 _CryptDestroyKey hKey //ハンドルの破棄 _CryptReleaseContext hProv, 0 return ghc_dest
//コンテキストの取得でエラーが起きているようです。
現状、メインPCでは正常に投稿できるのですが、サブPCだとエラーが発生します。
メインPCとサブPCはwindows11です。(windows10のサブPCでも同様のエラーを確認しています)

再現できる最小限のコードが以下の通りです。

#uselib "advapi32.dll" #cfunc _CryptAcquireContext "CryptAcquireContextA" var, sptr, sptr, int, int #define PROV_RSA_FULL 1 hProv = 0 mes _CryptAcquireContext(hProv, 0, 0, PROV_RSA_FULL, 0)
正常であれば1が返るはずはずなのですが、サブPCだと0が返っていきます。
解決策をご存じの方が居ましたら、教えていただけると幸いです。



この記事に返信する


MillkeyStars

リンク

2021/12/21(Tue) 08:55:20|NO.94734

CryptAcquireContextA の第二引数を NULL(0) に設定する場合、第五引数を CRYPT_VERIFYCONTEXT(0xF0000000) に設定する必要があります。



猪野

リンク

2021/12/21(Tue) 11:31:56|NO.94736

関数が失敗した時は失敗した理由を知ることができるので、
まずはそちらを確認してみるのがよいかと思います。

#ifndef showLastError #ifndef __KERNEL32__ #include "kernel32.as" #endif #module #const FORMAT_MESSAGE_ALLOCATE_BUFFER $100 #const FORMAT_MESSAGE_FROM_SYSTEM $1000 #const FORMAT_MESSAGE_IGNORE_INSERTS $200 #define ctype MAKELANGID(%1,%2) (%2<<10|%1) #const LANG_NEUTRAL $0 #const SUBLANG_DEFAULT $1 #deffunc showLastError local _errCode,local _lpBuffer,local _errMsg _errCode=GetLastError() FormatMessage FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,_errCode,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),varptr(_lpBuffer),0,0 dupptr _errMsg,_lpBuffer,stat+1,2 dialog strf("#Error %d\n%s",_errCode,_errMsg),1,"Error" LocalFree _lpBuffer return #global #endif #include "advapi32.as" #const PROV_RSA_FULL 1 hProv=0 logmes CryptAcquireContext(varptr(hProv),0,0,PROV_RSA_FULL,0) showLastError end
ちなみに、こちらはWin10ですが戻り値1で成功します。



そら

リンク

2021/12/21(Tue) 12:02:36|NO.94737

ありがとうございます!解決しました!

#uselib "advapi32.dll" #cfunc _CryptAcquireContext "CryptAcquireContextA" var, sptr, sptr, int, int #define PROV_RSA_FULL 1 #define CRYPT_VERIFYCONTEXT 0xF0000000 hProv = 0 mes _CryptAcquireContext(hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)



そら

リンク

2021/12/21(Tue) 12:07:33|NO.94738

>>関数が失敗した時は失敗した理由を知ることができる
こういうデバッグ方法もあるんですね。
どういう原因なのかが全くわからなかったので助かります。
エラーが発生するPCでCRYPT_VERIFYCONTEXTを指定せずに試したところ、以下のエラーが発生しました。

--------------------------- Error --------------------------- #Error -2146893802 キー セットがありません。
環境によってはエラーが出ないっていうのが厄介ですね。
みなさんのおかげで解決策と詳しい原因を知ることができました。
ありがとうございました!



ONION software Copyright 1997-2021(c) All rights reserved.