func loadSystemRoots() (*CertPool, error) { roots := NewCertPool() var data C.CFDataRef = nil var untrustedData C.CFDataRef = nil err := C.FetchPEMRoots(&data, &untrustedData) if err == -1 { // TODO: better error message return nil, errors.New("crypto/x509: failed to load darwin system roots with cgo") } defer C.CFRelease(C.CFTypeRef(data)) buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data))) roots.AppendCertsFromPEM(buf) if untrustedData == nil { return roots, nil } defer C.CFRelease(C.CFTypeRef(untrustedData)) buf = C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(untrustedData)), C.int(C.CFDataGetLength(untrustedData))) untrustedRoots := NewCertPool() untrustedRoots.AppendCertsFromPEM(buf) trustedRoots := NewCertPool() for _, c := range roots.certs { if !untrustedRoots.contains(c) { trustedRoots.AddCert(c) } } return trustedRoots, nil }
func CaptureRect(rect image.Rectangle) (*image.RGBA, error) { displayID := C.CGMainDisplayID() width := int(C.CGDisplayPixelsWide(displayID)) rawData := C.CGDataProviderCopyData(C.CGImageGetDataProvider(C.CGDisplayCreateImage(displayID))) length := int(C.CFDataGetLength(rawData)) ptr := unsafe.Pointer(C.CFDataGetBytePtr(rawData)) var slice []byte hdrp := (*reflect.SliceHeader)(unsafe.Pointer(&slice)) hdrp.Data = uintptr(ptr) hdrp.Len = length hdrp.Cap = length imageBytes := make([]byte, length) for i := 0; i < length; i += 4 { imageBytes[i], imageBytes[i+2], imageBytes[i+1], imageBytes[i+3] = slice[i+2], slice[i], slice[i+1], slice[i+3] } C.CFRelease(rawData) img := &image.RGBA{Pix: imageBytes, Stride: 4 * width, Rect: rect} return img, nil }
func buildFont(f C.CTFontRef) []byte { ctags := C.CTFontCopyAvailableTables(f, C.kCTFontTableOptionExcludeSynthetic) tagsCount := C.CFArrayGetCount(ctags) var tags []uint32 var dataRefs []C.CFDataRef var dataLens []uint32 for i := C.CFIndex(0); i < tagsCount; i++ { tag := (C.CTFontTableTag)((uintptr)(C.CFArrayGetValueAtIndex(ctags, i))) dataRef := C.CTFontCopyTable(f, tag, 0) // retained tags = append(tags, uint32(tag)) dataRefs = append(dataRefs, dataRef) dataLens = append(dataLens, uint32(C.CFDataGetLength(dataRef))) } totalLen := 0 for _, l := range dataLens { totalLen += int(l) } // Big-endian output. buf := make([]byte, 0, 12+16*len(tags)+totalLen) write16 := func(x uint16) { buf = append(buf, byte(x>>8), byte(x)) } write32 := func(x uint32) { buf = append(buf, byte(x>>24), byte(x>>16), byte(x>>8), byte(x)) } // File format description: http://www.microsoft.com/typography/otspec/otff.htm write32(0x00010000) // version 1.0 write16(uint16(len(tags))) // numTables write16(0) // searchRange write16(0) // entrySelector write16(0) // rangeShift // Table tags, includes offsets into following data segments. offset := uint32(12 + 16*len(tags)) // offset starts after table tags for i, tag := range tags { write32(tag) write32(0) write32(offset) write32(dataLens[i]) offset += dataLens[i] } // Data segments. for i, dataRef := range dataRefs { data := (*[1<<31 - 2]byte)((unsafe.Pointer)(C.CFDataGetBytePtr(dataRef)))[:dataLens[i]] buf = append(buf, data...) C.CFRelease(C.CFTypeRef(dataRef)) } return buf }
func initDefaultRoots() { roots := x509.NewCertPool() var data C.CFDataRef = nil err := C.FetchPEMRoots(&data) if err != -1 { defer C.CFRelease(C.CFTypeRef(data)) buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data))) roots.AppendCertsFromPEM(buf) } varDefaultRoots = roots }
func initSystemRoots() { roots := NewCertPool() var data C.CFDataRef = nil err := C.ZToolsFetchPEMRoots(&data) if err == -1 { return } defer C.CFRelease(C.CFTypeRef(data)) buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data))) roots.AppendCertsFromPEM(buf) systemRoots = roots }
func loadSystemRoots() (*CertPool, error) { roots := NewCertPool() var data C.CFDataRef = nil err := C.FetchPEMRoots(&data) if err == -1 { // TODO: better error message return nil, errors.New("crypto/x509: failed to load darwin system roots with cgo") } defer C.CFRelease(C.CFTypeRef(data)) buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data))) roots.AppendCertsFromPEM(buf) return roots, nil }
func initSystemRoots() []*x509.Certificate { var roots []*x509.Certificate var data C.CFDataRef data = nil err := C.FetchPEMRootsCFSSLTransport(&data) if err == -1 { return nil } defer C.CFRelease(C.CFTypeRef(data)) buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data))) roots, _ = appendPEM(roots, buf) return roots }
// CFDataToBytes converts CFData to bytes. func CFDataToBytes(cfData C.CFDataRef) ([]byte, error) { return C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(cfData)), C.int(C.CFDataGetLength(cfData))), nil }
func convertCFDataToBytes(cfData C.CFDataRef) []byte { bytes := C.CFDataGetBytePtr(cfData) return C.GoBytes(unsafe.Pointer(bytes), C.int(C.CFDataGetLength(cfData))) }
func (k *keychain) Get(key string) (Item, error) { if _, err := os.Stat(k.Path); os.IsNotExist(err) { return Item{}, ErrKeyNotFound } serviceRef, err := _UTF8StringToCFString(k.Service) if err != nil { return Item{}, err } defer C.CFRelease(C.CFTypeRef(serviceRef)) accountRef, err := _UTF8StringToCFString(key) if err != nil { return Item{}, err } defer C.CFRelease(C.CFTypeRef(serviceRef)) query := map[C.CFTypeRef]C.CFTypeRef{ C.CFTypeRef(C.kSecClass): C.CFTypeRef(C.kSecClassGenericPassword), C.CFTypeRef(C.kSecAttrService): C.CFTypeRef(serviceRef), C.CFTypeRef(C.kSecAttrAccount): C.CFTypeRef(accountRef), C.CFTypeRef(C.kSecMatchLimit): C.CFTypeRef(C.kSecMatchLimitOne), C.CFTypeRef(C.kSecReturnAttributes): C.CFTypeRef(C.kCFBooleanTrue), C.CFTypeRef(C.kSecReturnData): C.CFTypeRef(C.kCFBooleanTrue), } kref, err := openKeychain(k.Path) if err != nil { return Item{}, err } searchArray := arrayToCFArray([]C.CFTypeRef{C.CFTypeRef(kref)}) defer C.CFRelease(C.CFTypeRef(searchArray)) query[C.CFTypeRef(C.kSecMatchSearchList)] = C.CFTypeRef(searchArray) queryDict := mapToCFDictionary(query) defer C.CFRelease(C.CFTypeRef(queryDict)) var resultsRef C.CFTypeRef if err = newKeychainError(C.SecItemCopyMatching(queryDict, &resultsRef)); err == errItemNotFound { return Item{}, ErrKeyNotFound } else if err != nil { return Item{}, err } defer C.CFRelease(resultsRef) m := _CFDictionaryToMap(C.CFDictionaryRef(resultsRef)) data := C.CFDataRef(m[C.CFTypeRef(C.kSecValueData)]) dataLen := C.int(C.CFDataGetLength(data)) cdata := C.CFDataGetBytePtr(data) item := Item{ Key: key, Data: C.GoBytes(unsafe.Pointer(cdata), dataLen), } if label, exists := m[C.CFTypeRef(C.kSecAttrLabel)]; exists { item.Label = _CFStringToUTF8String(C.CFStringRef(label)) } if descr, exists := m[C.CFTypeRef(C.kSecAttrDescription)]; exists { item.Description = _CFStringToUTF8String(C.CFStringRef(descr)) } return item, nil }
func convertCFDataRefToGoBytes(cfdata C.CFDataRef) []byte { return C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(cfdata)), (C.int)(C.CFDataGetLength(cfdata))) }