1+ #include <ruby.h>
2+
3+ #define USM_LENGTH_EXPANDED_PASSPHRASE (1024 * 1024) /* 1Meg. */
4+ #define USM_LENGTH_KU_HASHBLOCK 64
5+
6+ static VALUE mNETSNMP ;
7+ static VALUE cNETSNMP_Sec_Params ;
8+
9+ static VALUE NETSNMP_expand_passphrase (VALUE self , VALUE password )
10+ {
11+ char * P ;
12+ size_t P_len ;
13+ int nbytes = USM_LENGTH_EXPANDED_PASSPHRASE ;
14+ u_int pindex = 0 ;
15+ u_char buf [USM_LENGTH_EXPANDED_PASSPHRASE ], * bufp ;
16+
17+ StringValue (password );
18+ P = RSTRING_PTR (password );
19+ P_len = RSTRING_LEN (password );
20+
21+ bufp = buf ;
22+ while (nbytes > 0 ) {
23+ * bufp ++ = P [pindex ++ % P_len ];
24+ // if (!EVP_DigestUpdate(ctx, buf, USM_LENGTH_KU_HASHBLOCK))
25+ // ossl_raise(eDigestError, "EVP_DigestUpdate");
26+
27+ nbytes -- ;
28+ }
29+
30+ // if (!EVP_DigestFinal_ex(ctx, &Ku, &kulen))
31+ // ossl_raise(eDigestError, "EVP_DigestFinal_ex");
32+
33+ // memset(buf, 0, sizeof(buf));
34+
35+ // TODO: trim to 16 bytes if auth protocol is md5
36+
37+ return rb_usascii_str_new ((const char * ) buf , USM_LENGTH_EXPANDED_PASSPHRASE );
38+ }
39+
40+ void Init_netsnmp_ext ( void )
41+ {
42+ mNETSNMP = rb_define_module ("NETSNMP" );
43+ cNETSNMP_Sec_Params = rb_define_class_under (mNETSNMP , "SecurityParameters" , rb_cObject );
44+ // rb_define_method(cNETSNMP_Sec_Params, "passkey", NETSNMP_passkey, 1);
45+ rb_define_method (cNETSNMP_Sec_Params , "expand_passphrase" , NETSNMP_expand_passphrase , 1 );
46+ }
0 commit comments