func fill_pdu_for_test_crypt(is_encrypt bool, pt C.enum_snmp_privacy, salt, key, data []byte) ([]byte, error) { var digest [100000]byte var pdu C.snmp_pdu_t C.snmp_pdu_init(&pdu) pdu.user.priv_proto = pt C.memcpy(unsafe.Pointer(&pdu.user.priv_key[0]), unsafe.Pointer(&key[0]), C.size_t(C.SNMP_PRIV_KEY_SIZ)) pdu.user.priv_len = C.size_t(16) //C.size_t(C.SNMP_PRIV_KEY_SIZ) //(au == SNMP_PRIV_DES ) ? SNMP_AUTH_HMACMD5_KEY_SIZ : SNMP_AUTH_HMACSHA_KEY_SIZ; pdu.engine.engine_boots = 3 pdu.engine.engine_time = 3 C.memcpy(unsafe.Pointer(&pdu.msg_salt[0]), unsafe.Pointer(&salt[0]), 8) copy(digest[:], data) pdu.scoped_ptr = (*C.u_char)(unsafe.Pointer(&digest[0])) pdu.scoped_len = C.size_t((len(data) / 8) * 8) var ret_code C.enum_snmp_code if is_encrypt { ret_code = C.snmp_pdu_encrypt(&pdu) } else { ret_code = C.snmp_pdu_decrypt(&pdu) } if 0 != ret_code { err := errors.New(C.GoString(C.snmp_pdu_get_error(&pdu, ret_code))) return nil, err } return readGoBytes((*C.uint8_t)(pdu.scoped_ptr), C.uint32_t(pdu.scoped_len)), nil }