Skip to content

Commit

Permalink
Refactor python3 parsing and begin documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
devfabiosilva committed Feb 6, 2025
1 parent 2aca1e0 commit d871081
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 39 deletions.
24 changes: 20 additions & 4 deletions docs/d0/dd4/cauth2_8h.html
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
<tr class="separator:afd6ab167d21e3d73ce2e3e66d499b129"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a705bb46fa4bd71a93d574a46a4eafe47"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../d0/dd4/cauth2_8h.html#a705bb46fa4bd71a93d574a46a4eafe47">ENTROPY_TYPE_NOT_RECOMENDED</a>&#160;&#160;&#160;(uint32_t)1470003345</td></tr>
<tr class="separator:a705bb46fa4bd71a93d574a46a4eafe47"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a29619c288a393a630da20ca14c4add42"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../d0/dd4/cauth2_8h.html#a29619c288a393a630da20ca14c4add42">DEFAULT_TIMEOUT_IN_SECOND</a>&#160;&#160;&#160;60</td></tr>
<tr class="memitem:a29619c288a393a630da20ca14c4add42"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="../../d0/dd4/cauth2_8h.html#a29619c288a393a630da20ca14c4add42">DEFAULT_TIMEOUT_IN_SECOND</a>&#160;&#160;&#160;120</td></tr>
<tr class="separator:a29619c288a393a630da20ca14c4add42"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
Expand Down Expand Up @@ -273,12 +273,14 @@ <h2 class="memtitle"><span class="permalink"><a href="#a29619c288a393a630da20ca1
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define DEFAULT_TIMEOUT_IN_SECOND&#160;&#160;&#160;60</td>
<td class="memname">#define DEFAULT_TIMEOUT_IN_SECOND&#160;&#160;&#160;120</td>
</tr>
</table>
</div><div class="memdoc">

<p class="definition">Definition at line <a class="el" href="../../d0/dd4/cauth2_8h_source.html#l00525">525</a> of file <a class="el" href="../../d0/dd4/cauth2_8h_source.html">cauth2.h</a>.</p>
<p>Default timeout for generating random keys. </p>

<p class="definition">Definition at line <a class="el" href="../../d0/dd4/cauth2_8h_source.html#l00529">529</a> of file <a class="el" href="../../d0/dd4/cauth2_8h_source.html">cauth2.h</a>.</p>

</div>
</div>
Expand Down Expand Up @@ -1123,12 +1125,26 @@ <h2 class="memtitle"><span class="permalink"><a href="#adb22f28c088151b954b0e07c
<td class="memname">bool check_entropy_value </td>
<td>(</td>
<td class="paramtype">long int&#160;</td>
<td class="paramname"></td><td>)</td>
<td class="paramname"><em>value</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">

<p>Check if selected entropy type is valid. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>Entropy value</td></tr>
</table>
</dd>
</dl>
<dl class="retval"><dt>Return values</dt><dd>
<table class="retval">
<tr><td class="paramname">&lt;em&gt;true&lt;/em&gt;</td><td>if is valid </td></tr>
</table>
</dd>
</dl>

</div>
</div>
<a id="af5db9efd29aebe58575afc6d62472630"></a>
Expand Down
52 changes: 26 additions & 26 deletions docs/d0/dd4/cauth2_8h_source.html
Original file line number Diff line number Diff line change
Expand Up @@ -246,32 +246,32 @@
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160;);</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; </div>
<div class="line"><a name="l00525"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#a29619c288a393a630da20ca14c4add42"> 525</a></span>&#160;<span class="preprocessor">#define DEFAULT_TIMEOUT_IN_SECOND 60</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; </div>
<div class="line"><a name="l00527"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf"> 527</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf">check_entropy_value</a>(</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordtype">long</span> <span class="keywordtype">int</span></div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;);</div>
<div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#a29619c288a393a630da20ca14c4add42"> 529</a></span>&#160;<span class="preprocessor">#define DEFAULT_TIMEOUT_IN_SECOND 120</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; </div>
<div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#af5db9efd29aebe58575afc6d62472630"> 531</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#af5db9efd29aebe58575afc6d62472630">clear_rnd_and_free</a>(</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; uint8_t **,</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordtype">size_t</span>,</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;);</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; </div>
<div class="line"><a name="l00537"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#ace42e7ee4af019c1bb708e06c7a10e4f"> 537</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#ace42e7ee4af019c1bb708e06c7a10e4f">decode_totp_key_with_alg_check_dynamic</a>(</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; uint8_t **out, <span class="keywordtype">size_t</span> *out_sz,</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordtype">int</span> alg,</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *in, ssize_t in_len</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;);</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00543"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#a59534fbe1df1da34ed2077b5027c1946"> 543</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#a59534fbe1df1da34ed2077b5027c1946">encode_totp_key_with_alg_check_dynamic</a>(</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> **out, <span class="keywordtype">size_t</span> *out_sz,</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordtype">int</span> alg,</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keyword">const</span> uint8_t *in, <span class="keywordtype">size_t</span> in_len</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;);</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; </div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; </div>
<div class="line"><a name="l00542"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf"> 542</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf">check_entropy_value</a>(</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keywordtype">long</span> <span class="keywordtype">int</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;);</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; </div>
<div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#af5db9efd29aebe58575afc6d62472630"> 546</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#af5db9efd29aebe58575afc6d62472630">clear_rnd_and_free</a>(</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; uint8_t **,</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordtype">size_t</span>,</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; </div>
<div class="line"><a name="l00552"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#ace42e7ee4af019c1bb708e06c7a10e4f"> 552</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#ace42e7ee4af019c1bb708e06c7a10e4f">decode_totp_key_with_alg_check_dynamic</a>(</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; uint8_t **out, <span class="keywordtype">size_t</span> *out_sz,</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="keywordtype">int</span> alg,</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *in, ssize_t in_len</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160;);</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; </div>
<div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="../../d0/dd4/cauth2_8h.html#a59534fbe1df1da34ed2077b5027c1946"> 558</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="../../d0/dd4/cauth2_8h.html#a59534fbe1df1da34ed2077b5027c1946">encode_totp_key_with_alg_check_dynamic</a>(</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> **out, <span class="keywordtype">size_t</span> *out_sz,</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordtype">int</span> alg,</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keyword">const</span> uint8_t *in, <span class="keywordtype">size_t</span> in_len</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;);</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; </div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; </div>
<div class="ttc" id="acauth2_8h_html_a0aad74305c65a6037c543b2d56c3d5a9"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#a0aad74305c65a6037c543b2d56c3d5a9">cauth_buildDate</a></div><div class="ttdeci">const char * cauth_buildDate()</div><div class="ttdoc">Get CAuth2 build date.</div></div>
<div class="ttc" id="acauth2_8h_html_a14363cf228f6dbc2fe712b5bcc37e989"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#a14363cf228f6dbc2fe712b5bcc37e989">cauth_sign_err_t</a></div><div class="ttdeci">cauth_sign_err_t</div><div class="ttdef"><b>Definition:</b> <a href="../../d0/dd4/cauth2_8h_source.html#l00178">cauth2.h:178</a></div></div>
<div class="ttc" id="acauth2_8h_html_a14363cf228f6dbc2fe712b5bcc37e989a366322a22bc0e5ef661047712e7af3d4"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#a14363cf228f6dbc2fe712b5bcc37e989a366322a22bc0e5ef661047712e7af3d4">CAUTH_ERR_INVALID_ALG_TYPE</a></div><div class="ttdeci">@ CAUTH_ERR_INVALID_ALG_TYPE</div><div class="ttdoc">Invalid algorithm type.</div><div class="ttdef"><b>Definition:</b> <a href="../../d0/dd4/cauth2_8h_source.html#l00184">cauth2.h:184</a></div></div>
Expand Down Expand Up @@ -309,7 +309,7 @@
<div class="ttc" id="acauth2_8h_html_ab8df9a4e1c845b0de92f352fdbbbb68c"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#ab8df9a4e1c845b0de92f352fdbbbb68c">generate_key_dynamic</a></div><div class="ttdeci">int generate_key_dynamic(uint8_t **, size_t *, int, uint32_t, uint64_t, const char *)</div></div>
<div class="ttc" id="acauth2_8h_html_accd48cbd1a7b64cfd0f60e47f56ad15a"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#accd48cbd1a7b64cfd0f60e47f56ad15a">cauth_2fa_auth_code</a></div><div class="ttdeci">CAUTH_2FA_AUTH_CODE_ERR cauth_2fa_auth_code(uint32_t *, int, uint8_t *, size_t, int, uint64_t, uint64_t, time_t *, uint8_t)</div><div class="ttdoc">Get OAuth2 code from given key</div></div>
<div class="ttc" id="acauth2_8h_html_ace42e7ee4af019c1bb708e06c7a10e4f"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#ace42e7ee4af019c1bb708e06c7a10e4f">decode_totp_key_with_alg_check_dynamic</a></div><div class="ttdeci">int decode_totp_key_with_alg_check_dynamic(uint8_t **out, size_t *out_sz, int alg, const char *in, ssize_t in_len)</div></div>
<div class="ttc" id="acauth2_8h_html_adb22f28c088151b954b0e07ca8f428cf"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf">check_entropy_value</a></div><div class="ttdeci">bool check_entropy_value(long int)</div></div>
<div class="ttc" id="acauth2_8h_html_adb22f28c088151b954b0e07ca8f428cf"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#adb22f28c088151b954b0e07ca8f428cf">check_entropy_value</a></div><div class="ttdeci">bool check_entropy_value(long int)</div><div class="ttdoc">Check if selected entropy type is valid.</div></div>
<div class="ttc" id="acauth2_8h_html_adecfd819958f42a50047b888b528757d"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#adecfd819958f42a50047b888b528757d">cauth_verify_err_t</a></div><div class="ttdeci">cauth_verify_err_t</div><div class="ttdef"><b>Definition:</b> <a href="../../d0/dd4/cauth2_8h_source.html#l00195">cauth2.h:195</a></div></div>
<div class="ttc" id="acauth2_8h_html_adecfd819958f42a50047b888b528757da0af8ed71a9d85270e6c4cffdd250561a"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#adecfd819958f42a50047b888b528757da0af8ed71a9d85270e6c4cffdd250561a">CAUTH_VERIFY_OK</a></div><div class="ttdeci">@ CAUTH_VERIFY_OK</div><div class="ttdoc">Verify OK.</div><div class="ttdef"><b>Definition:</b> <a href="../../d0/dd4/cauth2_8h_source.html#l00204">cauth2.h:203</a></div></div>
<div class="ttc" id="acauth2_8h_html_adecfd819958f42a50047b888b528757da5b7da999b54d846cc11bf31ec7ddcd88"><div class="ttname"><a href="../../d0/dd4/cauth2_8h.html#adecfd819958f42a50047b888b528757da5b7da999b54d846cc11bf31ec7ddcd88">CAUTH_VERIFY_WRONG_SIZE_ERR</a></div><div class="ttdeci">@ CAUTH_VERIFY_WRONG_SIZE_ERR</div><div class="ttdoc">Wrong size error.</div><div class="ttdef"><b>Definition:</b> <a href="../../d0/dd4/cauth2_8h_source.html#l00199">cauth2.h:199</a></div></div>
Expand Down
17 changes: 16 additions & 1 deletion include/cauth2_dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -522,8 +522,23 @@ generate_totp_key_dynamic(
const char *
);

#define DEFAULT_TIMEOUT_IN_SECOND 60
/**
* @def DEFAULT_TIMEOUT_IN_SECOND
* @brief Default timeout for generating random keys
*/
#define DEFAULT_TIMEOUT_IN_SECOND 120

/**
* @fn bool check_entropy_value(
* long int value
* )
* @brief Check if selected entropy type is valid
*
* @param [in] value Entropy value
*
* @retval _true_ if is valid
*
*/
bool check_entropy_value(
long int
);
Expand Down
15 changes: 9 additions & 6 deletions module.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,20 @@ static int c_raw_data_obj_init(C_RAW_DATA_OBJ *self, PyObject *args, PyObject *k
char
*kwlist[] = {"hmacSecretKey", "totpSecretKey", "hmacAlgType", "totpAlgType", NULL},
*hmacSecretKey, *totpSecretKey=NULL;
Py_ssize_t
hmacSecretKeyLen, totpSecretKeyLen;

self->hmac_secret_key_dyn=NULL;
self->totp_secret_key_dyn=NULL;
self->hmac_alg_type=ALG_SHA256;
self->totp_alg_type=ALG_SHA1;

if (!PyArg_ParseTupleAndKeywords(
args, kwds, "s|sII", kwlist,
&hmacSecretKey, &totpSecretKey, &self->hmac_alg_type, &self->totp_alg_type
args, kwds, "s#|s#II", kwlist,
&hmacSecretKey, &hmacSecretKeyLen, &totpSecretKey, &totpSecretKeyLen, &self->hmac_alg_type, &self->totp_alg_type
)) PANEL_ERROR("Error on parse on init", 11)

if (!(self->hmac_secret_key_size=strlen(hmacSecretKey)))
if (!(self->hmac_secret_key_size=(size_t)hmacSecretKeyLen))
PANEL_ERROR("Empty HMAC secret key", 12)

if (!(self->hmac_secret_key_dyn=malloc(++(self->hmac_secret_key_size))))
Expand All @@ -129,7 +131,7 @@ static int c_raw_data_obj_init(C_RAW_DATA_OBJ *self, PyObject *args, PyObject *k
if (totpSecretKey) {
if ((err=check_base32_oauth_key_valid(
NULL, totpSecretKey,
self->totp_secret_key_size=strlen(totpSecretKey), self->totp_alg_type
self->totp_secret_key_size=(size_t)totpSecretKeyLen, self->totp_alg_type
))) {
errMsg="Empty Auth2 TOTP Base32 secret key or C function check_base32_oauth_key_valid() error";
goto totpSecretKey_ERROR;
Expand Down Expand Up @@ -188,18 +190,19 @@ static PyObject *sign_message(C_RAW_DATA_OBJ *self, PyObject *args, PyObject *kw
int err;
static char *kwlist[] = {"messageStr", NULL};
char *strMsg;
Py_ssize_t strMsgLen;
static void *signed_message_ptr;
size_t signed_message_size;
PyObject *ret;

if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &strMsg))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &strMsg, &strMsgLen))
PANEL_ERROR("Can't parse message to be assigned", NULL)

if ((err=sign_message_dynamic(
(void **)&signed_message_ptr, &signed_message_size,
self->hmac_alg_type,
(uint8_t *)self->hmac_secret_key_dyn, self->hmac_secret_key_size,
(uint8_t *)strMsg, strlen(strMsg)
(uint8_t *)strMsg, (size_t)strMsgLen
))) PANEL_ERROR_FMT(NULL, "Sign message error @ sign_message_dynamic with err = %d", err)

ret=Py_BuildValue("y#", signed_message_ptr, signed_message_size);
Expand Down
6 changes: 4 additions & 2 deletions test/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,14 +966,15 @@ struct encode_expected_t {

static void test_encode_message()
{
int err;
int err, i = 0;
const char *out;
size_t out_len;
struct encode_expected_t *encode_expected = ENCODE_EXPECTED;

while (encode_expected->message) {
err = encode_totp_key_with_alg_check_dynamic(&out, &out_len, encode_expected->alg, encode_expected->message, encode_expected->message_len);

INFO_MSG_FMT("\nTest encode message test %d\n", ++i)
if (err == 0) {
C_ASSERT_NOT_NULL((void *)out)
C_ASSERT_EQUAL_STRING((char *)encode_expected->expected_encoded_message, (char *)out,
Expand Down Expand Up @@ -1049,7 +1050,8 @@ static void test_decode_message()

while (decode_expected->message) {
err = decode_totp_key_with_alg_check_dynamic(&out, &out_len, decode_expected->alg, decode_expected->message, decode_expected->message_len);
i++;

INFO_MSG_FMT("\nTest decode message test %d\n", ++i)
if (err == 0) {
C_ASSERT_NOT_NULL((void *)out)
C_ASSERT_EQUAL_LONG_INT((long int)decode_expected->expected_decoded_size, (long int)out_len,
Expand Down

0 comments on commit d871081

Please sign in to comment.