-
Notifications
You must be signed in to change notification settings - Fork 0
/
decrypt_meta_data.c
152 lines (113 loc) · 5.48 KB
/
decrypt_meta_data.c
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/pem.h>
#include <openssl/engine.h>
// Taken from https://gist.github.com/barrysteyn/7308212
size_t calcDecodeLength(const char* b64input) { //Calculates the length of a decoded string
size_t len = strlen(b64input),
padding = 0;
if (b64input[len-1] == '=' && b64input[len-2] == '=') //last two chars are =
padding = 2;
else if (b64input[len-1] == '=') //last char is =
padding = 1;
return (len*3)/4 - padding;
}
// Taken from https://gist.github.com/barrysteyn/7308212
int Base64Decode(char* b64message, unsigned char** buffer, size_t* length) { //Decodes a base64 encoded string
BIO *bio, *b64;
int decodeLen = calcDecodeLength(b64message);
*buffer = (unsigned char*)malloc(decodeLen + 1);
(*buffer)[decodeLen] = '\0';
bio = BIO_new_mem_buf(b64message, -1);
b64 = BIO_new(BIO_f_base64());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
*length = BIO_read(bio, *buffer, strlen(b64message));
assert(*length == decodeLen); //length should equal decodeLen, else something went horribly wrong
BIO_free_all(bio);
return (0); //success
}
// Taken from https://gist.github.com/barrysteyn/7308212
int Base64Encode(const unsigned char* buffer, size_t length, char** b64text) {
BIO* bio;
BIO* b64;
BUF_MEM* bufferPtr;
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
BIO_write(bio, buffer, length);
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bufferPtr);
BIO_set_close(bio, BIO_NOCLOSE);
BIO_free_all(bio);
//*b64text=(*bufferPtr).data;
return (0); //success
}
int main(int argc, char **argv) {
char private[] = "-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDsn0JKS/THu328z1IgN0VzYU53HjSX03WJIgWkmyTaxbiKpoJaKbksXmfSpgzVGzKFvGfZ03fwFrN7Q8P8R2e8SNiell7mh1TDw9/0P7Bt/ER8PJrXORo+GviKHxaLr7Y0BJX9i/nW/L0L/VaE8CZTAqYBdcSJGgHJjY4UMf892ZPTa9T2Dl3ggdMZ7BQ2kiCiCC3qV99b0igRJGmmLQaGiAflhFzuDQPMifUMq75wI8RSRPdxUAtjTfkl68QHu7Umyeyy33OQgdUKaTl5zcS3VSQbNjveVCNM4RDH1RlEc+7Wf1BY8APqT6jbiBcROJD2CeoLH2eiIJCi+61ZkSGfAgMBAAECggEBALFStCHrhBf+GL9a+qer4/8QZ/X6i91PmaBX/7SYk2jjjWVSXRNmex+V6+Y/jBRT2mvAgm8J+7LPwFdatE+lz0aZrMRD2gCWYF6Itpda90OlLkmQPVWWtGTgX2ta2tF5r2iSGzk0IdoL8zw98Q2UzpOcw30KnWtFMxuxWk0mHqpgp00g80cDWg3+RPbWOhdLp5bflQ36fKDfmjq05cGlIk6unnVyC5HXpvh4d4k2EWlXrjGsndVBPCjGkZePlLRgDHxT06r+5XdJ+1CBDZgCsmjGz3M8uOHyCfVW0WhB7ynzDTagVgz0iqpuhAi9sPt6iWWwpAnRw8cQgqEKw9bvKKECgYEA/WPi2PJtL6u/xlysh/H7A717CId6fPHCMDace39ZNtzUzc0nT5BemlcF0wZ74NeJSur3Q395YzB+eBMLs5p8mA95wgGvJhM65/J+HX+k9kt6Z556zLMvtG+j1yo4D0VEwm3xahB4SUUP+1kD7dNvo4+8xeSCyjzNllvYZZC0DrECgYEA7w8pEqhHHn0a+twkPCZJS+gQTB9Rm+FBNGJqB3XpWsTeLUxYRbVGk0iDve+eeeZ41drxcdyWP+WcL34hnrjgI1Fo4mK88saajpwUIYMy6+qMLY+jC2NRSBox56eH7nsVYvQQK9eKqv9wbB+PF9SwOIvuETN7fd8mAY02UnoaaU8CgYBoHRKocXPLkpZJuuppMVQiRUi4SHJbxDo19Tp2w+y0TihiJ1lvp7I3WGpcOt3LlMQktEbExSvrRZGxZKH6Og/XqwQsYuTEkEIz679F/5yYVosE6GkskrOXQAfh8Mb3/04xVVtMaVgDQw0+CWVD4wyL+BNofGwBDNqsXTCdCsfxAQKBgQCDv2EtbRw0y1HRKv21QIxoju5cZW4+cDfVPN+eWPdQFOs1H7wOPsc0aGRiiupV2BSEF3O1ApKziEE5U1QH+29bR4R8L1pemeGX8qCNj5bCubKjcWOz5PpouDcEqimZ3q98p3E6GEHN15UHoaTkx0yO/V8oj6zhQ9fYRxDHB5ACtQKBgQCOO7TJUO1IaLTjcrwS4oCfJyRnAdz49L1AbVJkIBK0fhJLecOFu3ZlQl/RStQb69QKb5MNOIMmQhg8WOxZxHcpmIDbkDAm/J/ovJXFSoBdOr5ouQsYsDZhsWW97zvLMzg5pH9/3/1BNz5q3Vu4HgfBSwWGt4E2NENj+XA+QAVmGA==\n"
"-----END RSA PRIVATE KEY-----";
char md[] = "M20PkGB5sm95+xPVghQWkQ==";
char me[] = "XPUVMfWoncNybAiLFcYpFgL6cnKH4rt80nc1NEsZfp2FleWkYIzkNN7GD01k0qVdnFZGKreaLceZ+QnPPLMsbuhF50hcMPQN2wRYTQMfsxX1vk/C6RShGX18/xp19Fg8aVTMCORIyCXpXHHwdboOaz1gdJYlDydhXD37xKNxdiGBbR/7d1E25E59Hnx331jO8aeaje7YW5F/g0GzEWNXvWSkXKWCuhtepgX/WwBQspyDcarpvKkALb7KdzGxq2OcpWGEcjoDsAU3IghmbIDYxm+f5wk/D/kBTr/0UIY+wlV+h8peBEVbqTk/1hmzolU25jDEvvIVSxRQ/cs27cv1gQ==";
BIO *bio = BIO_new(BIO_s_mem());
BIO_write(bio, private, strlen(private));
EVP_PKEY *key = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
if (key == NULL) {
printf("COULD NOT PARSE KEY\n");
return -1;
}
unsigned char *me2 = NULL;
size_t me2_l;
Base64Decode(me, &me2, &me2_l);
ENGINE *e = ENGINE_get_default_RSA();
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key,e);
if (ctx == NULL) {
printf("COULD NOT INIT CTX\n");
return -2;
}
int err = EVP_PKEY_decrypt_init(ctx);
if (err != 1) {
printf("INIT ERROR\n");
return -3;
}
err = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
if (err <= 0) {
printf("RSA PADDING SET\n");
return -5;
}
err = EVP_PKEY_CTX_set_rsa_oaep_md(ctx, EVP_sha256());
if (err <= 0) {
printf("RSA OEAP MD\n");
return -6;
}
err = EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, EVP_sha256());
if (err <= 0) {
printf("RSA MGF1\n");
return -7;
}
unsigned char *out = NULL;
size_t outlen = 0;
err = EVP_PKEY_decrypt(ctx, NULL, &outlen, me2, me2_l);
if (err <= 0) {
printf("DECRYPT ERROR\n");
return -5;
}
printf("Len = %d\n", outlen);
out = (unsigned char *)calloc(sizeof(char), outlen);
err = EVP_PKEY_decrypt(ctx, out, &outlen, me2, me2_l);
if (err <= 0) {
printf("DECRYPT ERROR\n");
return -5;
}
printf("1: %s\n", out);
printf("2: %s\n", md);
unsigned char *mk = NULL;
size_t mk_l;
Base64Decode(out, &mk, &mk_l);
printf("3: %s\n", mk);
return 0;
}