331 lines
7.9 KiB
HTML
331 lines
7.9 KiB
HTML
<html>
|
|
<head>
|
|
<title>
|
|
README
|
|
</title>
|
|
<meta name="author" content="eyedeekay" />
|
|
<meta name="description" content="sam3" />
|
|
<meta name="keywords" content="master" />
|
|
<link rel="stylesheet" type="text/css" href="style.css" />
|
|
<link rel="stylesheet" type="text/css" href="showhider.css" />
|
|
</head>
|
|
<body>
|
|
<div id="navbar">
|
|
<a href="#shownav">
|
|
Show navigation
|
|
</a>
|
|
<div id="shownav">
|
|
<div id="hidenav">
|
|
<ul>
|
|
<li>
|
|
<a href="index.html">
|
|
index
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<br>
|
|
<a href="#hidenav">
|
|
Hide Navigation
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h1>
|
|
<a href="#readme" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
README
|
|
</h1>
|
|
<h2>
|
|
<a href="#important" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
!!IMPORTANT!!
|
|
</h2>
|
|
<p>
|
|
In the next version, I'll be moving the
|
|
<code>
|
|
i2pkeys
|
|
</code>
|
|
directory to it's own repository
|
|
so I can avoid import cycle headaches. Please migrate to the new
|
|
<code>
|
|
i2pkeys
|
|
</code>
|
|
repository
|
|
before upgrading your sam3 dependencies. You can probably do this by running:
|
|
</p>
|
|
<div>
|
|
<pre>find . -name '*.go' -exec sed -i 's|github.com/eyedeekay/sam3/i2pkeys|github.com/eyedeekay/i2pkeys|g' {} \;
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
STATUS: This project is maintained. I will respond to issues, pull requests, and feature requests within a few days.
|
|
</p>
|
|
<h1>
|
|
<a href="#readme" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
README
|
|
</h1>
|
|
<p>
|
|
go library for the I2P
|
|
<a href="https://geti2p.net/en/docs/api/samv3" rel="nofollow">
|
|
SAMv3.0
|
|
</a>
|
|
bridge, used to build anonymous/pseudonymous end-to-end encrypted sockets.
|
|
</p>
|
|
<p>
|
|
This library is much better than ccondom (that use BOB), much more stable and much easier to maintain.
|
|
</p>
|
|
<h2>
|
|
<a href="#support-todo" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
Support/TODO
|
|
</h2>
|
|
<p>
|
|
<strong>
|
|
What works:
|
|
</strong>
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Utils
|
|
<ul>
|
|
<li>
|
|
Resolving domain names to I2P destinations
|
|
</li>
|
|
<li>
|
|
.b32.i2p hashes
|
|
</li>
|
|
<li>
|
|
Generating keys/i2p destinations
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
Streaming
|
|
<ul>
|
|
<li>
|
|
DialI2P() - Connecting to stuff in I2P
|
|
</li>
|
|
<li>
|
|
Listen()/Accept() - Handling incomming connections
|
|
</li>
|
|
<li>
|
|
Implements net.Conn and net.Listener
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
Datagrams
|
|
<ul>
|
|
<li>
|
|
Implements net.PacketConn
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
Raw datagrams
|
|
<ul>
|
|
<li>
|
|
Like datagrams, but without addresses
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
<strong>
|
|
Does not work:
|
|
</strong>
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Stream Forwarding
|
|
</li>
|
|
<li>
|
|
Probably needs some real-world testing
|
|
</li>
|
|
</ul>
|
|
<h2>
|
|
<a href="#documentation" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
Documentation
|
|
</h2>
|
|
<ul>
|
|
<li>
|
|
Latest version-documentation:
|
|
<ul>
|
|
<li>
|
|
set your GOPATH
|
|
</li>
|
|
<li>
|
|
Enter
|
|
<code>
|
|
godoc -http=:8081
|
|
</code>
|
|
into your terminal and hit enter.
|
|
</li>
|
|
<li>
|
|
Goto
|
|
<a href="http://localhost:8081" rel="nofollow">
|
|
http://localhost:8081
|
|
</a>
|
|
, click packages, and navigate to sam3
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h2>
|
|
<a href="#examples" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
Examples
|
|
</h2>
|
|
<div>
|
|
<pre>package main
|
|
|
|
import (
|
|
"github.com/eyedeekay/sam3"
|
|
"github.com/eyedeekay/sam3/i2pkeys"
|
|
"fmt"
|
|
)
|
|
|
|
const yoursam = "127.0.0.1:7656" // sam bridge
|
|
|
|
func client(server i2pkeys.I2PAddr) {
|
|
sam, _ := sam3.NewSAM(yoursam)
|
|
keys, _ := sam.NewKeys()
|
|
stream, _ := sam.NewStreamSession("clientTun", keys, sam3.Options_Small)
|
|
fmt.Println("Client: Connecting to " + server.Base32())
|
|
conn, _ := stream.DialI2P(server)
|
|
conn.Write([]byte("Hello world!"))
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
sam, _ := NewSAM(yoursam)
|
|
keys, _ := sam.NewKeys()
|
|
stream, _ := sam.NewStreamSession("serverTun", keys, sam3.Options_Medium)
|
|
listener, _ := stream.Listen()
|
|
go client(keys.Addr())
|
|
conn, _ := listener.Accept()
|
|
buf := make([]byte, 4096)
|
|
n, _ := conn.Read(buf)
|
|
fmt.Println("Server received: " + string(buf[:n]))
|
|
}
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
The above will write to the terminal:
|
|
</p>
|
|
<div>
|
|
<pre>Client: Connecting to zjnvfh4hs3et5vtz35ogwzrws26zvwkcad5uo5esecvg4qpk5b4a.b32.i2p
|
|
Server received: Hello world!
|
|
</pre>
|
|
</div>
|
|
<p>
|
|
Error handling was omitted in the above code for readability.
|
|
</p>
|
|
<h2>
|
|
<a href="#testing" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
Testing
|
|
</h2>
|
|
<ul>
|
|
<li>
|
|
<code>
|
|
go test -tags=nettest
|
|
</code>
|
|
runs the whole suite (takes 90+ sec to perform!)
|
|
</li>
|
|
<li>
|
|
<code>
|
|
go test -short
|
|
</code>
|
|
runs the shorter variant, does not connect to anything
|
|
</li>
|
|
</ul>
|
|
<h2>
|
|
<a href="#license" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
License
|
|
</h2>
|
|
<p>
|
|
Public domain.
|
|
</p>
|
|
<h2>
|
|
<a href="#author" rel="nofollow">
|
|
<span></span>
|
|
</a>
|
|
Author
|
|
</h2>
|
|
<ul>
|
|
<li>
|
|
Kalle Vedin
|
|
<code>
|
|
kalle.vedin@fripost.org
|
|
</code>
|
|
</li>
|
|
<li>
|
|
Unknown Name (majestrate)
|
|
</li>
|
|
<li>
|
|
idk
|
|
</li>
|
|
<li>
|
|
qiwenmin
|
|
</li>
|
|
</ul>
|
|
<div>
|
|
<a href="#show">
|
|
Show license
|
|
</a>
|
|
<div id="show">
|
|
<div id="hide">
|
|
<pre><code>This is free and unencumbered software released into the public domain.
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
distribute this software, either in source code form or as a compiled
|
|
binary, for any purpose, commercial or non-commercial, and by any
|
|
means.
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors
|
|
of this software dedicate any and all copyright interest in the
|
|
software to the public domain. We make this dedication for the benefit
|
|
of the public at large and to the detriment of our heirs and
|
|
successors. We intend this dedication to be an overt act of
|
|
relinquishment in perpetuity of all present and future rights to this
|
|
software under copyright law.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
For more information, please refer to <http://unlicense.org/>
|
|
</code></pre>
|
|
<a href="#hide">
|
|
Hide license
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<iframe src="https://snowflake.torproject.org/embed.html" width="320" height="240" frameborder="0" scrolling="no"></iframe>
|
|
</div>
|
|
<div>
|
|
<a href="https://geti2p.net/">
|
|
<img src="i2plogo.png"></img>
|
|
I2P
|
|
</a>
|
|
</div>
|
|
</body>
|
|
</html> |