motion-provisioning 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/bin/console +6 -0
- data/bin/setup +9 -0
- data/export_private_key/export_private_key.c +144 -0
- data/lib/motion-provisioning/version.rb +1 -1
- metadata +8 -21
- data/bin/export_private_key +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e5eb84d598dcfa9dafb47c3391a8a94ae2dc3b2f5961e748237e5b290250b12
|
4
|
+
data.tar.gz: 5325af62491a2016c2a27e58ecc3385248e40ec37984cd940d20b8e8e19c2c48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 256c4993b4af03cd0b36493b82c870d28e9534bc872944f43364ff8f394227aa8abb96811e113ac043133ac9c4815ce7444caa1e82f2568bf1cdc7d6a25fe675
|
7
|
+
data.tar.gz: 150beea08fcc7b495bf6339a598616c541c7ed9751aad40740d99ccd38619fd22c1a630541b77e3dea3ecd8053630cdb57b3a185c5a1ecc825b32e62809e56cb
|
data/README.md
CHANGED
data/bin/console
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
/*
|
2
|
+
* This file contains modified code with copyright:
|
3
|
+
*
|
4
|
+
* Copyright (c) 2003-2010,2012,2014 Apple Inc. All Rights Reserved.
|
5
|
+
*
|
6
|
+
* Covered by the APPLE PUBLIC SOURCE LICENSE
|
7
|
+
* (http://opensource.apple.com/license/apsl/)
|
8
|
+
*/
|
9
|
+
|
10
|
+
#import <CoreFoundation/CoreFoundation.h>
|
11
|
+
#import <Security/Security.h>
|
12
|
+
|
13
|
+
#define DEBUG 0
|
14
|
+
|
15
|
+
unsigned char
|
16
|
+
hexValue(char c)
|
17
|
+
{
|
18
|
+
static const char digits[] = "0123456789abcdef";
|
19
|
+
char *p;
|
20
|
+
if (p = strchr(digits, tolower(c)))
|
21
|
+
return p - digits;
|
22
|
+
else
|
23
|
+
return 0;
|
24
|
+
}
|
25
|
+
|
26
|
+
void
|
27
|
+
fromHex(const char *hexDigits, CSSM_DATA *data)
|
28
|
+
{
|
29
|
+
size_t bytes = strlen(hexDigits) / 2; // (discards malformed odd end)
|
30
|
+
if (bytes > data->Length)
|
31
|
+
return;
|
32
|
+
// length(bytes); // (will assert if we try to grow it)
|
33
|
+
size_t n;
|
34
|
+
for (n = 0; n < bytes; n++) {
|
35
|
+
data->Data[n] = (uint8)(hexValue(hexDigits[2*n]) << 4 | hexValue(hexDigits[2*n+1]));
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
int main(int argc, char *argv[]) {
|
40
|
+
|
41
|
+
if (argc != 4) {
|
42
|
+
exit(1);
|
43
|
+
}
|
44
|
+
|
45
|
+
char* identity_name = argv[1];
|
46
|
+
char* hash = argv[2];
|
47
|
+
char* key_password = argv[3];
|
48
|
+
|
49
|
+
// First get a list of Identities matching the specified name
|
50
|
+
const void* values[] = {
|
51
|
+
kSecClassIdentity,
|
52
|
+
kCFBooleanTrue,
|
53
|
+
CFStringCreateWithCString(NULL, identity_name, kCFStringEncodingUTF8),
|
54
|
+
kSecMatchLimitAll
|
55
|
+
};
|
56
|
+
const void* keys[] = {
|
57
|
+
kSecClass,
|
58
|
+
kSecReturnRef,
|
59
|
+
kSecMatchSubjectContains,
|
60
|
+
kSecMatchLimit
|
61
|
+
};
|
62
|
+
CFIndex numValues = sizeof(keys)/sizeof(void*);
|
63
|
+
CFDictionaryRef query = CFDictionaryCreate(NULL, keys, values, numValues, NULL, NULL);
|
64
|
+
|
65
|
+
CFTypeRef results;
|
66
|
+
if (SecItemCopyMatching(query, &results) != noErr) {
|
67
|
+
exit(1);
|
68
|
+
}
|
69
|
+
|
70
|
+
// Prepare the Identity hash
|
71
|
+
CSSM_DATA hashData = { 0, NULL };
|
72
|
+
CSSM_SIZE len = strlen(hash)/2;
|
73
|
+
hashData.Length = len;
|
74
|
+
hashData.Data = (uint8 *)malloc(hashData.Length);
|
75
|
+
fromHex(hash, &hashData);
|
76
|
+
|
77
|
+
SecIdentityRef item;
|
78
|
+
CSSM_DATA certData = { 0, NULL };
|
79
|
+
SecCertificateRef cert = NULL;
|
80
|
+
Boolean found = FALSE;
|
81
|
+
|
82
|
+
// Check all found identitied, looking for one whose certificate matches the
|
83
|
+
// specified hash
|
84
|
+
CFIndex count = CFArrayGetCount(results);
|
85
|
+
for (int i = 0; i < count; i++) {
|
86
|
+
item = CFArrayGetValueAtIndex(results, i);
|
87
|
+
|
88
|
+
if (SecIdentityCopyCertificate(item, &cert) != noErr) {
|
89
|
+
CFRelease(&item);
|
90
|
+
continue;
|
91
|
+
}
|
92
|
+
|
93
|
+
if (SecCertificateGetData(cert, &certData) != noErr) {
|
94
|
+
CFRelease(&cert);
|
95
|
+
CFRelease(&item);
|
96
|
+
continue;
|
97
|
+
}
|
98
|
+
|
99
|
+
uint8 candidate_sha1_hash[20];
|
100
|
+
CSSM_DATA digest;
|
101
|
+
digest.Length = sizeof(candidate_sha1_hash);
|
102
|
+
digest.Data = candidate_sha1_hash;
|
103
|
+
if ((SecDigestGetData(CSSM_ALGID_SHA1, &digest, &certData) == CSSM_OK) &&
|
104
|
+
(hashData.Length == digest.Length) &&
|
105
|
+
(!memcmp(hashData.Data, digest.Data, digest.Length))) {
|
106
|
+
found = TRUE;
|
107
|
+
break;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
if (found) {
|
112
|
+
#if DEBUG
|
113
|
+
CFStringRef nameRef = NULL;
|
114
|
+
if (SecCertificateCopyCommonName(cert, &nameRef) != noErr) {
|
115
|
+
exit(1);
|
116
|
+
}
|
117
|
+
|
118
|
+
char *cert_name = CFStringGetCStringPtr(nameRef, kCFStringEncodingUTF8);
|
119
|
+
printf("%s\n", cert_name);
|
120
|
+
#endif
|
121
|
+
|
122
|
+
// Finally, get the encrypted private key using the specified password
|
123
|
+
// and print it to stdout in PEM format
|
124
|
+
SecKeyRef key = NULL;
|
125
|
+
if (SecIdentityCopyPrivateKey(item, &key) != noErr) {
|
126
|
+
exit(1);
|
127
|
+
}
|
128
|
+
|
129
|
+
SecKeyImportExportParameters keyParams;
|
130
|
+
keyParams.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
|
131
|
+
keyParams.flags = 0;
|
132
|
+
keyParams.passphrase = CFDataCreate(NULL, key_password, 5);
|
133
|
+
keyParams.alertTitle = 0;
|
134
|
+
keyParams.alertPrompt = 0;
|
135
|
+
|
136
|
+
CFDataRef key_data;
|
137
|
+
OSStatus status = SecKeychainItemExport(key, kSecFormatWrappedPKCS8,
|
138
|
+
kSecItemPemArmour, &keyParams, &key_data);
|
139
|
+
|
140
|
+
if(status == noErr) {
|
141
|
+
write(fileno(stdout), CFDataGetBytePtr(key_data), CFDataGetLength(key_data));
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-provisioning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Villacampa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -36,28 +36,14 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 2.113
|
39
|
+
version: '2.113'
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 2.113
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: bundler
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '1.12'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '1.12'
|
46
|
+
version: '2.113'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: rake
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,7 +124,9 @@ extra_rdoc_files: []
|
|
138
124
|
files:
|
139
125
|
- LICENSE.txt
|
140
126
|
- README.md
|
141
|
-
- bin/
|
127
|
+
- bin/console
|
128
|
+
- bin/setup
|
129
|
+
- export_private_key/export_private_key.c
|
142
130
|
- lib/motion-provisioning.rb
|
143
131
|
- lib/motion-provisioning/application.rb
|
144
132
|
- lib/motion-provisioning/certificate.rb
|
@@ -169,8 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
157
|
- !ruby/object:Gem::Version
|
170
158
|
version: '0'
|
171
159
|
requirements: []
|
172
|
-
|
173
|
-
rubygems_version: 2.7.6
|
160
|
+
rubygems_version: 3.0.6
|
174
161
|
signing_key:
|
175
162
|
specification_version: 4
|
176
163
|
summary: Simplified provisioning for RubyMotion iOS, tvOS and macOS apps.
|
data/bin/export_private_key
DELETED
Binary file
|