diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8433d38 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 I2P For Go + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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 OR COPYRIGHT HOLDERS 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e6d31f3 --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# go-i2cp + +A low-level Go implementation of the I2P Client Protocol (I2CP) focused on developing anonymous services and applications. This library provides cryptographically secure primitives for establishing I2P destinations and managing end-to-end encrypted communication sessions. + +## Features + +- Pure Go I2CP client implementation with minimal dependencies +- Secure session establishment and management +- Cryptographic operations (DSA/SHA1/SHA256) +- Stream-based encrypted messaging +- Anonymous addressing (Base32/Base64) +- Comprehensive test coverage +- TLS support for I2CP connections + +## Installation + +```bash +go get github.com/go-i2p/go-i2cp +``` + +## Basic Usage + +```go +// Create I2CP client with default settings +client := go_i2cp.NewClient(nil) + +// Connect to local I2P router +if err := client.Connect(); err != nil { + log.Fatal(err) +} +defer client.Disconnect() + +// Create session with callbacks +session := go_i2cp.NewSession(client, go_i2cp.SessionCallbacks{ + onDestination: func(session *go_i2cp.Session, requestId uint32, + address string, dest *go_i2cp.Destination) { + // Handle destination lookups + }, + onStatus: func(session *go_i2cp.Session, status go_i2cp.SessionStatus) { + // Handle session status changes + }, + onMessage: func(session *go_i2cp.Session, protocol uint8, + srcPort, destPort uint16, payload *go_i2cp.Stream) { + // Handle incoming messages + }, +}) + +// Configure session +session.config.SetProperty(go_i2cp.SESSION_CONFIG_PROP_OUTBOUND_NICKNAME, "example") +session.config.SetProperty(go_i2cp.SESSION_CONFIG_PROP_OUTBOUND_QUANTITY, "4") + +// Generate destination +if session.config.destination, err = go_i2cp.NewDestination(); err != nil { + log.Fatal(err) +} + +// Create session +if err := client.CreateSession(session); err != nil { + log.Fatal(err) +} +``` + +## Security Configuration + +The library supports extensive session configuration for privacy tuning: + +```go +// Security settings +config.SetProperty(SESSION_CONFIG_PROP_INBOUND_LENGTH, "3") // Tunnel length +config.SetProperty(SESSION_CONFIG_PROP_OUTBOUND_LENGTH, "3") +config.SetProperty(SESSION_CONFIG_PROP_INBOUND_QUANTITY, "4") // Number of tunnels +config.SetProperty(SESSION_CONFIG_PROP_OUTBOUND_QUANTITY, "4") +config.SetProperty(SESSION_CONFIG_PROP_INBOUND_BACKUP_QUANTITY, "2") // Backup tunnels +config.SetProperty(SESSION_CONFIG_PROP_OUTBOUND_BACKUP_QUANTITY, "2") +``` + +## Privacy Considerations + +This library implements core I2P networking primitives. When using it: + +- Never mix I2P and clearnet traffic +- Use appropriate tunnel lengths for your threat model +- Handle all errors privately without leaking metadata +- Implement proper session isolation +- Consider timing attack mitigations +- Use TLS for I2CP connections when remote +- Rotate destinations regularly +- Monitor tunnel health + +## Testing + +```bash +go test -v ./... +``` + +## Requirements + +- Go 1.16+ +- Running I2P router with I2CP enabled (default port 7654) +- SAM API v3.3 enabled in router + +## Contributing + +1. Fork the repository +2. Create your feature branch (`git checkout -b feature/enhancement`) +3. Commit changes (`git commit -m 'Add enhancement'`) +4. Push to branch (`git push origin feature/enhancement`) +5. Open a Pull Request + +Please ensure: +- Full test coverage +- Privacy-preserving error handling +- Clear documentation +- No clearnet dependencies +- Clean Go code style + +## License + +MIT License - See LICENSE file