aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/dexon-foundation/mcl/test/ecdsa_c_test.cpp
blob: e0af3818242e1c3608f9a2fb713f2725270d1871 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <mcl/ecdsa.h>
#include <cybozu/test.hpp>
#include <string.h>

template<class T, class Serializer, class Deserializer>
void serializeTest(const T& x, const Serializer& serialize, const Deserializer& deserialize)
{
    char buf[128];
    size_t n = serialize(buf, sizeof(buf), &x);
    CYBOZU_TEST_ASSERT(n > 0);
    T y;
    size_t m = deserialize(&y, buf, n);
    CYBOZU_TEST_EQUAL(m, n);
    CYBOZU_TEST_ASSERT(memcmp(&x, &y, n) == 0);
}

CYBOZU_TEST_AUTO(ecdsa)
{
    int ret;
    ret = ecdsaInit();
    CYBOZU_TEST_EQUAL(ret, 0);
    ecdsaSecretKey sec;
    ecdsaPublicKey pub;
    ecdsaPrecomputedPublicKey *ppub;
    ecdsaSignature sig;
    const char *msg = "hello";
    mclSize msgSize = strlen(msg);

    ret = ecdsaSecretKeySetByCSPRNG(&sec);
    CYBOZU_TEST_EQUAL(ret, 0);
    serializeTest(sec, ecdsaSecretKeySerialize, ecdsaSecretKeyDeserialize);

    ecdsaGetPublicKey(&pub, &sec);
    serializeTest(pub, ecdsaPublicKeySerialize, ecdsaPublicKeyDeserialize);
    ecdsaSign(&sig, &sec, msg, msgSize);
    serializeTest(sig, ecdsaSignatureSerialize, ecdsaSignatureDeserialize);
    CYBOZU_TEST_ASSERT(ecdsaVerify(&sig, &pub, msg, msgSize));

    ppub = ecdsaPrecomputedPublicKeyCreate();
    CYBOZU_TEST_ASSERT(ppub);
    ret = ecdsaPrecomputedPublicKeyInit(ppub, &pub);
    CYBOZU_TEST_EQUAL(ret, 0);

    CYBOZU_TEST_ASSERT(ecdsaVerifyPrecomputed(&sig, ppub, msg, msgSize));

    sig.d[0]++;
    CYBOZU_TEST_ASSERT(!ecdsaVerify(&sig, &pub, msg, msgSize));
    CYBOZU_TEST_ASSERT(!ecdsaVerifyPrecomputed(&sig, ppub, msg, msgSize));

    ecdsaPrecomputedPublicKeyDestroy(ppub);
}