// The returned SecKeychainRef, if non-nil, must be released via CFRelease. func createKeychain(path string, promptUser bool, password string) (C.SecKeychainRef, error) { pathName := C.CString(path) defer C.free(unsafe.Pointer(pathName)) var kref C.SecKeychainRef var errCode C.OSStatus if promptUser { errCode = C.SecKeychainCreate(pathName, C.UInt32(0), nil, C.Boolean(1), nil, &kref) } else { passwordRef := C.CString(password) defer C.free(unsafe.Pointer(passwordRef)) errCode = C.SecKeychainCreate(pathName, C.UInt32(len(password)), unsafe.Pointer(passwordRef), C.Boolean(0), nil, &kref) } if err := newKeychainError(errCode); err != nil { return nil, err } return kref, nil }
func newKeychain(path, password string, promptUser bool) (Keychain, error) { pathRef := C.CString(path) defer C.free(unsafe.Pointer(pathRef)) var errCode C.OSStatus var kref C.SecKeychainRef if promptUser { errCode = C.SecKeychainCreate(pathRef, C.UInt32(0), nil, C.Boolean(1), nil, &kref) } else { passwordRef := C.CString(password) defer C.free(unsafe.Pointer(passwordRef)) errCode = C.SecKeychainCreate(pathRef, C.UInt32(len(password)), unsafe.Pointer(passwordRef), C.Boolean(0), nil, &kref) } // TODO: Without passing in kref I get 'One or more parameters passed to the function were not valid (-50)' defer Release(C.CFTypeRef(kref)) if err := checkError(errCode); err != nil { return Keychain{}, err } return Keychain{path}, nil }