TsubuyakiSoup.as 認証できない不具合修正 その2

CSPのデフォルトのキーコンテナが存在しない場合は、TsubuyakiSoupのHMAC_SHA1()が失敗してしまい、結果的にツイッターの認証ができない状態になるので直してみた。CryptAcquireContext()が失敗したら、CRYPT_NEWKEYSETしてるだけです。 関連→ 認証できない不具合修正&API 1.1 対応化 http://codetter.com/?p=910

CSPのデフォルトのキーコンテナが存在しない場合は、TsubuyakiSoupのHMAC_SHA1()が失敗してしまい、結果的にツイッターの認証ができない状態になるので直してみた。CryptAcquireContext()が失敗したら、CRYPT_NEWKEYSETしてるだけです。 関連→ 認証できない不具合修正&API 1.1 対応化 http://codetter.com/?p=910

  • hk1v
  • 2013/8/23 15:57
#defcfunc HMAC_SHA1 str p1, str p2
	HS_p1 = p1
	HS_p2 = p2
	HS_SigLen = 0
	HS_dest = ""
	//ハッシュ
	HS_hProv = 0
	HS_hKey = 0
	HS_hHash = 0
	sdim HS_HmacInfo,14
	lpoke HS_HmacInfo, 0, 0x00008004
	;keyの生成
	dim HS_keyBlob,350
	poke HS_keyBlob,0,0x8					;bType
	poke HS_keyBlob,1,2						;bVersion
	lpoke HS_keyBlob,2,0					;reserved
	HS_keyBlob(1) = 0x00006602				;aiKeyAlg
	HS_keyBlob(2) = strlen(HS_p2)	;len
	memcpy HS_keyBlob, HS_p2, HS_keyBlob(2), 12, 0
	//コンテキストの取得
	res = _CryptAcquireContext(HS_hProv, 0, 0, 1, 0)
	if ( res == 0 ){
		// ない場合は新しく作る
		res = _CryptAcquireContext(HS_hProv, 0, 0, 1, 8/*CRYPT_NEWKEYSET*/)
	}
	if ( res ) {
		//キーのインポート
		if ( _CryptImportKey(HS_hProv, HS_keyBlob, (12+HS_keyBlob(2)), 0, 0x00000100, HS_hKey) ) {
			//ハッシュ初期化
			if ( _CryptCreateHash(HS_hProv, 0x00008009, HS_hKey, 0, HS_hHash) ) {
				//ハッシュパラメータの設定
				if ( _CryptSetHashParam(HS_hHash, 0x0005, HS_HmacInfo, 0) ) {
					//ハッシュに書き込み
					if ( _CryptHashData(HS_hHash, HS_p1, strlen(HS_p1), 0) ) {
						//ハッシュ取得
						if ( _CryptGetHashParam(HS_hHash, 0x0002, 0, HS_size, 0) ) {
							sdim HS_dest, HS_size
							if ( _CryptGetHashParam(HS_hHash, 0x0002, varptr(HS_dest), HS_size, 0) ) {
							}
						}
					}
				}
				//ハッシュハンドルの破棄
				_CryptDestroyHash HS_hHash
			}
			//キーハンドルの破棄
			_CryptDestroyKey HS_hKey
		}
		//ハンドルの破棄
		_CryptReleaseContext HS_hProv, 0
	}
return HS_dest