]>
git.ipfire.org Git - thirdparty/shairport-sync.git/blob - common.c
2 * Utility routines. This file is part of Shairport.
3 * Copyright (c) James Laird 2013
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
31 #include <openssl/rsa.h>
32 #include <openssl/pem.h>
33 #include <openssl/evp.h>
34 #include <openssl/bio.h>
35 #include <openssl/buffer.h>
42 void die(char *format
, ...) {
43 fprintf(stderr
, "FATAL: ");
45 va_start(args
, format
);
46 vfprintf(stderr
, format
, args
);
51 void warn(char *format
, ...) {
52 fprintf(stderr
, "WARNING: ");
54 va_start(args
, format
);
55 vfprintf(stderr
, format
, args
);
59 void debug(char *format
, ...) {
62 fprintf(stderr
, "DEBUG: ");
64 va_start(args
, format
);
65 vfprintf(stderr
, format
, args
);
70 char *base64_enc(uint8_t *input
, int length
) {
73 b64
= BIO_new(BIO_f_base64());
74 bmem
= BIO_new(BIO_s_mem());
75 b64
= BIO_push(b64
, bmem
);
76 BIO_set_flags(b64
, BIO_FLAGS_BASE64_NO_NL
);
77 BIO_write(b64
, input
, length
);
79 BIO_get_mem_ptr(b64
, &bptr
);
81 char *buf
= (char *)malloc(bptr
->length
);
83 memcpy(buf
, bptr
->data
, bptr
->length
-1);
84 buf
[bptr
->length
-1] = 0;
92 uint8_t *base64_dec(char *input
, int *outlen
) {
94 int inlen
= strlen(input
);
96 b64
= BIO_new(BIO_f_base64());
97 BIO_set_flags(b64
, BIO_FLAGS_BASE64_NO_NL
);
98 bmem
= BIO_new(BIO_s_mem());
99 b64
= BIO_push(b64
, bmem
);
101 // Apple cut the padding off their challenges; restore it
102 BIO_write(bmem
, input
, inlen
);
104 BIO_write(bmem
, "=", 1);
107 int bufsize
= strlen(input
)*3/4 + 1;
108 uint8_t *buf
= malloc(bufsize
);
111 nread
= BIO_read(b64
, buf
, bufsize
);
119 static char super_secret_key
[] =
120 "-----BEGIN RSA PRIVATE KEY-----\n"
121 "MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\n"
122 "wC5vOYvfDmFI6oSFXi5ELabWJmT2dKHzBJKa3k9ok+8t9ucRqMd6DZHJ2YCCLlDRKSKv6kDqnw4U\n"
123 "wPdpOMXziC/AMj3Z/lUVX1G7WSHCAWKf1zNS1eLvqr+boEjXuBOitnZ/bDzPHrTOZz0Dew0uowxf\n"
124 "/+sG+NCK3eQJVxqcaJ/vEHKIVd2M+5qL71yJQ+87X6oV3eaYvt3zWZYD6z5vYTcrtij2VZ9Zmni/\n"
125 "UAaHqn9JdsBWLUEpVviYnhimNVvYFZeCXg/IdTQ+x4IRdiXNv5hEewIDAQABAoIBAQDl8Axy9XfW\n"
126 "BLmkzkEiqoSwF0PsmVrPzH9KsnwLGH+QZlvjWd8SWYGN7u1507HvhF5N3drJoVU3O14nDY4TFQAa\n"
127 "LlJ9VM35AApXaLyY1ERrN7u9ALKd2LUwYhM7Km539O4yUFYikE2nIPscEsA5ltpxOgUGCY7b7ez5\n"
128 "NtD6nL1ZKauw7aNXmVAvmJTcuPxWmoktF3gDJKK2wxZuNGcJE0uFQEG4Z3BrWP7yoNuSK3dii2jm\n"
129 "lpPHr0O/KnPQtzI3eguhe0TwUem/eYSdyzMyVx/YpwkzwtYL3sR5k0o9rKQLtvLzfAqdBxBurciz\n"
130 "aaA/L0HIgAmOit1GJA2saMxTVPNhAoGBAPfgv1oeZxgxmotiCcMXFEQEWflzhWYTsXrhUIuz5jFu\n"
131 "a39GLS99ZEErhLdrwj8rDDViRVJ5skOp9zFvlYAHs0xh92ji1E7V/ysnKBfsMrPkk5KSKPrnjndM\n"
132 "oPdevWnVkgJ5jxFuNgxkOLMuG9i53B4yMvDTCRiIPMQ++N2iLDaRAoGBAO9v//mU8eVkQaoANf0Z\n"
133 "oMjW8CN4xwWA2cSEIHkd9AfFkftuv8oyLDCG3ZAf0vrhrrtkrfa7ef+AUb69DNggq4mHQAYBp7L+\n"
134 "k5DKzJrKuO0r+R0YbY9pZD1+/g9dVt91d6LQNepUE/yY2PP5CNoFmjedpLHMOPFdVgqDzDFxU8hL\n"
135 "AoGBANDrr7xAJbqBjHVwIzQ4To9pb4BNeqDndk5Qe7fT3+/H1njGaC0/rXE0Qb7q5ySgnsCb3DvA\n"
136 "cJyRM9SJ7OKlGt0FMSdJD5KG0XPIpAVNwgpXXH5MDJg09KHeh0kXo+QA6viFBi21y340NonnEfdf\n"
137 "54PX4ZGS/Xac1UK+pLkBB+zRAoGAf0AY3H3qKS2lMEI4bzEFoHeK3G895pDaK3TFBVmD7fV0Zhov\n"
138 "17fegFPMwOII8MisYm9ZfT2Z0s5Ro3s5rkt+nvLAdfC/PYPKzTLalpGSwomSNYJcB9HNMlmhkGzc\n"
139 "1JnLYT4iyUyx6pcZBmCd8bD0iwY/FzcgNDaUmbX9+XDvRA0CgYEAkE7pIPlE71qvfJQgoA9em0gI\n"
140 "LAuE4Pu13aKiJnfft7hIjbK+5kyb3TysZvoyDnb3HOKvInK7vXbKuU4ISgxB2bB3HcYzQMGsz1qJ\n"
141 "2gG0N5hvJpzwwhbhXqFKA4zaaSrw622wDniAK5MlIE0tIAKKP4yxNGjoD2QYjhBGuhvkWKY=\n"
142 "-----END RSA PRIVATE KEY-----";
144 uint8_t *rsa_apply(uint8_t *input
, int inlen
, int *outlen
, int mode
) {
145 static RSA
*rsa
= NULL
;
148 BIO
*bmem
= BIO_new_mem_buf(super_secret_key
, -1);
149 rsa
= PEM_read_bio_RSAPrivateKey(bmem
, NULL
, NULL
, NULL
);
153 uint8_t *out
= malloc(RSA_size(rsa
));
156 *outlen
= RSA_private_encrypt(inlen
, input
, out
, rsa
,
160 *outlen
= RSA_private_decrypt(inlen
, input
, out
, rsa
,
161 RSA_PKCS1_OAEP_PADDING
);