]> git.ipfire.org Git - thirdparty/shairport-sync.git/blob - common.c
Add copyright notices.
[thirdparty/shairport-sync.git] / common.c
1 /*
2 * Utility routines. This file is part of Shairport.
3 * Copyright (c) James Laird 2013
4 * All rights reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
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.
25 */
26
27 #include <stdio.h>
28 #include <stdarg.h>
29 #include <stdlib.h>
30 #include <memory.h>
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>
36 #include "common.h"
37
38 shairport_cfg config;
39
40 int debuglev = 0;
41
42 void die(char *format, ...) {
43 fprintf(stderr, "FATAL: ");
44 va_list args;
45 va_start(args, format);
46 vfprintf(stderr, format, args);
47 va_end(args);
48 exit(1);
49 }
50
51 void warn(char *format, ...) {
52 fprintf(stderr, "WARNING: ");
53 va_list args;
54 va_start(args, format);
55 vfprintf(stderr, format, args);
56 va_end(args);
57 }
58
59 void debug(char *format, ...) {
60 if (!debuglev)
61 return;
62 fprintf(stderr, "DEBUG: ");
63 va_list args;
64 va_start(args, format);
65 vfprintf(stderr, format, args);
66 va_end(args);
67 }
68
69
70 char *base64_enc(uint8_t *input, int length) {
71 BIO *bmem, *b64;
72 BUF_MEM *bptr;
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);
78 BIO_flush(b64);
79 BIO_get_mem_ptr(b64, &bptr);
80
81 char *buf = (char *)malloc(bptr->length);
82 if (bptr->length) {
83 memcpy(buf, bptr->data, bptr->length-1);
84 buf[bptr->length-1] = 0;
85 }
86
87 BIO_free_all(bmem);
88
89 return buf;
90 }
91
92 uint8_t *base64_dec(char *input, int *outlen) {
93 BIO *bmem, *b64;
94 int inlen = strlen(input);
95
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);
100
101 // Apple cut the padding off their challenges; restore it
102 BIO_write(bmem, input, inlen);
103 while (inlen++ & 3)
104 BIO_write(bmem, "=", 1);
105 BIO_flush(bmem);
106
107 int bufsize = strlen(input)*3/4 + 1;
108 uint8_t *buf = malloc(bufsize);
109 int nread;
110
111 nread = BIO_read(b64, buf, bufsize);
112
113 BIO_free_all(bmem);
114
115 *outlen = nread;
116 return buf;
117 }
118
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-----";
143
144 uint8_t *rsa_apply(uint8_t *input, int inlen, int *outlen, int mode) {
145 static RSA *rsa = NULL;
146
147 if (!rsa) {
148 BIO *bmem = BIO_new_mem_buf(super_secret_key, -1);
149 rsa = PEM_read_bio_RSAPrivateKey(bmem, NULL, NULL, NULL);
150 BIO_free(bmem);
151 }
152
153 uint8_t *out = malloc(RSA_size(rsa));
154 switch (mode) {
155 case RSA_MODE_AUTH:
156 *outlen = RSA_private_encrypt(inlen, input, out, rsa,
157 RSA_PKCS1_PADDING);
158 break;
159 case RSA_MODE_KEY:
160 *outlen = RSA_private_decrypt(inlen, input, out, rsa,
161 RSA_PKCS1_OAEP_PADDING);
162 break;
163 default:
164 die("bad rsa mode");
165 }
166 return out;
167 }