/// <summary> /// 签名验证 /// </summary> /// <param name="value"></param> /// <param name="key"></param> /// <param name="sign"></param> /// <returns></returns> internal unsafe static bool Check(valueType value, string key, string sign) { if (valueGetter == null) { throw new ArgumentNullException(); } if (value == null) { throw new ArgumentNullException("value is null"); } if (sign.length() == 32) { string[] values = new string[memberCount]; int length = 4 + key.Length + getLength(value, values); AutoCSer.SubBuffer.PoolBufferFull buffer = default(AutoCSer.SubBuffer.PoolBufferFull); AutoCSer.SubBuffer.Pool.GetBuffer(ref buffer, length); try { concat(values, ref buffer, length, key); using (MD5 md5 = new MD5CryptoServiceProvider()) { if (md5.ComputeHash(buffer.Buffer, buffer.StartIndex, length).checkUpperHexNotNull(sign)) { return(true); } } } finally { buffer.Free(); } } return(false); }
/// <summary> /// 获取解压数据 /// </summary> /// <returns>解压数据</returns> internal byte[] Get() { AutoCSer.SubBuffer.PoolBufferFull buffer = default(AutoCSer.SubBuffer.PoolBufferFull); byte *data = AutoCSer.UnmanagedPool.Default.Get(); try { AutoCSer.SubBuffer.Pool.GetBuffer(ref buffer, bufferSize); using (dataStream = new UnmanagedStream(data, AutoCSer.UnmanagedPool.DefaultSize)) { fixed(byte *bufferFixed = buffer.Buffer) { byte *start = bufferFixed + buffer.StartIndex; do { int length = CompressStream.Read(buffer.Buffer, buffer.StartIndex, bufferSize); if (length == 0) { break; } dataStream.WriteNotEmpty(start, length); }while (true); } return(dataStream.GetArray()); } } finally { AutoCSer.UnmanagedPool.Default.Push(data); buffer.Free(); } }
/// <summary> /// 获取签名计算数据 /// </summary> /// <param name="value"></param> /// <param name="key"></param> /// <param name="buffer"></param> /// <returns>数据长度</returns> internal unsafe static int GetData(valueType value, string key, ref AutoCSer.SubBuffer.PoolBufferFull buffer) { if (valueGetter == null) { throw new ArgumentNullException(); } if (value == null) { throw new ArgumentNullException("value is null"); } string[] values = new string[memberCount]; int length = 4 + key.Length + getLength(value, values); AutoCSer.SubBuffer.Pool.GetBuffer(ref buffer, length); concat(values, ref buffer, length, key); using (MD5 md5 = new MD5CryptoServiceProvider()) setSign(value, md5.ComputeHash(buffer.Buffer, buffer.StartIndex, length).toUpperHex()); return(length - key.Length - 5); }