aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/security/parc_CryptoSuite.c
blob: 32b1431e978c3671bff0f80d4ef2da93d57336b1 (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * Copyright (c) 2017 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 */
#include <config.h>

#include <LongBow/runtime.h>

#include <parc/security/parc_CryptoSuite.h>
#include <parc/security/parc_SigningAlgorithm.h>

PARCCryptoHashType
parcCryptoSuite_GetCryptoHash(PARCCryptoSuite suite)
{
    switch (suite) {
        case PARCCryptoSuite_DSA_SHA256:      // fallthrough
        case PARCCryptoSuite_HMAC_SHA256:     // fallthrough
        case PARCCryptoSuite_RSA_SHA256:      // fallthrough
        case PARCCryptoSuite_ECDSA_SHA256:
            return PARCCryptoHashType_SHA256;

        case PARCCryptoSuite_HMAC_SHA512:     // fallthrough
        case PARCCryptoSuite_RSA_SHA512:
            return PARCCryptoHashType_SHA512;

        case PARCCryptoSuite_NULL_CRC32C:
            return PARCCryptoHashType_CRC32C;

        default:
            trapIllegalValue(suite, "Unknown crypto suite: %d", suite);
    }
}

int
parcCryptoSuite_GetSignatureSizeBits(PARCCryptoSuite suite, int keyLengthBits)
{
    switch (suite) {
        case PARCCryptoSuite_DSA_SHA256:      // fallthrough
        case PARCCryptoSuite_RSA_SHA256:      // fallthrough
        case PARCCryptoSuite_RSA_SHA512:
            return keyLengthBits;

        case PARCCryptoSuite_ECDSA_SHA256:
            return keyLengthBits*2 + 64; //Overhead added by ECDSA 

        case PARCCryptoSuite_HMAC_SHA256:     // fallthrough
        case PARCCryptoSuite_HMAC_SHA512:     // fallthrough
            return 512;

        case PARCCryptoSuite_NULL_CRC32C:
            return 32;

        default:
            trapIllegalValue(suite, "Unknown crypto suite: %d", suite);
    }
}

int
parcCryptoSuite_GetSignatureSizeBytes(PARCCryptoSuite suite, int keyLengthBits)
{
    int keyLengthBytes = keyLengthBits >> 3;
    switch (suite) {
        case PARCCryptoSuite_DSA_SHA256:      // fallthrough
        case PARCCryptoSuite_RSA_SHA256:      // fallthrough
        case PARCCryptoSuite_RSA_SHA512:
            return keyLengthBytes;

        case PARCCryptoSuite_ECDSA_SHA256:
            return keyLengthBytes*2 + 8; //Overhead added by ECDSA 

        case PARCCryptoSuite_HMAC_SHA256:     // fallthrough
        case PARCCryptoSuite_HMAC_SHA512:     // fallthrough
            return 64;

        case PARCCryptoSuite_NULL_CRC32C:
            return 4;

        default:
            trapIllegalValue(suite, "Unknown crypto suite: %d", suite);
    }
}

PARCCryptoSuite parcCryptoSuite_GetFromSigningHash(PARCSigningAlgorithm signAlgo, PARCCryptoHashType hash) {

  switch (signAlgo) {
    case PARCSigningAlgorithm_DSA:
      return PARCCryptoSuite_DSA_SHA256 + hash -1;
    case PARCSigningAlgorithm_RSA:
      return PARCCryptoSuite_RSA_SHA256 + hash -1;
    case PARCSigningAlgorithm_ECDSA:
      return PARCCryptoSuite_ECDSA_SHA256 + hash -1;      
    case PARCSigningAlgorithm_NULL:
      return PARCCryptoSuite_NULL_CRC32C;
    default:
      trapIllegalValue(suite, "Unknown signing algorithm suite: %d", signAlgo);
  }
}

PARCSigningAlgorithm
parcCryptoSuite_GetSigningAlgorithm(PARCCryptoSuite suite)
{
    switch (suite) {
        case PARCCryptoSuite_DSA_SHA256:
            return PARCSigningAlgorithm_DSA;

        case PARCCryptoSuite_RSA_SHA256:      // fallthrough
        case PARCCryptoSuite_RSA_SHA512:
            return PARCSigningAlgorithm_RSA;

        case PARCCryptoSuite_HMAC_SHA256:     // fallthrough
        case PARCCryptoSuite_HMAC_SHA512:
            return PARCSigningAlgorithm_HMAC;

        case PARCCryptoSuite_ECDSA_SHA256:
	    return PARCSigningAlgorithm_ECDSA;
        case PARCCryptoSuite_NULL_CRC32C:
            return PARCSigningAlgorithm_NULL;

        default:
            trapIllegalValue(suit, "Unknown crypto suite: %d", suite);
    }
}