core

package
v0.0.9 Latest Latest
Warning

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

Go to latest
Published: Feb 10, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Overview

Package core provides shared cryptographic and data handling functions that work in both CLI and WASM environments.

Index

Constants

View Source
const (
	// MaxFileSize is the maximum size of a single file during extraction (100 MB).
	MaxFileSize = 100 * 1024 * 1024
	// MaxTotalSize is the maximum total size of all extracted files (1 GB).
	MaxTotalSize = 1024 * 1024 * 1024
)
View Source
const (
	ShareBegin = "-----BEGIN REMEMORY SHARE-----"
	ShareEnd   = "-----END REMEMORY SHARE-----"

	// DefaultRecoveryURL is the default base URL for QR codes in PDFs.
	// Points to the recover.html hosted on GitHub Pages.
	DefaultRecoveryURL = "https://eljojo.github.io/rememory/recover.html"
)

Variables

View Source
var ErrEmptyPassphrase = errors.New("passphrase cannot be empty")

ErrEmptyPassphrase is returned when an empty passphrase is provided.

Functions

func Combine

func Combine(shares [][]byte) ([]byte, error)

Combine reconstructs the secret from k or more shares. Returns an error if fewer than 2 shares are provided. Note: If corrupted or wrong shares are provided, this may return garbage data without error. Use verification hashes to detect this.

func DecodeShareWords added in v0.0.8

func DecodeShareWords(words []string) (data []byte, index int, err error)

DecodeShareWords decodes 25 BIP39 words into share data and index. The first 24 words are decoded to bytes; the 25th word carries index + checksum. Returns index=0 if the share index was > 15 (the sentinel value). Returns an error if the checksum doesn't match (wrong word order, typos, etc.).

func DecodeWords added in v0.0.8

func DecodeWords(words []string) ([]byte, error)

DecodeWords converts BIP39 words back to bytes. Returns an error with typo suggestions if a word is not recognized.

func Decrypt

func Decrypt(dst io.Writer, src io.Reader, passphrase string) error

Decrypt decrypts age-encrypted data using a passphrase.

func DecryptBytes

func DecryptBytes(encryptedData []byte, passphrase string) ([]byte, error)

DecryptBytes is a convenience function that decrypts data and returns bytes.

func EncodeWords added in v0.0.8

func EncodeWords(data []byte) []string

EncodeWords converts bytes to BIP39 words (11 bits per word). 33 bytes (264 bits) produces exactly 24 words.

func Encrypt

func Encrypt(dst io.Writer, src io.Reader, passphrase string) error

Encrypt encrypts data using age with a passphrase (scrypt mode). The passphrase is used to derive an encryption key using scrypt.

func HashBytes

func HashBytes(b []byte) string

HashBytes returns the SHA-256 hash of bytes, prefixed with "sha256:".

func HashString

func HashString(s string) string

HashString returns the SHA-256 hash of a string, prefixed with "sha256:".

func RecoverPassphrase added in v0.0.8

func RecoverPassphrase(recovered []byte, version int) string

RecoverPassphrase converts raw bytes from Combine() into the age passphrase. V1 shares contain the passphrase string directly; v2+ shares contain raw bytes that must be base64url-encoded.

func SanitizeFilename

func SanitizeFilename(name string) string

SanitizeFilename converts a name to a filesystem-safe lowercase ASCII string. It transliterates accented/diacritic characters to their ASCII base form (e.g. "José" → "jose", "Müller" → "muller") using NFD decomposition.

func Split

func Split(secret []byte, n, k int) ([][]byte, error)

Split divides a secret into n shares, requiring k to reconstruct. Parameters:

  • secret: the data to split (e.g., a passphrase)
  • n: total number of shares to create (2-255)
  • k: minimum shares needed to reconstruct (2-n)

func SuggestWord added in v0.0.8

func SuggestWord(input string) string

SuggestWord finds the closest BIP39 word by Levenshtein distance (max 2). Returns empty string if no close match is found.

func ValidateShamirParams

func ValidateShamirParams(n, k int) error

ValidateShamirParams validates the parameters for Shamir's Secret Sharing.

func VerifyHash

func VerifyHash(got, expected string) bool

VerifyHash checks if the given hash matches the expected value. Uses constant-time comparison to prevent timing attacks.

Types

type ExtractedFile

type ExtractedFile struct {
	Name string
	Data []byte
}

ExtractedFile represents a file extracted from a tar.gz archive.

func ExtractTarGz

func ExtractTarGz(tarGzData []byte) ([]ExtractedFile, error)

ExtractTarGz extracts files from tar.gz data in memory. This is used by both CLI and WASM for in-memory extraction. For file-based extraction, use the manifest package.

func ExtractTarGzReader

func ExtractTarGzReader(r io.Reader) ([]ExtractedFile, error)

ExtractTarGzReader extracts files from a tar.gz reader.

type Share

type Share struct {
	Version   int       // Format version (1 or 2)
	Index     int       // Which share (1-indexed for humans)
	Total     int       // Total shares (N)
	Threshold int       // Required shares (K)
	Holder    string    // Name of the person holding this share
	Created   time.Time // When the share was created
	Data      []byte    // The actual share bytes
	Checksum  string    // SHA-256 of Data
}

Share represents a single Shamir share with metadata.

func NewShare

func NewShare(version, index, total, threshold int, holder string, data []byte) *Share

NewShare creates a Share with the given parameters and computes its checksum.

func ParseCompact added in v0.0.8

func ParseCompact(s string) (*Share, error)

ParseCompact parses a compact-encoded share string back into a Share. It validates the format, decodes the data, and verifies the short checksum.

func ParseShare

func ParseShare(content []byte) (*Share, error)

ParseShare parses a share from its encoded format. The content can be a full README.txt file - it will find the share block.

func (*Share) CompactEncode added in v0.0.8

func (s *Share) CompactEncode() string

CompactEncode returns a short string encoding of the share suitable for QR codes and URL fragments. Format: RM{version}:{index}:{total}:{threshold}:{base64url_data}:{short_check} The short_check is the first 4 hex characters of the SHA-256 of the raw share data.

func (*Share) Encode

func (s *Share) Encode() string

Encode converts the share to a human-readable PEM-like format.

func (*Share) Filename

func (s *Share) Filename() string

Filename returns a suggested filename for this share.

func (*Share) Verify

func (s *Share) Verify() error

Verify checks that the share's checksum matches its data. Uses constant-time comparison to prevent timing attacks.

func (*Share) Words added in v0.0.8

func (s *Share) Words() ([]string, error)

Words returns this share's data encoded as 25 BIP39 words. The first 24 words encode the share data (33 bytes = 264 bits, 11 bits per word). The 25th word packs 4 bits of share index + 7 bits of checksum (see word25 layout above). Returns an error for v1 shares or if the share index is negative.

Jump to

Keyboard shortcuts

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