forked from GPGTools/pinentry-mac
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKeychainSupport.m
77 lines (61 loc) · 2.33 KB
/
KeychainSupport.m
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
/*
Copyright © Roman Zechmeister, 2010
Dieses Programm ist freie Software. Sie können es unter den Bedingungen
der GNU General Public License, wie von der Free Software Foundation
veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
von Nutzen sein wird, aber ohne irgendeine Garantie, sogar ohne die implizite
Garantie der Marktreife oder der Verwendbarkeit für einen bestimmten Zweck.
Details finden Sie in der GNU General Public License.
Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem
Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>.
*/
#import <Security/Security.h>
#import "KeychainSupport.h"
#define GPG_SERVICE_NAME "GnuPG"
void storePassphraseInKeychain(const char *key, const char *passphrase) {
int status;
SecKeychainItemRef itemRef = NULL;
SecKeychainRef keychainRef = NULL;
if (SecKeychainCopyDefault(&keychainRef) != 0) {
return;
}
status = SecKeychainFindGenericPassword (keychainRef, strlen(GPG_SERVICE_NAME), GPG_SERVICE_NAME,
strlen(key), key, NULL, NULL, &itemRef);
if (status == 0) {
if (passphrase) {
SecKeychainItemModifyAttributesAndData (itemRef, NULL, strlen(passphrase), passphrase);
} else {
SecKeychainItemDelete(itemRef);
}
CFRelease(itemRef);
} else {
if (passphrase) {
SecKeychainAddGenericPassword (keychainRef, strlen(GPG_SERVICE_NAME), GPG_SERVICE_NAME,
strlen(key), key, strlen(passphrase), passphrase, NULL);
}
}
CFRelease(keychainRef);
}
char* getPassphraseFromKeychain(const char *key) {
int status;
char *passphrase;
UInt32 passphraseLength;
void *passphraseData = NULL;
SecKeychainRef keychainRef = NULL;
if (SecKeychainCopyDefault(&keychainRef) != 0) {
return NULL;
}
status = SecKeychainFindGenericPassword (keychainRef, strlen(GPG_SERVICE_NAME), GPG_SERVICE_NAME,
strlen(key), key, &passphraseLength, &passphraseData, NULL);
CFRelease(keychainRef);
if (status != 0) {
return NULL;
}
passphrase = malloc(passphraseLength + 1);
passphrase[passphraseLength] = 0;
memcpy(passphrase, passphraseData, passphraseLength);
SecKeychainItemFreeContent(NULL, passphraseData);
return passphrase;
}