common

package module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 27, 2026 License: MIT Imports: 0 Imported by: 0

README

go-i2p/common

A comprehensive Go library implementing I2P (Invisible Internet Project) network protocol common data structures and utilities. This library provides type-safe implementations of the I2P specification common structures, factored out from the main I2P router to enable reusable components for parsing, encoding, and manipulating I2P network data.


Installation

go mod init your-project
go get github.com/go-i2p/common

Usage

Creating Key Certificates (New Simplified API)

The library now provides simplified constructors for common key certificate types:

package main

import (
    "fmt"
    "github.com/go-i2p/common/key_certificate"
)

func main() {
    // Modern Ed25519/X25519 key certificate (recommended)
    keyCert, err := key_certificate.NewEd25519X25519KeyCertificate()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    fmt.Printf("Signing type: %d\n", keyCert.SigningPublicKeyType())
    fmt.Printf("Crypto type: %d\n", keyCert.PublicKeyType())
    
    // Or create with custom key types
    keyCert, err = key_certificate.NewKeyCertificateWithTypes(
        key_certificate.KEYCERT_SIGN_ED25519,
        key_certificate.KEYCERT_CRYPTO_X25519,
    )
}
Getting Key Sizes Without Object Creation

Query key sizes for padding calculations without creating certificate objects:

package main

import (
    "fmt"
    "github.com/go-i2p/common/key_certificate"
    "github.com/go-i2p/common/keys_and_cert"
)

func main() {
    // Get size information for key types
    sizes, err := key_certificate.GetKeySizes(
        key_certificate.KEYCERT_SIGN_ED25519,
        key_certificate.KEYCERT_CRYPTO_X25519,
    )
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    // Calculate padding size
    paddingSize := keys_and_cert.KEYS_AND_CERT_DATA_SIZE - 
        (sizes.CryptoPublicKeySize + sizes.SigningPublicKeySize)
    
    fmt.Printf("Signature size: %d bytes\n", sizes.SignatureSize)
    fmt.Printf("Signing public key size: %d bytes\n", sizes.SigningPublicKeySize)
    fmt.Printf("Crypto public key size: %d bytes\n", sizes.CryptoPublicKeySize)
    fmt.Printf("Required padding: %d bytes\n", paddingSize)
}
Using the Certificate Builder Pattern

For complex certificate construction scenarios:

package main

import (
    "fmt"
    "github.com/go-i2p/common/certificate"
)

func main() {
    // Build a key certificate using fluent interface
    cert, err := certificate.NewCertificateBuilder().
        WithKeyTypes(certificate.KEYCERT_SIGN_ED25519, certificate.KEYCERT_CRYPTO_X25519).
        Build()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    // Or build a certificate with custom payload
    customPayload := []byte{0x01, 0x02, 0x03, 0x04}
    cert, err = certificate.NewCertificateBuilder().
        WithType(certificate.CERT_SIGNED).
        WithPayload(customPayload).
        Build()
}
Simple Integer Encoding

Use the new encoding utilities for cleaner binary encoding:

package main

import (
    "fmt"
    "github.com/go-i2p/common/data"
)

func main() {
    // Encode integers without error handling (for valid values)
    signingType := data.EncodeUint16(7)  // Ed25519
    cryptoType := data.EncodeUint16(4)   // X25519
    
    fmt.Printf("Signing type bytes: %v\n", signingType[:])
    fmt.Printf("Crypto type bytes: %v\n", cryptoType[:])
    
    // Decode back to integers
    sigValue := data.DecodeUint16(signingType)
    cryptoValue := data.DecodeUint16(cryptoType)
    
    fmt.Printf("Decoded signing: %d, crypto: %d\n", sigValue, cryptoValue)
    
    // For variable-length encoding with validation
    bytes, err := data.EncodeIntN(1234, 2)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    fmt.Printf("Encoded bytes: %v\n", bytes)
}
Basic Certificate Parsing
package main

import (
    "fmt"
    "github.com/go-i2p/common/certificate"
)

func main() {
    // Parse I2P certificate from binary data
    data := []byte{0x00, 0x00, 0x02, 0xff, 0xff}
    cert, remainder, err := certificate.ReadCertificate(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    fmt.Printf("Certificate type: %d\n", cert.Type())
    fmt.Printf("Certificate length: %d\n", cert.Length())
    fmt.Printf("Remaining bytes: %d\n", len(remainder))
}
Working with Destinations
package main

import (
    "fmt"
    "github.com/go-i2p/common/destination"
)

func main() {
    // Read destination from binary data
    data := []byte{/* destination bytes */}
    dest, remainder, err := destination.ReadDestination(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    // Generate I2P addresses
    base32Address := dest.Base32Address()
    base64Address := dest.Base64()
    
    fmt.Printf("Base32 address: %s\n", base32Address)
    fmt.Printf("Base64 address: %s\n", base64Address)
}
Parsing Router Information
package main

import (
    "fmt"
    "github.com/go-i2p/common/router_info"
)

func main() {
    // Read router info from binary data
    data := []byte{/* router info bytes */}
    routerInfo, remainder, err := router_info.ReadRouterInfo(data)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    // Access router information
    identity := routerInfo.RouterIdentity()
    addresses := routerInfo.RouterAddresses()
    capabilities := routerInfo.RouterCapabilities()
    
    fmt.Printf("Router identity: %v\n", identity)
    fmt.Printf("Router addresses: %d\n", len(addresses))
    fmt.Printf("Router capabilities: %s\n", capabilities)
}
Working with I2P Strings
package main

import (
    "fmt"
    "github.com/go-i2p/common/data"
)

func main() {
    // Parse I2P string from binary data
    stringData := []byte{0x05, 'h', 'e', 'l', 'l', 'o'}
    i2pString := data.I2PString(stringData)
    
    length, err := i2pString.Length()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    content, err := i2pString.Data()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }
    
    fmt.Printf("String length: %d\n", length)
    fmt.Printf("String content: %s\n", content)
}

Requirements

  • Go Version: 1.24.2 or later
  • I2P Specification: 0.9.67 (June 2025)
  • Dependencies:
    • github.com/go-i2p/go-i2p - Core I2P library
    • github.com/go-i2p/logger - Structured logging wrapper
    • github.com/samber/oops - Enhanced error handling
    • github.com/sirupsen/logrus - Logging framework
    • github.com/stretchr/testify - Testing utilities

Testing

Run the comprehensive test suite:

# Run all tests
make test

# Run specific component tests
go test ./certificate/...
go test ./destination/...
go test ./router_info/...

# Run fuzz tests
go test -fuzz=FuzzCertificate ./certificate/

License

MIT License - see LICENSE file for details.

Copyright (c) 2025 I2P For Go

Documentation

Overview

Package common provides I2P protocol common data structures and utilities.

This library implements type-safe I2P network protocol data structures according to specification version 0.9.67, with comprehensive validation and error handling.

Overview

The go-i2p/common package provides fundamental building blocks for I2P applications:

  • Data primitives (Integer, String, Date, Hash, Mapping)
  • Cryptographic structures (Certificate, Signature, KeyCertificate)
  • Network identities (Destination, RouterIdentity, RouterInfo)
  • Tunnel management (Lease, LeaseSet, EncryptedLeaseSet)
  • Encoding utilities (Base32, Base64)

Design Philosophy

This library prioritizes safety and correctness:

  • All types provide safe constructors with validation
  • Zero-value types are checked and rejected
  • Errors are returned explicitly, never ignored
  • Stream parsing supports efficient multi-value reads
  • Comprehensive test coverage (>85%) ensures reliability

Constructor Pattern

All complex types follow a consistent constructor pattern:

// Primary constructor with validation
obj, err := NewType(params...)
if err != nil {
    return err
}

// Parse from bytes
obj, remainder, err := NewTypeFromBytes(data)
if err != nil {
    return err
}

// Read from stream (no constructor - returns parsed type)
obj, remainder, err := ReadType(data)
if err != nil {
    return err
}

Validation Pattern

All types implement validation methods:

// Comprehensive validation with detailed errors
if err := obj.Validate(); err != nil {
    return fmt.Errorf("validation failed: %w", err)
}

// Boolean convenience method
if !obj.IsValid() {
    return errors.New("object is invalid")
}

Safe Accessors

Types provide both legacy and safe accessor methods:

// Legacy accessor (may return zero on error)
value := integer.Int()

// Safe accessor (returns error)
value, err := integer.IntSafe()
if err != nil {
    return err
}

Package Organization

The library is organized into focused packages:

  • data: Primitive I2P data types
  • base32/base64: I2P-specific encoding
  • certificate: Certificate structures
  • key_certificate: Key-specific certificates
  • keys_and_cert: Combined public keys with certificates
  • destination: Network identities
  • router_identity: Router identities
  • router_address: Router network addresses
  • router_info: Complete router information
  • lease: Individual tunnel leases
  • lease_set: Standard lease sets
  • lease_set2: Extended lease sets
  • encrypted_leaseset: Encrypted lease sets
  • meta_leaseset: Meta lease sets
  • offline_signature: Offline signing support
  • signature: Digital signatures
  • session_tag: Session tags for encryption
  • session_key: Session keys

Example Usage

Creating a destination:

// Generate keys
keyCert, _ := key_certificate.NewEd25519X25519KeyCertificate()
pubKey, privKey := /* generate Ed25519 key pair */
encKey, encPrivKey := /* generate X25519 key pair */

// Create KeysAndCert
kac, err := keys_and_cert.NewKeysAndCert(keyCert, encKey, nil, pubKey)
if err != nil {
    return err
}

// Create Destination
dest, err := destination.NewDestination(kac)
if err != nil {
    return err
}

// Encode as Base32 address
address, err := dest.Base32Address()
fmt.Printf("I2P address: %s.b32.i2p\n", address)

Parsing from bytes:

// Parse destination from bytes
dest, remainder, err := destination.ReadDestination(data)
if err != nil {
    return err
}

// Validate parsed data
if err := dest.Validate(); err != nil {
    return fmt.Errorf("invalid destination: %w", err)
}

Migration from Legacy Code

This library maintains backward compatibility while adding safe constructors:

// OLD (unsafe):
i := data.Integer(someBytes)
value := i.Int()  // May return 0 on error

// NEW (safe):
i, err := data.NewIntegerFromBytes(someBytes)
if err != nil {
    return err
}
value, err := i.IntSafe()
if err != nil {
    return err
}

Specification Compliance

Reference: https://geti2p.net/spec/common-structures

This implementation follows I2P specification version 0.9.67 and is designed for use in I2P routers, clients, and utilities.

Version Information

Use the package constants to check specification version:

fmt.Printf("I2P Spec Version: %s\n", common.I2P_SPEC_VERSION)
fmt.Printf("Major.Minor.Patch: %d.%d.%d\n",
    common.I2P_SPEC_MAJOR,
    common.I2P_SPEC_MINOR,
    common.I2P_SPEC_PATCH)

Package common provides I2P protocol common data structures and utilities.

Index

Constants

View Source
const I2P_SPEC_MAJOR = 0

I2P_SPEC_MAJOR represents the major version component of the I2P specification.

View Source
const I2P_SPEC_MINOR = 9

I2P_SPEC_MINOR represents the minor version component of the I2P specification.

View Source
const I2P_SPEC_PATCH = 67

I2P_SPEC_PATCH represents the patch version component of the I2P specification.

View Source
const I2P_SPEC_VERSION = "0.9.67"

I2P_SPEC_VERSION defines the I2P specification version that this library implements. This constant should be updated whenever the implementation is updated to match a newer specification. Reference: https://geti2p.net/spec/

Variables

This section is empty.

Functions

This section is empty.

Types

This section is empty.

Directories

Path Synopsis
Package base32 implements utilities for encoding and decoding text using I2P's alphabet.
Package base32 implements utilities for encoding and decoding text using I2P's alphabet.
Package base64 implements I2P-specific base64 encoding and decoding utilities.
Package base64 implements I2P-specific base64 encoding and decoding utilities.
Package certificate implements the certificate common-structure of I2P.
Package certificate implements the certificate common-structure of I2P.
Package data implements common data structures used in higher level structures.
Package data implements common data structures used in higher level structures.
Package destination implements the I2P Destination common data structure
Package destination implements the I2P Destination common data structure
Package encrypted_leaseset implements the I2P EncryptedLeaseSet common data structure
Package encrypted_leaseset implements the I2P EncryptedLeaseSet common data structure
fuzz
Package key_certificate implements the I2P Destination common data structure
Package key_certificate implements the I2P Destination common data structure
Package keys_and_cert implements the I2P KeysAndCert common data structure
Package keys_and_cert implements the I2P KeysAndCert common data structure
Package lease implements the I2P lease common data structure
Package lease implements the I2P lease common data structure
Package lease_set constants
Package lease_set constants
Package lease_set2 implements the I2P LeaseSet2 common data structure
Package lease_set2 implements the I2P LeaseSet2 common data structure
Package meta_leaseset implements the I2P MetaLeaseSet common data structure
Package meta_leaseset implements the I2P MetaLeaseSet common data structure
Package offline_signature implements the I2P OfflineSignature common data structure according to specification version 0.9.67.
Package offline_signature implements the I2P OfflineSignature common data structure according to specification version 0.9.67.
Package router_address implements the I2P RouterAddress common data structure
Package router_address implements the I2P RouterAddress common data structure
Package router_identity implements the I2P RouterIdentity common data structure
Package router_identity implements the I2P RouterIdentity common data structure
Package router_info implements the I2P RouterInfo common data structure
Package router_info implements the I2P RouterInfo common data structure
Package session_key implements the I2P SessionKey common data structure
Package session_key implements the I2P SessionKey common data structure
Package session_tag implements the I2P SessionTag common data structure
Package session_tag implements the I2P SessionTag common data structure
Package signature implements the I2P Signature common data structure
Package signature implements the I2P Signature common data structure

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL