Files
golib/encoding

Encoding Package

License: MIT Go Version GoDoc

Unified encoding/decoding interface with implementations for encryption, hashing, hex, multiplexing, and remote reading.

AI Disclaimer (EU AI Act Article 50.4): AI assistance was used solely for testing, documentation, and bug resolution under human supervision.


Table of Contents


Overview

The encoding package provides a unified Coder interface for encoding and decoding operations across multiple implementations including encryption, hashing, hex encoding, multiplexing, and remote data reading.

Design Philosophy

  • Unified Interface: Single Coder interface for all encoding operations
  • Pluggable Implementations: Easy to swap between different encoders
  • Stream Support: Built-in io.Reader/io.Writer wrappers
  • Consistent API: Same methods across all implementations
  • Extensible: Easy to add new encoding implementations

Architecture

Package Structure

encoding/
├── interface.go          # Coder interface definition
│
├── aes/                  # AES-256-GCM authenticated encryption
│   ├── interface.go
│   ├── model.go
│   ├── README.md
│   └── TESTING.md
│
├── hexa/                 # Hexadecimal encoding/decoding
│   ├── interface.go
│   ├── model.go
│   ├── README.md
│   └── TESTING.md
│
├── mux/                  # Multiplexer/DeMultiplexer
│   ├── interface.go
│   ├── mux.go
│   ├── demux.go
│   ├── README.md
│   └── TESTING.md
│
├── randRead/             # Remote random data reader
│   ├── interface.go
│   ├── model.go
│   ├── remote.go
│   ├── README.md
│   └── TESTING.md
│
└── sha256/               # SHA-256 cryptographic hashing
    ├── interface.go
    ├── model.go
    ├── README.md
    └── TESTING.md

Coder Interface Flow

┌──────────────────────────────────────────────────┐
│              Coder Interface                      │
│                                                   │
│  ┌────────────────────────────────────────────┐ │
│  │  Core Methods:                             │ │
│  │  - Encode([]byte) → []byte                │ │
│  │  - Decode([]byte) → ([]byte, error)       │ │
│  │  - Reset()                                 │ │
│  └────────────────────────────────────────────┘ │
│                                                   │
│  ┌────────────────────────────────────────────┐ │
│  │  Streaming Methods:                        │ │
│  │  - EncodeReader(io.Reader) → io.Reader    │ │
│  │  - DecodeReader(io.Reader) → io.Reader    │ │
│  │  - EncodeWriter(io.Writer) → io.Writer    │ │
│  │  - DecodeWriter(io.Writer) → io.Writer    │ │
│  └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
                       │
        ┌──────────────┼──────────────┬──────────────┬──────────────┐
        ▼              ▼              ▼              ▼              ▼
   ┌─────────┐   ┌──────────┐   ┌───────┐   ┌──────────┐   ┌─────────┐
   │   AES   │   │   Hexa   │   │  Mux  │   │ RandRead │   │ SHA256  │
   │ Encrypt │   │Hex Encode│   │Channel│   │  Remote  │   │  Hash   │
   └─────────┘   └──────────┘   └───────┘   └──────────┘   └─────────┘

Sub-Packages

AES Package

Purpose: AES-256-GCM authenticated encryption

Features:

  • Industry-standard authenticated encryption
  • 256-bit key, 96-bit nonce
  • Built-in integrity verification
  • Hardware acceleration (AES-NI)

Use Cases:

  • Secure configuration files
  • Database field encryption
  • Secure file storage
  • API response encryption

Documentation: aes/README.md

Quick Example:

import encaes "github.com/nabbar/golib/encoding/aes"

key, _ := encaes.GenKey()
nonce, _ := encaes.GenNonce()
coder, _ := encaes.New(key, nonce)

encrypted := coder.Encode(plaintext)
decrypted, _ := coder.Decode(encrypted)

Hexa Package

Purpose: Hexadecimal encoding and decoding

Features:

  • Standard hex format (0-9, a-f)
  • Case-insensitive decoding
  • Streaming support
  • Stateless operations

Use Cases:

  • Display binary data
  • Configuration files
  • Debugging output
  • Checksums/hashes

Documentation: hexa/README.md

Quick Example:

import enchex "github.com/nabbar/golib/encoding/hexa"

coder := enchex.New()
hex := coder.Encode([]byte("Hello"))
// Output: 48656c6c6f

decoded, _ := coder.Decode(hex)
// Output: Hello

Mux Package

Purpose: Multiplexing/demultiplexing multiple channels over single stream

Features:

  • Multiple logical channels
  • Rune-based channel keys
  • Thread-safe operations
  • CBOR+Hex encoding

Use Cases:

  • Network protocol multiplexing
  • Log aggregation
  • Test output routing
  • Protocol bridging

Documentation: mux/README.md

Quick Example:

import encmux "github.com/nabbar/golib/encoding/mux"

// Multiplexer
mux := encmux.NewMultiplexer(output, '\n')
channelA := mux.NewChannel('a')
channelA.Write([]byte("data"))

// DeMultiplexer
demux := encmux.NewDeMultiplexer(input, '\n', 4096)
demux.NewChannel('a', outputA)
demux.Copy()

RandRead Package

Purpose: Buffered random data reader from remote sources

Features:

  • Automatic reconnection
  • Internal buffering
  • Thread-safe operations
  • Flexible remote sources

Use Cases:

  • Cryptographic random data
  • Random testing data
  • Load testing
  • Streaming random data

Documentation: randRead/README.md

Quick Example:

import "github.com/nabbar/golib/encoding/randRead"

source := func() (io.ReadCloser, error) {
    return http.Get("https://random-service.example.com/bytes")
}

reader := randRead.New(source)
defer reader.Close()

buffer := make([]byte, 100)
reader.Read(buffer)

SHA256 Package

Purpose: SHA-256 cryptographic hashing

Features:

  • FIPS 180-4 compliant
  • 256-bit output
  • Streaming support
  • Hex-encoded output

Use Cases:

  • File integrity verification
  • Data deduplication
  • Checksum generation
  • Content-addressed storage

Documentation: sha256/README.md

Quick Example:

import encsha "github.com/nabbar/golib/encoding/sha256"

hasher := encsha.New()
hash := hasher.Encode([]byte("data"))
// Output: 64 hex characters

Coder Interface

The Coder interface provides a unified API for all encoding operations.

Interface Definition

type Coder interface {
    // Core operations
    Encode(p []byte) []byte
    Decode(p []byte) ([]byte, error)
    Reset()
    
    // Streaming operations
    EncodeReader(r io.Reader) io.ReadCloser
    DecodeReader(r io.Reader) io.ReadCloser
    EncodeWriter(w io.Writer) io.WriteCloser
    DecodeWriter(w io.Writer) io.WriteCloser
}

Method Overview

Method Purpose Returns
Encode Encode byte slice Encoded bytes
Decode Decode byte slice Decoded bytes + error
EncodeReader Wrap reader for encoding io.ReadCloser
DecodeReader Wrap reader for decoding io.ReadCloser
EncodeWriter Wrap writer for encoding io.WriteCloser
DecodeWriter Wrap writer for decoding io.WriteCloser
Reset Clear internal state -

Usage Pattern

// Create coder (implementation-specific)
coder := NewCoder(params...)

// Direct encoding/decoding
encoded := coder.Encode(data)
decoded, err := coder.Decode(encoded)

// Streaming encoding
encReader := coder.EncodeReader(inputReader)
io.Copy(output, encReader)

// Streaming decoding
decReader := coder.DecodeReader(inputReader)
io.Copy(output, decReader)

// Clean up
coder.Reset()

Quick Start

Installation

# Install specific sub-packages
go get github.com/nabbar/golib/encoding/aes
go get github.com/nabbar/golib/encoding/hexa
go get github.com/nabbar/golib/encoding/mux
go get github.com/nabbar/golib/encoding/randRead
go get github.com/nabbar/golib/encoding/sha256

Basic Example

package main

import (
    "fmt"
    enchex "github.com/nabbar/golib/encoding/hexa"
    encsha "github.com/nabbar/golib/encoding/sha256"
)

func main() {
    // Hex encoding
    hexCoder := enchex.New()
    hexEncoded := hexCoder.Encode([]byte("Hello"))
    fmt.Printf("Hex: %s\n", hexEncoded)
    
    // SHA-256 hashing
    hasher := encsha.New()
    hash := hasher.Encode([]byte("Hello"))
    fmt.Printf("SHA-256: %s\n", hash)
}

Use Cases

Secure Data Pipeline

// Encrypt → Hex encode → Store
func secureStore(data []byte, key, nonce) error {
    // Encrypt
    aes, _ := encaes.New(key, nonce)
    encrypted := aes.Encode(data)
    
    // Hex encode for storage
    hex := enchex.New()
    hexEncoded := hex.Encode(encrypted)
    
    // Store
    return storage.Save(hexEncoded)
}

// Load → Hex decode → Decrypt
func secureLoad(key, nonce) ([]byte, error) {
    // Load
    hexEncoded, _ := storage.Load()
    
    // Hex decode
    hex := enchex.New()
    encrypted, _ := hex.Decode(hexEncoded)
    
    // Decrypt
    aes, _ := encaes.New(key, nonce)
    return aes.Decode(encrypted)
}

Multi-Channel Logging

// Aggregate logs from multiple sources
func aggregateLogs() {
    mux := encmux.NewMultiplexer(logFile, '\n')
    
    // Different log channels
    appLog := mux.NewChannel('a')
    errorLog := mux.NewChannel('e')
    accessLog := mux.NewChannel('s')
    
    // Each subsystem writes independently
    go application.Run(appLog)
    go errorHandler.Run(errorLog)
    go webServer.Run(accessLog)
}

File Integrity System

// Generate and verify checksums
type IntegrityChecker struct {
    hasher encoding.Coder
}

func (ic *IntegrityChecker) GenerateChecksum(file string) string {
    data, _ := os.ReadFile(file)
    hash := ic.hasher.Encode(data)
    return string(hash)
}

func (ic *IntegrityChecker) VerifyChecksum(file, expected string) bool {
    actual := ic.GenerateChecksum(file)
    return actual == expected
}

Best Practices

1. Choose the Right Implementation

// ✅ Good: Use appropriate encoding for use case
aes := encaes.New(key, nonce)       // Encryption
hex := enchex.New()                  // Display/storage
sha := encsha.New()                  // Integrity

2. Handle Errors

// ✅ Good: Check decode errors
decoded, err := coder.Decode(data)
if err != nil {
    log.Printf("Decode error: %v", err)
}

// ❌ Bad: Ignoring errors
decoded, _ := coder.Decode(data)

3. Use Streaming for Large Data

// ✅ Good: Stream large files
file, _ := os.Open("large.bin")
encReader := coder.EncodeReader(file)
io.Copy(output, encReader)

// ❌ Bad: Load entire file
data, _ := os.ReadFile("large.bin")
encoded := coder.Encode(data)

4. Reset State Between Operations

// ✅ Good: Reset between operations
for _, data := range dataList {
    encoded := coder.Encode(data)
    process(encoded)
    coder.Reset()
}

5. Close Readers/Writers

// ✅ Good: Always close
reader := coder.EncodeReader(input)
defer reader.Close()

Testing

Comprehensive testing documentation is available in TESTING.md.

Quick Test:

cd encoding
go test -v ./...

Sub-Package Tests:

cd encoding/aes && go test -v
cd encoding/hexa && go test -v
cd encoding/mux && go test -v
cd encoding/randRead && go test -v
cd encoding/sha256 && go test -v

Contributing

Contributions are welcome! Please follow these guidelines:

Code Contributions

  • Do not use AI to generate package implementation code
  • AI may assist with tests, documentation, and bug fixing
  • All contributions must pass existing tests
  • Maintain interface compatibility
  • Follow existing code style

New Implementations

  • Implement full Coder interface
  • Include comprehensive tests
  • Document use cases
  • Provide examples

Documentation

  • Update README.md for new features
  • Add sub-package documentation
  • Keep TESTING.md synchronized
  • Document all public APIs with GoDoc

See CONTRIBUTING.md for detailed guidelines.


License

MIT License - See LICENSE file for details.

Copyright (c) 2023 Nicolas JUHEL


Resources


This package is part of the golib project.