libtc  20160415
Threshold Cryptography functions library
algorithms_pkcs1_encoding.c
Go to the documentation of this file.
1 #include <mhash.h>
2 #include "tc_internal.h"
3 
4 const uint8_t MD2_PKCS_ID[] = {
5  0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86,
6  0xF7, 0x0D, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 };
7 
8 const uint8_t MD5_PKCS_ID[] = {
9  0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86,
10  0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 };
11 
12 const uint8_t RIPEMD_128_PKCS_ID[] = {
13  0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02,
14  0x02, 0x05, 0x00, 0x04, 0x14 };
15 
16 const uint8_t RIPEMD_160_PKCS_ID[] = {
17  0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02,
18  0x01, 0x05, 0x00, 0x04, 0x14 };
19 
20 const uint8_t SHA_160_PKCS_ID[] = {
21  0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02,
22  0x1A, 0x05, 0x00, 0x04, 0x14 };
23 
24 const uint8_t SHA_224_PKCS_ID[] = {
25  0x30, 0x2D, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
26  0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C };
27 
28 const uint8_t SHA_256_PKCS_ID[] = {
29  0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
30  0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 };
31 
32 const uint8_t SHA_384_PKCS_ID[] = {
33  0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
34  0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 };
35 
36 const uint8_t SHA_512_PKCS_ID[] = {
37  0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
38  0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 };
39 
40 const uint8_t TIGER_PKCS_ID[] = {
41  0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04,
42  0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, 0x00, 0x04, 0x18 };
43 
44 static inline void get_hash_properties(const uint8_t ** id, int * id_len, int * digest_len, tc_hash_type_t hash_type) {
45  switch(hash_type) {
46  case TC_SHA256:
47  *id_len = sizeof(SHA_256_PKCS_ID);
48  *digest_len = 256/8;
49  *id = SHA_256_PKCS_ID;
50  break;
51  case TC_NONE:
52  *id_len = 0;
53  *digest_len = 0;
54  *id = NULL;
55  break;
56  default:
57  abort();
58  }
59 }
60 
61 static void tc_pkcs1_encoding(bytes_t * out, bytes_t * digest, tc_hash_type_t hash_type) {
62  int k = out->data_len;
63  const uint8_t *hash_desc;
64  int hash_desc_len, digest_len;
65 
66  get_hash_properties(&hash_desc, &hash_desc_len, &digest_len, hash_type);
67 
68  assert(digest->data_len <= digest_len);
69 
70  int D_len = digest_len + hash_desc_len;
71  int P_len = k - 3 - D_len;
72 
73  uint8_t *p = out->data;
74 
75  /* PKCS1 padding */
76  *p++ = 0x00;
77  *p++ = 0x01;
78  memset(p, 0xFF, P_len);
79  p += P_len;
80  *p++ = 0x00;
81 
82  if (hash_desc != NULL) { // ASN.1
83  memcpy(p, hash_desc, hash_desc_len);
84  }
85 
86  p += hash_desc_len;
87 
88  memcpy(p, digest->data, digest->data_len);
89 }
90 
91 bytes_t * tc_prepare_document(const bytes_t * doc, tc_hash_type_t hash_type, const key_metainfo_t * metainfo) {
92  size_t data_len = metainfo->public_key->n->data_len;
93 
94  bytes_t * out = tc_init_bytes(malloc(data_len), data_len);
95  bytes_t digest;
96  switch(hash_type) {
97  case TC_SHA256:
98  {
99  uint8_t hash[32];
100  MHASH sha = mhash_init(MHASH_SHA256);
101  mhash(sha, doc->data, doc->data_len);
102  mhash_deinit(sha, hash);
103 
104  digest.data = hash;
105  digest.data_len = 32;
106  }
107  break;
108  case TC_NONE:
109  {
110  digest.data = doc->data;
111  digest.data_len = doc->data_len;
112  }
113  break;
114  default:
115  abort();
116  };
117 
118  assert(digest.data_len <= data_len);
119  tc_pkcs1_encoding(out, &digest, hash_type);
120  return out;
121 }
bytes_t * tc_prepare_document(const bytes_t *doc, tc_hash_type_t hash_type, const key_metainfo_t *metainfo)
public_key_t * public_key
Definition: tc_internal.h:14
const uint8_t RIPEMD_128_PKCS_ID[]
Structure that&#39;s stores a pointer that points to data_len bytes.
Definition: tc.h:14
bytes_t * n
Definition: tc_internal.h:9
Structure that represents the data about a key share, including its public key.
Definition: tc_internal.h:13
Definition: tc.h:48
const uint8_t MD2_PKCS_ID[]
Definition: tc.h:49
const uint8_t RIPEMD_160_PKCS_ID[]
const uint8_t TIGER_PKCS_ID[]
const uint8_t SHA_160_PKCS_ID[]
const uint8_t SHA_512_PKCS_ID[]
const uint8_t MD5_PKCS_ID[]
void * data
Definition: tc.h:15
uint32_t data_len
Definition: tc.h:16
enum tc_hash_type tc_hash_type_t
Definition: tc.h:51
const uint8_t SHA_224_PKCS_ID[]
bytes_t * tc_init_bytes(void *bs, size_t len)
Definition: structs_init.c:18
const uint8_t SHA_256_PKCS_ID[]
const uint8_t SHA_384_PKCS_ID[]