+ uint32_t i_user;
+ uint32_t i_key;
+ uint8_t *p_iviv;
+ uint8_t *p_name;
+ uint32_t i_name_len;
+
+ uint32_t *p_tmp;
+ uint32_t i_tmp_len;
+
+ uint32_t p_key[ 4 ];
+ uint32_t p_ctx[ 128 ];
+
+ char *psz_homedir;
+};
+
+#define P_DRMS ((struct drms_s *)p_drms)
+
+static int rw_user_key( void *p_drms, uint32_t i_rw, uint32_t *p_user_key )
+{
+ FILE *file;
+ int i_ret = -1;
+ char sz_path[ MAX_PATH ];
+
+#define DRMS_PI_DIRNAME "drms"
+#ifdef WIN32
+#define DRMS_DIRNAME DRMS_PI_DIRNAME
+#else
+#define DRMS_DIRNAME "." DRMS_PI_DIRNAME
+#endif
+
+ if( i_rw )
+ {
+ snprintf( sz_path, (sizeof(sz_path)/sizeof(sz_path[ 0 ])) - 1,
+ "%s/" DRMS_DIRNAME "/%08X.%03d", P_DRMS->psz_homedir,
+ P_DRMS->i_user, P_DRMS->i_key );
+
+ file = fopen( sz_path, "r" );
+ if( file != NULL )
+ {
+ i_ret = fread( p_user_key, sizeof(*p_user_key),
+ 4, file ) == 4 ? 0 : -1;
+ fclose( file );
+ }
+ }
+ else
+ {
+ snprintf( sz_path, (sizeof(sz_path)/sizeof(sz_path[ 0 ])) - 1,
+ "%s/" DRMS_DIRNAME, P_DRMS->psz_homedir );
+
+#if defined( HAVE_ERRNO_H )
+# if defined( WIN32 )
+ if( !mkdir( sz_path ) || errno == EEXIST )
+# else
+ if( !mkdir( sz_path, 0755 ) || errno == EEXIST )
+# endif
+#else
+ if( !mkdir( sz_path ) )
+#endif
+ {
+ snprintf( sz_path, (sizeof(sz_path)/sizeof(sz_path[ 0 ])) - 1,
+ "%s/" DRMS_DIRNAME "/%08X.%03d", P_DRMS->psz_homedir,
+ P_DRMS->i_user, P_DRMS->i_key );
+
+ file = fopen( sz_path, "w" );
+ if( file != NULL )
+ {
+ i_ret = fwrite( p_user_key, sizeof(*p_user_key),
+ 4, file ) == 4 ? 0 : -1;
+ fclose( file );
+ }
+ }
+ }
+
+ return( i_ret );
+}
+
+static int get_user_key( void *p_drms, uint32_t *p_user_key )
+{
+ uint32_t i, y;
+ uint32_t *p_tmp;