OpenSSL bindings for Go

OpenSSL bindings for Go

Please see http://godoc.org/github.com/spacemonkeygo/openssl for more info

License

Copyright (C) 2017. See AUTHORS.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Using on macOS

  1. Install homebrew
  2. $ brew install openssl or $ brew install [email protected]

Using on Windows

  1. Install mingw-w64
  2. Install pkg-config-lite
  3. Build (or install precompiled) openssl for mingw32-w64
  4. Set PKG_CONFIG_PATH to the directory containing openssl.pc (i.e. c:\mingw64\mingw64\lib\pkgconfig)
Comments
  • restructure certs/keys; add key/cert generation

    restructure certs/keys; add key/cert generation

    I moved this pull request into a branch so I can mash multiple changes into my master.

    I split pem.go into key.go and cert.go, and added methods for manipulating certificates and generating RSA keys. This provides enough functionality to generate a RSA keys, make a CA, and issue a certificate with constraints. cert_test.go demonstrates this process.

    NID is also now an exposed type.

  • Strange error with GOOS=windows _OR_ GOARCH=386

    Strange error with GOOS=windows _OR_ GOARCH=386

    I can not find any explanation to the error as Ctx is clearly defined in ctx.go. This only happens when GOOS=windows and or GOARCH=386. Trying with latest 1.10.2 golang:

    dmagyar@dmtest:~/go/ossl$ GOOS=windows GOARCH=amd64 go get github.com/spacemonkeygo/openssl
    # github.com/spacemonkeygo/openssl
    ../src/github.com/spacemonkeygo/openssl/net.go:24:7: undefined: Ctx
    dmagyar@dmtest:~/go/ossl$ GOOS=linux GOARCH=amd64 go get github.com/spacemonkeygo/openssl
    dmagyar@dmtest:~/go/ossl$ GOOS=linux GOARCH=386 go get github.com/spacemonkeygo/openssl
    # github.com/spacemonkeygo/openssl
    ../src/github.com/spacemonkeygo/openssl/net.go:24:7: undefined: Ctx
    dmagyar@dmtest:~/go/ossl$
    

    Any ideas what this could be?

  • Could not determine kind of name for C.SSLv3_method

    Could not determine kind of name for C.SSLv3_method

    I'm building my application within a golang docker container (which uses debian Jessie), but I'm getting the error could not determine kind of name for C.SSLv3_method. I installed libopenssl-1.0.2e.

    I'm quite new to go, any ideas what I'm doing wrong?

    You can reproduce the problem with:

    docker run -i -t golang /bin/bash
    echo "deb http://httpredir.debian.org/debian stretch main" >> /etc/apt/sources.list
    apt-get update
    apt-get install -y libssl-dev pkg-config
    go get github.com/spacemonkeygo/openssl
    
  • Certificate Chain when using ListenAndServeTLS

    Certificate Chain when using ListenAndServeTLS

    When I use a certificate chain in ListenAndServeTLS it doesn't seem to serve up any more than the first certificate. This works properly using the stdlib's ListenAndServeTLS.

  • Unable to get the md5 subject_hash

    Unable to get the md5 subject_hash

    Hi all,

    First time posting here. I am looking to get the subject_hash (md5) for my pem file, as you would with command line openssl

    wmachs-iphone:platform-tools user$ openssl x509 -noout -subject_hash_old -in ../charles-ssl-proxying-certificate.pem e64b345

    I tried using the spacemonkey library but was not successful. What am I doing wrong?

    data,_ :=ioutil.ReadFile("/Users/kevinliang/Desktop/charles-ssl-proxying-certificate.pem")
    
    
    newMd5,err:=openssl.NewMD5Hash()
    pemfile,_ := openssl.LoadCertificateFromPEM(data)
    pemblock,err:=pemfile.MarshalPEM()
    _=err
    newMd5.Write(pemblock)
    fmt.Println(newMd5.Sum())
    val,_:=newMd5.Sum()
    fmt.Println(hex.EncodeToString(val[:]))
    

    RESPONSE

    [150 21 143 243 26 230 95 234 154 135 143 103 234 127 200 228] d41d8cd98f00b204e9800998ecf8427e

  • low performance relatively to gotls

    low performance relatively to gotls

    I've tried running http servers: plain, openssl and gotls with this small program: https://play.golang.org/p/lY41nYV_uG.

    Benchmarking it I've got following numbers: Plain HTTP: 72.5k rps gotls: 45k rps openssl: 24k

    Is this expected or performance profile could be improved?

  • OSX fixes

    OSX fixes

    The OpenSSL version on OSX (at least on Mavericks) does not have the tls version method functions, so we need to detect OSX there. It doesn't look like there's a good way to put this into the compat file without adding yet another layer of indirection, so I put it directly in the ifdef.

    The second commit is just to shut up the compiler. I already know Apple want me to use SecureTransport, I don't need it hiding any useful warnings or errors from my code.

    The last one shouldn't be OSX-specific, but newer Go versions have gotten quite picky about C pointer types, so this makes them agree completely. I'm on 1.4 currently but I've seen similar issues on 1.3.

  • Adding EnableECDH to Context

    Adding EnableECDH to Context

    To enable the use of ECDH, the SSL context has to have an ECDH key.

    In openssl 1.0.2 (not yet released), SSL_CTX_set_ecdh_auto can be used. As a fallback, SSL_CTX_set_tmp_ecdh can be used with a named curve.

  • Set thread id callback as required by openssl.

    Set thread id callback as required by openssl.

    For openssl to work in multi threaded environment, 2 callbacks needs to be set as per following blog. https://www.openssl.org/blog/blog/2017/02/21/threads/

    Spacemonkeygo openssl binding is setting CRYPTO_set_locking_callback but not setting CRYPTO_set_id_callback. I have added required changes for setting CRYPTO_set_id_callback for non windows environment.

  • Crashes when using AddChainCertificate on go 1.3 and 1.3.2

    Crashes when using AddChainCertificate on go 1.3 and 1.3.2

    reproducable code: http://paste.ubuntu.com/8450867/

    When provided with a valid certificate, bundle and key , the pasted code works fine on Go 1.2.2, but crashes on 1.3 and 1.3.2 .

    Crashdump: http://pastie.org/private/eszbzktmuyk5o1fgztc6nw

    Each time it manages to get 5 to 10 requests out before crashing.

    To reproduce, run the following :

    go build reproduce.go && sudo ./reproduce -cert=/path/to/cert.crt -key=/path/to/key.key -bundle=/path/to/bundle.crt on another window. openssl s_client -connect 127.0.0.1:443 -CApath /etc/ssl/certs This command successfully validates the cert now that we have the chain added.. but... Run this about 5 to 10 times and it should crash the server...

    My environment Ubuntu 14.04 (3.13.0-34-generic) libssl-dev:amd64 1.0.1f-1ubuntu2.5

  • Certificate store issue in client : Host validation error

    Certificate store issue in client : Host validation error

    Server Code: func main() { caCert, err := ioutil.ReadFile("./client.crt") if err != nil { log.Fatal(err) } ctx, err := openssl.NewCtxFromFiles("./server.crt", "./server.key") if err != nil { log.Fatal(err) } certStore := ctx.GetCertificateStore() certStore.LoadCertificatesFromPEM(caCert) l, err := openssl.Listen("tcp", ":7777", ctx) if err != nil { fmt.Println("Error listening:", err.Error()) os.Exit(1) } // Close the listener when the application closes. defer l.Close() for { // Listen for an incoming connection. conn, err := l.Accept() if err != nil { fmt.Println("Error accepting: ", err.Error()) os.Exit(1) } // Handle connections in a new goroutine. go handleRequest(conn) } }

    Client Code:

    func main() { caCert, err := ioutil.ReadFile("./server.crt") if err != nil { log.Fatal(err) } ctx, err := openssl.NewCtxFromFiles("./client.crt", "./client.key") if err != nil { log.Fatal(err) } certStore := ctx.GetCertificateStore() certStore.LoadCertificatesFromPEM(caCert) fmt.Println("here1:") conn, err := openssl.Dial("tcp", "localhost:7777", ctx, 0) fmt.Println("here2:") if err != nil { fmt.Println(err.Error()) } // Send a message to server. conn.Write([]byte("Shekhar.")) // Make a buffer to hold incoming data. buf := make([]byte, 1024) // Read the incoming connection into the buffer. recLen, err := conn.Read(buf) if err != nil { fmt.Println("Error reading:", err.Error()) } fmt.Println(recLen) fmt.Println("Recieved from Server:", buf) }

    From the client I get "Host validation error" Not sure what I am doing wrong

  • Linux bindings?

    Linux bindings?

    How come this package doesnt have linux bindings?

    How hard would it be to setup? Most webservers use linux so I would think they could benefit from this package supporting linux bindings of openssl

  • Help with Reader?

    Help with Reader?

    Hey everyone working on this package, thanks for your work as I feel like I am already there and close to using it fully for my task:

    I have successfully made a socket connection using a ca file:

    	err = ctx.LoadVerifyLocations("file.cer", "")
    

    My Dial is not erroring:

    	conn, err := openssl.Dial("tcp", addr, ctx, openssl.InsecureSkipHostVerification)
    

    My writes are not erroring:

    log.Println("writing")
    log.Println(obj.conn.Write([]byte("{}")))
    
    2022/08/18 17:16:42 writing
    2022/08/18 17:16:42 118 <nil>
    

    I setup a reader go func obj.conn is just the returned *openssl.Conn and it blocks until my read deadline is met obj.conn.SetReadDeadline(time.Now().Add(time.Second * 10)) at the point where a reader times out, I usually reconnect on the socket (I also tried a longer read timeout thinking maybe the packets would come through the network):

    	go func() {
    		for {
    
    			result := make([]byte, 1024)
    			length, err := obj.conn.Read(result)
    			if err != nil {
    				log.Println("Reader Err: " + err.Error()) 
    				obj.Connect(addr) 
    				return
    			}
    			log.Println("Result", result[:length])
    		}
    	}()
    

    I also thought that perhaps openssl is wanting me to setup a read immediately after a write kind of like udp might. But that didnt work either.

    When I setup openssl s_client -connect IP:PORT -CAfile file.cer and make a connection and write the same JSON to the socket I am working with, I immediately see a response which I am expecting would come through in my reader goroutine. Is there something s_client does which is different than how this library might read data from network packets coming back from the server?

    I am no expert in openssl and this library, but I have lots of experience in tcp, telnet, udp, websocket, ssh and other network protocols. This is my first secure driver over tls and openssl and I was thinking this would work like tcp does in receiving responses from the network responses.

    Does anyone have any ideas with the differences between openssl's s_client and this libraries bindings/usage and how the response data might be different?

  • Update fips.go for OpenSSL 3.x compatability

    Update fips.go for OpenSSL 3.x compatability

    openssl 1.X api FIPS_mode_set() was deprecated and replaced with EVP_default_properties_enable_fips()

    modify fips.go so it can link with libcrypto in the presence of a build with openssl 3.x

  • getting error in apple m1 chip

    getting error in apple m1 chip

    github.com/spacemonkeygo/openssl

    In file included from ../../go/pkg/mod/github.com/spacemonkeygo/[email protected]/bio.go:17: ./shim.h:21:10: fatal error: 'openssl/bio.h' file not found #include <openssl/bio.h> ^~~~~~~~~~~~~~~ 1 error generated.

    github.com/gen2brain/go-fitz

    Undefined symbols for architecture arm64: "_fz_bound_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_bound_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_bound_page) "_fz_buffer_storage", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_buffer_storage in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_buffer_storage) "_fz_clear_pixmap_with_value", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_clear_pixmap_with_value in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_clear_pixmap_with_value) "_fz_close_device", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_close_device in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_close_device) "_fz_count_pages", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_count_pages in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_count_pages) "_fz_device_rgb", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_device_rgb in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_device_rgb) "_fz_drop_buffer", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_buffer in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_buffer) "_fz_drop_context", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_context in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_context) "_fz_drop_device", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_device in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_device) "_fz_drop_document", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_document in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_document) "_fz_drop_outline", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_outline in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_outline) "_fz_drop_output", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_output in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_output) "_fz_drop_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_page) "_fz_drop_pixmap", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_pixmap in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_pixmap) "_fz_drop_stext_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_stext_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_stext_page) "_fz_drop_stream", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_stream in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_drop_stream) "_fz_enable_device_hints", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_enable_device_hints in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_enable_device_hints) "_fz_identity", referenced from: __cgohack_fz_identity in _cgo_main.o (maybe you meant: __cgohack_fz_identity) "_fz_load_outline", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_load_outline in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_load_outline) "_fz_load_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_load_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_load_page) "_fz_lookup_metadata", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_lookup_metadata in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_lookup_metadata) "_fz_needs_password", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_needs_password in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_needs_password) "_fz_new_buffer", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_stext_page, __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer , __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_pixmap_as_png ) "_fz_new_buffer_from_pixmap_as_png", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_pixmap_as_png in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_pixmap_as_png) "_fz_new_buffer_from_stext_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_stext_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_buffer_from_stext_page) "_fz_new_context_imp", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_context_imp in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_context_imp) "_fz_new_draw_device", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_draw_device in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_draw_device) "_fz_new_output_with_buffer", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_output_with_buffer in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_output_with_buffer) "_fz_new_pixmap_with_bbox", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_pixmap_with_bbox in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_pixmap_with_bbox) "_fz_new_stext_device", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_stext_device in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_stext_device) "_fz_new_stext_page", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_stext_page in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_stext_page) "_fz_new_svg_device", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_new_svg_device in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_new_svg_device) "_fz_open_document", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_open_document in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_open_document, __cgo_7eb2ce70e3ae_Cfunc_fz_open_document_with_stream ) "_fz_open_document_with_stream", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_open_document_with_stream in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_open_document_with_stream) "_fz_open_memory", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_open_memory in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_open_memory) "_fz_pixmap_samples", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_pixmap_samples in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_pixmap_samples) "_fz_print_stext_header_as_html", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_print_stext_header_as_html in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_print_stext_header_as_html) "_fz_print_stext_page_as_html", referenced from: __cgo_7eb2ce70e3ae_Cfunc_fz_print_stext_page_as_html in _x002.o (maybe you meant: __cgo_7eb2ce70e3ae_Cfunc_fz_print_stext_page_as_html)

  • openssl FIPS_mode_set error

    openssl FIPS_mode_set error

    i hope this repo not die yet. I face error when running my golang app that used this library. it return # github.com/spacemonkeygo/openssl ../../go/pkg/mod/github.com/spacemonkeygo/[email protected]/fips.go:31:7: could not determine kind of name for C.FIPS_mode_set my thought is the version of openssl, this library used and mine was different.

    note: running on ubuntu 22.04, openssl 3.0.2

Shows how to use OpenCL with Go bindings.

Golang OpenCL example This is a tiny "hello world"-like application that shows how to use the github.com/jgillich/go-opencl OpenCL bindings for Go. Se

Nov 20, 2022
CVE-2021-3449 OpenSSL denial-of-service exploit 👨🏻‍💻

CVE-2021-3449 OpenSSL <1.1.1k DoS exploit Usage: go run . -host hostname:port This program implements a proof-of-concept exploit of CVE-2021-3449 affe

Dec 16, 2022
libsox bindings for go

gosox "SoX − Sound eXchange, the Swiss Army knife of audio manipulation" Go bindings for the libsox sound library For more information and documentati

Nov 22, 2022
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Jan 1, 2023
Go bindings for libportmidi

portmidi Want to output to an MIDI device or listen your MIDI device as an input? This package contains Go bindings for PortMidi. libportmidi (v. 217)

Dec 25, 2022
Golang bindings for the Telegram Bot API

Golang bindings for the Telegram Bot API All methods are fairly self explanatory, and reading the godoc page should explain everything. If something i

Jan 6, 2023
Golang bindings for libxlsxwriter for writing XLSX files
Golang bindings for libxlsxwriter for writing XLSX files

goxlsxwriter provides Go bindings for the libxlsxwriter C library. Install goxlsxwriter requires the libxslxwriter library to be installe

Nov 18, 2022
Go bindings for ForestDB

goforestdb Go bindings for ForestDB Building Obtain and build forestdb: https://github.com/couchbaselabs/forestdb (run make install to install the lib

Sep 26, 2022
Go bindings for GLib type system.

Go bindings for GLib type system. This package is designed for building bindings to C libraries based on GLib type system (like GTK, GStreamer, and ot

Aug 13, 2019
Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files.
Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files.

tabby Source code editor written in Go using go-gtk bindings. It aims to handle navigation effectively among large number of files. screenshot: depend

Nov 16, 2022
Duktape JavaScript engine bindings for Go

Duktape bindings for Go(Golang) Duktape is a thin, embeddable javascript engine. Most of the api is implemented. The exceptions are listed here. Usage

Jan 6, 2023
PHP bindings for the Go programming language (Golang)

PHP bindings for Go This package implements support for executing PHP scripts, exporting Go variables for use in PHP contexts, attaching Go method rec

Jan 1, 2023
naive go bindings to the CPython C-API

go-python Naive go bindings towards the C-API of CPython-2. this package provides a go package named "python" under which most of the PyXYZ functions

Jan 5, 2023
Go bindings for Lua C API - in progress

Go Bindings for the lua C API Simplest way to install: # go get github.com/aarzilli/golua/lua You can then try to run the examples: $ cd golua/_examp

Dec 28, 2022
Go bindings for libmagic to detect MIME types

magicmime magicmime is a Go package which allows you to discover a file's mimetype by looking for magic numbers in its content. It could be used as a

Nov 9, 2022
Go bindings for raylib, a simple and easy-to-use library to enjoy videogames programming.
Go bindings for raylib, a simple and easy-to-use library to enjoy videogames programming.

raylib-go Golang bindings for raylib, a simple and easy-to-use library to enjoy videogames programming. Requirements Ubuntu X11 apt-get install libgl1

Dec 28, 2022
Go bindings for the Cartographic Projections Library PROJ.4

The Go package proj provides a limited interface to the Cartographic Projections Library PROJ. For PROJ version 5 and beyond, see also: https://github

Nov 10, 2022
Go bindings for GLFW 3

GLFW 3.3 for Go Installation GLFW C library source is included and built automatically as part of the Go package. But you need to make sure you have d

Jan 8, 2023
Go bindings for GLFW 3

GLFW 3.3 for Go Installation GLFW C library source is included and built automatically as part of the Go package. But you need to make sure you have d

Dec 25, 2022
Go bindings for OpenGL (generated via glow)

gl This repository holds Go bindings to various OpenGL versions. They are auto-generated using Glow. Features: Go functions that mirror the C specific

Dec 12, 2022