@@ -140,7 +140,7 @@ const char *evaluateCert(){
140
140
return "";
141
141
}
142
142
143
- const char *getExpirationDate(){
143
+ const char *getExpirationDate(char *expirationDate ){
144
144
// Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate.
145
145
NSDictionary *getquery = @{
146
146
(id)kSecClass: (id)kSecClassCertificate,
@@ -154,24 +154,39 @@ const char *getExpirationDate(){
154
154
// Use this function to check for errors
155
155
err = SecItemCopyMatching((CFDictionaryRef)getquery, (CFTypeRef *)&cert);
156
156
157
- if (err != errSecItemNotFound && err != noErr){
157
+ if (err != noErr){
158
158
NSString *errString = [@"Error: " stringByAppendingFormat:@"%d", err];
159
159
NSLog(@"%@", errString);
160
- return "" ;
160
+ return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]] ;
161
161
}
162
162
163
163
// Get data from the certificate. We just need the "invalidity date" property.
164
164
CFDictionaryRef valuesDict = SecCertificateCopyValues(cert, (__bridge CFArrayRef)@[(__bridge id)kSecOIDInvalidityDate], NULL);
165
165
166
- // TODO: Error checking.
167
- CFDictionaryRef invalidityDateDictionaryRef = CFDictionaryGetValue(valuesDict, kSecOIDInvalidityDate);
168
- CFTypeRef invalidityRef = CFDictionaryGetValue(invalidityDateDictionaryRef, kSecPropertyKeyValue);
169
- id expirationDateValue = CFBridgingRelease(invalidityRef);
170
-
171
- CFRelease(valuesDict);
166
+ id expirationDateValue;
167
+ if(valuesDict){
168
+ CFDictionaryRef invalidityDateDictionaryRef = CFDictionaryGetValue(valuesDict, kSecOIDInvalidityDate);
169
+ if(invalidityDateDictionaryRef){
170
+ CFTypeRef invalidityRef = CFDictionaryGetValue(invalidityDateDictionaryRef, kSecPropertyKeyValue);
171
+ if(invalidityRef){
172
+ expirationDateValue = CFBridgingRelease(invalidityRef);
173
+ }
174
+ }
175
+ CFRelease(valuesDict);
176
+ }
172
177
173
178
NSString *outputString = [@"" stringByAppendingFormat:@"%@", expirationDateValue];
174
- return [outputString cStringUsingEncoding:[NSString defaultCStringEncoding]];
179
+ if([outputString isEqualToString:@""]){
180
+ NSString *errString = @"Error: the expiration date of the certificate could not be found";
181
+ NSLog(@"%@", errString);
182
+ return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]];
183
+ }
184
+
185
+ // This workaround allows to obtain the expiration date alongside the error message
186
+ strncpy(expirationDate, [outputString cStringUsingEncoding:[NSString defaultCStringEncoding]], 32);
187
+ expirationDate[32-1] = 0;
188
+
189
+ return "";
175
190
}
176
191
*/
177
192
import "C"
@@ -233,10 +248,15 @@ func EvaluateCertificates() error {
233
248
// GetExpirationDate returns the expiration date of a certificate stored in the keychain
234
249
func GetExpirationDate () (string , error ) {
235
250
log .Infof ("Retrieving certificate's expiration date" )
236
- p := C .getExpirationDate ()
251
+ dateString := C .CString ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) // 32 characters string
252
+ defer C .free (unsafe .Pointer (dateString ))
253
+ p := C .getExpirationDate (dateString )
237
254
s := C .GoString (p )
238
255
if len (s ) != 0 {
239
- return s , nil
256
+ oscmd := exec .Command ("osascript" , "-e" , "display dialog \" " + s + "\" buttons \" OK\" with title \" Arduino Agent: Error retrieving expiration date\" " )
257
+ _ = oscmd .Run ()
258
+ return "" , errors .New (s )
240
259
}
241
- return "" , nil
260
+ date := C .GoString (dateString )
261
+ return date , nil
242
262
}
0 commit comments