1 /* hash.c
2  *
3  * Copyright (c) 2019 Apple Computer, Inc. All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * DNS SIG(0) signature generation for DNSSD SRP using Security Framework.
18  *
19  * Functions required for loading, saving, and generating public/private keypairs, extracting the public key
20  * into KEY RR data, and computing hashatures.
21  */
22 
23 #include <stdio.h>
24 #include <arpa/inet.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29 #include <errno.h>
30 
31 #include "srp.h"
32 #include "dns-msg.h"
33 #define SRP_CRYPTO_MACOS_INTERNAL
34 #include "srp-crypto.h"
35 
36 // Function to generate a signature given some data and a private key
37 void
srp_hmac_iov(hmac_key_t * key,uint8_t * output,size_t max,struct iovec * iov,int count)38 srp_hmac_iov(hmac_key_t *key, uint8_t *output, size_t max, struct iovec *iov, int count)
39 {
40     // int digest_size = 0;
41     // int i, line;
42     (void)count;(void)iov;(void)output; (void)key; (void)max;
43 #define KABLOOIE line = __LINE__ - 1; goto kablooie
44 #if 0
45     switch(key->algorithm) {
46     case  SRP_HMAC_TYPE_SHA256:
47         // digest_size = mbedtls_md_get_size(md_type);
48         // break;
49     default:
50         ERROR("srp_hmac_iov: unsupported HMAC hash algorithm: %d", key->algorithm);
51         return;
52     }
53     if (max < digest_size) {
54         ERROR("srp_hmac_iov: not enough space in output buffer (%lu) for hash (%d).",
55               (unsigned long)max, digest_size);
56         return;
57     }
58 #endif
59     // if ((status = mbedtls_md_hmac_starts(&ctx, key->secret, key->length)) != 0) {
60     //     KABLOOIE;
61     // }
62 	// for (i = 0; i < count; i++) {
63     //     if ((status = mbedtls_md_hmac_update(&ctx, iov[i].iov_base, iov[i].iov_len)) != 0) {
64     //         KABLOOIE;
65     //     }
66 	// }
67 	// if ((status = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
68     //     KABLOOIE;
69 	// }
70 }
71 
72 int
srp_base64_parse(char * src,size_t * len_ret,uint8_t * buf,size_t buflen)73 srp_base64_parse(char *src, size_t *len_ret, uint8_t *buf, size_t buflen)
74 {
75     (void)src; (void)len_ret; (void)buf; (void)buflen;
76 #if 0
77     size_t slen = strlen(src);
78     int ret = mbedtls_base64_decode(buf, buflen, len_ret, (const unsigned char *)src, slen);
79     if (ret == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) {
80         return ENOBUFS;
81     } else if (ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER) {
82         return EILSEQ;
83     } else if (ret < 0) {
84         return EINVAL;
85     }
86     return 0;
87 #else
88     return EINVAL;
89 #endif
90 }
91 
92 // Local Variables:
93 // mode: C
94 // tab-width: 4
95 // c-file-style: "bsd"
96 // c-basic-offset: 4
97 // fill-column: 108
98 // indent-tabs-mode: nil
99 // End:
100