@@ -140,7 +140,7 @@ const char *evaluateCert(){
140140 return "";
141141}
142142
143- const char *getExpirationDate(){
143+ const char *getExpirationDate(char *expirationDate ){
144144 // Create a key-value dictionary used to query the Keychain and look for the "Arduino" root certificate.
145145 NSDictionary *getquery = @{
146146 (id)kSecClass: (id)kSecClassCertificate,
@@ -154,24 +154,39 @@ const char *getExpirationDate(){
154154 // Use this function to check for errors
155155 err = SecItemCopyMatching((CFDictionaryRef)getquery, (CFTypeRef *)&cert);
156156
157- if (err != errSecItemNotFound && err != noErr){
157+ if (err != noErr){
158158 NSString *errString = [@"Error: " stringByAppendingFormat:@"%d", err];
159159 NSLog(@"%@", errString);
160- return "" ;
160+ return [errString cStringUsingEncoding:[NSString defaultCStringEncoding]] ;
161161 }
162162
163163 // Get data from the certificate. We just need the "invalidity date" property.
164164 CFDictionaryRef valuesDict = SecCertificateCopyValues(cert, (__bridge CFArrayRef)@[(__bridge id)kSecOIDInvalidityDate], NULL);
165165
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+ }
172177
173178 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 "";
175190}
176191*/
177192import "C"
@@ -233,10 +248,15 @@ func EvaluateCertificates() error {
233248// GetExpirationDate returns the expiration date of a certificate stored in the keychain
234249func GetExpirationDate () (string , error ) {
235250 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 )
237254 s := C .GoString (p )
238255 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 )
240259 }
241- return "" , nil
260+ date := C .GoString (dateString )
261+ return date , nil
242262}
0 commit comments