- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题总结
我正在使用 libsparkcrypto library对于我的 SHA256 函数。我发现我不能 Assert
那个x = y
暗示 Sha256(x) = Sha256(y)
.任何帮助将不胜感激。
代码
测试包.adb
package body TestPackage with
SPARK_Mode
is
function Is_Equal (X, Y : LSC.Types.Bytes) return Boolean is
begin
if X = Y then
pragma Assert (LSC.SHA2.Hash_SHA256 (X) = LSC.SHA2.Hash_SHA256 (Y));
return True;
end if;
return (LSC.SHA2.Hash_SHA256 (X) = LSC.SHA2.Hash_SHA256 (Y));
end Is_Equal;
end TestPackage;
测试包.ads
with LSC.Types; use LSC.Types;
with LSC.SHA2;
package TestPackage with
SPARK_Mode
is
function Is_Equal (X, Y : LSC.Types.Bytes) return Boolean with
Post => Is_Equal'Result = (LSC.SHA2.Hash_SHA256 (X) = LSC.SHA2.Hash_SHA256 (Y));
end TestPackage;
输出
testpackage.adb:8:25: medium: assertion might fail, cannot proveLSC.SHA2.Hash_SHA256 (X) = LSC.SHA2.Hash_SHA256 (Y) [possibleexplanation: subprogram at testpackage.ads:8 should mention X and Y ina precondition][#0]
gnatprove.out
:
Summary of SPARK analysis
=========================
-------------------------------------------------------------------------------------------
SPARK Analysis results Total Flow CodePeer Provers Justified Unproved
-------------------------------------------------------------------------------------------
Data Dependencies . . . . . .
Flow Dependencies . . . . . .
Initialization . . . . . .
Non-Aliasing . . . . . .
Run-time Checks 6 . . 6 (CVC4) . .
Assertions 1 . . . . 1
Functional Contracts 1 . . 1 (CVC4) . .
LSP Verification . . . . . .
Termination . . . . . .
Concurrency . . . . . .
-------------------------------------------------------------------------------------------
Total 8 . . 7 (88%) . 1 (13%)
max steps used for successful proof: 1
Analyzed 2 units
in unit main, 0 subprograms and packages out of 1 analyzed
Main at main.adb:8 skipped
in unit testpackage, 2 subprograms and packages out of 2 analyzed
TestPackage at testpackage.ads:4 flow analyzed (0 errors, 0 checks and 0 warnings) and proved (0 checks)
TestPackage.Is_Equal at testpackage.ads:8 flow analyzed (0 errors, 0 checks and 0 warnings) and not proved, 7 checks out of 8 proved
最佳答案
虽然这不是问题的答案,但对较小示例的一些调查表明该问题并非特定于 LSC.SHA2.Hash_SHA256
。 libsparkcrypto 库中的函数。似乎证明具有数组类型参数的函数的“纯度”存在普遍困难。另一方面,带有标量类型参数的函数被证明是符合预期的。
因此,问题可能是阵列上的某些条件缺失、求解器超时太短或只是 SPARK 当前无法证明此类问题(例如,请参见 SPARK UG 中的 7.8.3 部分)。关于缺失的条件:我不确定(还)这些缺失的条件可能是什么,我已经添加了很多,但似乎没有任何帮助。
如果您是证明专家,那么您可以通过检查在手动证明环境中失败的“目标”来进一步调查问题(另请参阅 SPARK UG 中的 7.1.8 部分以了解详细信息)。不幸的是,我在这里缺少合适的博士来理解 SPARK 工具的这一部分并对此有任何帮助;-)。
pkg.ads
package Pkg with SPARK_Mode, Pure is
--------------------------------------------
-- Functions with a scalar type parameter --
--------------------------------------------
function Fcn_Scalar_1 (X : Integer) return Integer;
function Fcn_Scalar_2 (X : Integer) return Integer
with Pure_Function;
function Fcn_Scalar_3 (X : Integer) return Integer
with
Global => null,
Depends => (Fcn_Scalar_3'Result => X);
function Fcn_Scalar_4 (X : Integer) return Integer
with Post => Fcn_Scalar_4'Result = X;
--------------------------------------------
-- Functions with an array type parameter --
--------------------------------------------
type Arr is array (Natural range <>) of Integer;
function Fcn_Array_1 (X : Arr) return Integer;
function Fcn_Array_2 (X : Arr) return Integer
with Pure_Function;
function Fcn_Array_3 (X : Arr) return Integer
with
Global => null,
Depends => (Fcn_Array_3'Result => X);
function Fcn_Array_4 (X : Arr) return Arr
with Post => Fcn_Array_4'Result = X;
end Pkg;
测试广告
with Pkg; use Pkg;
package Test with SPARK_Mode is
-- Is_Equal_Scalar_1 : Postcondition proved.
-- Is_Equal_Scalar_2 : Postcondition proved.
-- Is_Equal_Scalar_3 : Postcondition proved.
-- Is_Equal_Scalar_4 : Postcondition proved.
function Is_Equal_Scalar_1 (X, Y : Integer) return Boolean is
(if X = Y then True else Fcn_Scalar_1 (X) = Fcn_Scalar_1 (Y))
with Post => Is_Equal_Scalar_1'Result = (Fcn_Scalar_1 (X) = Fcn_Scalar_1 (Y));
function Is_Equal_Scalar_2 (X, Y : Integer) return Boolean is
(if X = Y then True else Fcn_Scalar_2 (X) = Fcn_Scalar_2 (Y))
with Post => Is_Equal_Scalar_2'Result = (Fcn_Scalar_2 (X) = Fcn_Scalar_2 (Y));
function Is_Equal_Scalar_3 (X, Y : Integer) return Boolean is
(if X = Y then True else Fcn_Scalar_3 (X) = Fcn_Scalar_3(Y))
with Post => Is_Equal_Scalar_3'Result = (Fcn_Scalar_3 (X) = Fcn_Scalar_3 (Y));
function Is_Equal_Scalar_4 (X, Y : Integer) return Boolean is
(if X = Y then True else Fcn_Scalar_4 (X) = Fcn_Scalar_4(Y))
with Post => Is_Equal_Scalar_4'Result = (Fcn_Scalar_4 (X) = Fcn_Scalar_4 (Y));
-- Is_Equal_Array_1 : Postcondition NOT proved.
-- Is_Equal_Array_2 : Postcondition NOT proved.
-- Is_Equal_Array_3 : Postcondition NOT proved.
-- Is_Equal_Array_4 : Postcondition proved, but only because of the postcondition on Fcn_Array_4.
function Is_Equal_Array_1 (X, Y : Arr) return Boolean is
(if X = Y then True else Fcn_Array_1 (X) = Fcn_Array_1 (Y))
Pre => X'First = 0 and Y'First = 0 and X'Length = Y'Length and X'Length > 0 and Y'Length > 0,
Post => Is_Equal_Array_1'Result = (Fcn_Array_1 (X) = Fcn_Array_1 (Y));
function Is_Equal_Array_2 (X, Y : Arr) return Boolean is
(if X = Y then True else Fcn_Array_2 (X) = Fcn_Array_2 (Y))
with
Pre => X'First = 0 and Y'First = 0 and X'Length = Y'Length and X'Length > 0 and Y'Length > 0,
Post => Is_Equal_Array_2'Result = (Fcn_Array_2 (X) = Fcn_Array_2 (Y));
function Is_Equal_Array_3 (X, Y : Arr) return Boolean is
(if X = Y then True else Fcn_Array_3 (X) = Fcn_Array_3 (Y))
with
Pre => X'First = 0 and Y'First = 0 and X'Length = Y'Length and X'Length > 0 and Y'Length > 0,
Post => Is_Equal_Array_3'Result = (Fcn_Array_3 (X) = Fcn_Array_3 (Y));
function Is_Equal_Array_4 (X, Y : Arr) return Boolean is
(if X = Y then True else Fcn_Array_4 (X) = Fcn_Array_4 (Y))
with Post => Is_Equal_Array_4'Result = (Fcn_Array_4 (X) = Fcn_Array_4 (Y));
end Test;
输出 (证明)
$ gnatprove -Pdefault.gpr --level=2 -j0 -u test.ads --report=statistics
Phase 1 of 2: generation of Global contracts ...
Phase 2 of 2: flow analysis and proof ...
test.ads:12:21: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
test.ads:16:21: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
test.ads:20:21: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
test.ads:24:21: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
test.ads:35:18: medium: postcondition might fail, cannot prove Is_Equal_Array_1'Result = (Fcn_Array_1 (X) = Fcn_Array_1 (Y)) (e.g. when X = (others => 0) and X'First = 0 and X'Last = 0 and Y = (others => 0) and Y'First = 0 and Y'Last = 0)
test.ads:41:18: medium: postcondition might fail, cannot prove Is_Equal_Array_2'Result = (Fcn_Array_2 (X) = Fcn_Array_2 (Y)) (e.g. when X = (others => 0) and X'First = 0 and X'Last = 0 and Y = (others => 0) and Y'First = 0 and Y'Last = 0)
test.ads:47:18: medium: postcondition might fail, cannot prove Is_Equal_Array_3'Result = (Fcn_Array_3 (X) = Fcn_Array_3 (Y)) (e.g. when X = (others => 0) and X'First = 0 and X'Last = 0 and Y = (others => 0) and Y'First = 0 and Y'Last = 0)
test.ads:51:21: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
Summary logged in /obj/gnatprove/gnatprove.out
Is_Equal
上的前提条件在数组类型的情况下,函数是必需的。这是因为数组的相等运算符在 Ada 中的行为方式。数组上的相等运算符
不是 考虑到索引边界(
RM 4.5.2 (18) ),它只检查数组长度及其组件值。因此,以下数组
A1
和
A2
, 被认为是相等的:
type Arr is array (Natural range <>) of Integer;
A1 : constant Arr (0 .. 3) := (1, 2, 3, 4);
A2 : constant Arr (1 .. 4) := (1, 2, 3, 4); -- Bounds on index differ.
现在定义简单的函数
First_Index
作为:
function First_Index (A : Arr) return Integer is (A'First);
此函数返回数组的索引下限。不幸的是
gnatprove
将无法证明
Is_Equal
此功能
First_Index
出于显而易见的原因,仅具有后置条件的函数。
function Is_Equal (X, Y : Arr) return Boolean is
(if X = Y then True else First_Index (X) = First_Index (Y))
with Post => Is_Equal'Result = (First_Index (X) = First_Index (Y));
因此,前提条件是强制性的,因为“纯”函数的结果可能取决于数组的边界。有了这个前提条件,就可以证明该功能(见下文)。对于前面示例中的情况,这不起作用。
with Ada.Text_IO; use Ada.Text_IO;
procedure Main with SPARK_Mode is
type Arr is array (Natural range <>) of Integer;
function First_Index (A : Arr) return Integer is (A'First);
function Is_Equal (X, Y : Arr) return Boolean is
(if X = Y then True else First_Index (X) = First_Index (Y))
with
Pre => X'First = 0 and Y'First = 0,
Post => Is_Equal'Result = (First_Index (X) = First_Index (Y));
A1 : constant Arr (0 .. 3) := (1, 2, 3, 4);
A2 : constant Arr (1 .. 4) := (1, 2, 3, 4); -- Bounds on index differ.
begin
if (A1 = A2) then
Put_Line ("Equal");
else
Put_Line ("Not Equal");
end if;
end Main;
输出 (主要的)
Equal
输出 (证明)
$ gnatprove -Pdefault.gpr --level=1 -j0 -u main.adb --report=statistics
Phase 1 of 2: generation of Global contracts ...
Phase 2 of 2: flow analysis and proof ...
main.adb:16:18: info: postcondition proved (CVC4: 2 VC in max 0.0 seconds and 1 step)
Summary logged in obj/gnatprove/gnatprove.out
关于ada - 未能断言 libsparkcrypto SHA256 结果相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66279968/
安全服务 API 似乎不允许我直接计算哈希。有很多公共(public)领域和自由许可的版本可用,但如果可能的话,我宁愿使用系统库实现。 可以通过 NSData 或普通指针访问数据。 哈希的加密强度对我
我有一堆大对象,以及它们的结构和它们的向量。有时检查复合对象的完整性很重要;为此,我正在使用对象的 Sha256“签名”。 至少有两种方法可以定义复合对象的签名:通过计算组件串联的sha,或者通过计算
研究了一个 cpu 矿工的源代码,我发现了这段代码: work->data[20] = 0x80000000; 好吧,我问了编码,他的回答是: “这些值是标准 SHA-2 填充的一部分” 谷歌搜索“s
您是否需要许可证才能将 SHA-1 或 SHA-2 用于商业目的? 最佳答案 它最初由 NSA 为安全 DSA 加密创建,然后被 NIST 采用以维护算法的所有方面以及 SHA(2 和 3)。 这是一
谁能解释一下 SHA-256 和 RIPEMD-160,哪种算法通常更快,性能和空间比较是什么(如果有)?我所说的空间比较并不是指 160 位和 256 位,而是指冲突频率、生产环境中空间要求的差异。
我对 SHA-2 和 SHA-256 之间的区别有点困惑,并且经常听到它们互换使用。我认为 SHA-2 是哈希算法的“家族”,而 SHA-256 是该家族中的特定算法。任何人都可以消除困惑。 最佳答案
我正在尝试从 SHA-1 更改为 SHA-512 以获得更好的安全性,但我不完全清楚如何进行更改。 这是我使用 SHA-1 的方法: public static String sha1Convert(
在我的 C# 应用程序中,我使用 RSA 对文件进行签名,然后再由上传者上传到我公司的数据库中,在这里我必须选择 SHA-1 或 SHA-2 来计算哈希值。与编程中的任何其他组件一样,我知道必须有一个
我正在研究 SHA1 、 SHA-256 、 SHA-512 在不同处理器上的速度(计算哈希的时间) 这些散列算法可以分解为跨多个核心/线程运行吗? 最佳答案 如果您想将计算单个哈希的执行并行化(无论
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
这个问题在这里已经有了答案: SHA2 password hashing in java (4 个答案) 关闭 9 年前。 我需要计算文件的 SHA-2 或 SHA-3。我没有提交任何代码示例来说明
在我的应用中,之前开发者已经使用openssl version 1.0.1e [#include openssl/sha.h]并且已经使用了函数 unsigned char *SHA(const un
我正在尝试实现 SHA-2加密而不是 SHA-1 . 为此,我知道这两种哈希算法之间的位数不同,这让我很困惑。 如何实现这一目标以及我需要在哪些部分进行必要的更改? 我可以使用来自 Java、Pyth
我目前正在使用 SHA-1。我像下面的代码一样使用它,但我想将它更改为 SHA-256。 public String sha1Encrypt(String str) { if(str == nul
我想将一些 Java 代码转换为 C#。 Java 代码: private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes()
我的程序使用 SHA-1 证书进行 SSL 连接。 SHA-2 证书现在已被一些网络服务(Gmail)广泛使用。这会导致在电子邮件通知设置期间阻止与 SMTP 服务器的传入连接。 为了发送电子邮件,我
我在提交中生成差异/更改,以便我可以将其上传到 ReviewBoard。 我使用了“git show d9f7121e8ebd4d1f789dab9f8214ada2h480b9cf”。它给了我 di
我刚刚从这个 HN-post 了解到 git 正在转向新的散列算法(从 SHA-1 到 SHA-256 ) 我想知道是什么让 SHA-256 最适合 git 的用例。 是否有任何/许多强有力的技术原因
是的,我需要降级到 SHA-1 以增加对项目中旧浏览器的兼容性。 有没有办法做到这一点? 我正在使用 Linux Centos 6.5 和 Apache/2.2.15。 我有 3 个文件: SSLCe
在 TLS1.1 和 TLS1.2 中,Cipher(rsa-with-aes-128-cbc-sha) 将使用哪个 Digest(SHA1 或 SHA256)? 最佳答案 根据官方openssl w
我是一名优秀的程序员,十分优秀!