Skip to content

Import path: gitlab.soludian.com/soludian/fountain/libs/crypto

crypto

go
import "gitlab.soludian.com/soludian/fountain/libs/crypto"

Index

Constants

go
const (
    KAlgorithmHmacSha1   = "HMAC_SHA1"
    KAlgorithmHmacSha256 = "HMAC_SHA256"
    KAlgorithmAesCbc     = "AES_CBC"
    KAlgorithmAesCtr     = "AES_CTR"
    KAlgorithmAesGcm     = "AES_GCM"
    KAlgorithmAesIge     = "AES_IGE"
    KAlgorithmRsa        = "RSA"
    KAlgorithmDES        = "DES"
    KAlgorithmAES        = "AES"
    KAlgorithmRSA        = "RSA"
    KAlgorithmBLOWFISH   = "BLOWFISH"
    KAlgorithmECC        = "ECC"
    KAlgorithmCHACHA20   = "CHACHA20"
    KAlgorithmSALSA2     = "SALSA20"
)

go
const (
    KMD5     = "MD5"
    KSha1    = "SHA1"
    KSha256  = "SHA256"
    KSha384  = "SHA384"
    KBlake2b = "BLAKE2B"
    KBlake2s = "BLAKE2S"
    KSha3224 = "SHA3_224"
    KSha3256 = "SHA3_256"
    KSha3384 = "SHA3_384"
    KSha3512 = "SHA3_512"
)

go
const (
    OvcTokenExpirationTime = 1
    OvcAppID               = 13213123
)

go
const (
    HashMD4         crypto.Hash = 1 + iota // import golang.org/x/crypto/md4
    HashMD5                                // import crypto/md5
    HashSHA1                               // import crypto/sha1
    HashSHA224                             // import crypto/sha256
    HashSHA256                             // import crypto/sha256
    HashSHA384                             // import crypto/sha512
    HashSHA512                             // import crypto/sha512
    HashMD5SHA1                            // no implementation; MD5+SHA1 used for TLS RSA
    HashRIPEMD160                          // import golang.org/x/crypto/ripemd160
    HashSHA3_224                           // import golang.org/x/crypto/sha3
    HashSHA3_256                           // import golang.org/x/crypto/sha3
    HashSHA3_384                           // import golang.org/x/crypto/sha3
    HashSHA3_512                           // import golang.org/x/crypto/sha3
    HashSHA512_224                         // import crypto/sha512
    HashSHA512_256                         // import crypto/sha512
    HashBLAKE2s_256                        // import golang.org/x/crypto/blake2s
    HashBLAKE2b_256                        // import golang.org/x/crypto/blake2b
    HashBLAKE2b_384                        // import golang.org/x/crypto/blake2b
    HashBLAKE2b_512                        // import golang.org/x/crypto/blake2b
)

go
const (
    KPackageName = "crypto"
)

Variables

go
var (
    // ErrInvalidBlockSize indicates hash blocksize <= 0.
    ErrInvalidBlockSize = fmt.Errorf("invalid blocksize - data too small")

    // ErrInvalidPKCS7Data indicates bad input to PKCS7 pad or unpad.
    ErrInvalidPKCS7Data = fmt.Errorf("invalid pkcs7 data (empty or not padded)")

    // ErrInvalidPKCSPadding indicates PKCS7 unpad fails to bad input.
    ErrInvalidPKCSPadding = fmt.Errorf("invalid padding - data not divisible by block size")

    ErrInvalidPKCSPaddingDecoded = fmt.Errorf("invalid padding - padding decoded invalid")
)

go
var (
    ErrInvalidPEMBlockPrivateKey = fmt.Errorf("invalid PEM block - failed to decode PEM block containing private key")
    ErrInvalidPEMBlockPublicKey  = fmt.Errorf("invalid PEM block - failed to decode PEM block containing public key")
    ErrInvalidPrivateKey         = fmt.Errorf("invalid private key")
    ErrInvalidPublicKey          = fmt.Errorf("invalid public key")
)

go
var (
    ErrDataLen         = fmt.Errorf("data length error")
    ErrDataBroken      = fmt.Errorf("data broken, first byte is not zero")
    ErrKeyPairDismatch = fmt.Errorf("data is not encrypted by the private key")
)

go
var (
    ErrPEMDecode             = errors.New("PEM decode failed")
    ErrUnsupportedFormat     = errors.New("key is neither in PKCS#1 nor PKCS#8 format")
    ErrUnsupportedPrivateKey = errors.New("unsupported key type, must be RSA, ECDSA or ED25519 private key")
)

go
var ErrUnsupportedAlgorithm = fmt.Errorf("unsupported algorithm")

go
var GetFountainInstance = Lib.GetFountainInstance

go
var GetFountainManager = Lib.GetFountainManager

Sử dụng khi config instance ở dạng key:value; Nếu config instance ở dạng key:array thì sử dụng hàm InstallFountainInstances Nếu config ở dạng key:array thì sẽ chỉ install config phần tử đầu tiên mà thôi

Install with config format <key>:<value>; eg: crypto:<value>

Usage:

config.yaml:

	crypto:
	  name: default_name
	  ...

	code.go

	crypto.InstallFountainInstance()

 crypto.WithConfigKey("crypto").InstallFountainInstance()
go
var InstallFountainInstance = Lib.InstallFountainInstance

Sử dụng khi config instance ở dạng key:array<value>; Sẽ luôn cố gắng khởi tạo kể cả khi config ở dạng key:value

Install with config format <key>:array<value>; eg: crypto:array<value>

Usage:

config.yaml:

crypto:
  - name: default_name
    ...

code.go

crypto.InstallFountainInstances()

crypto.WithConfigKey("crypto").InstallFountainInstances()
go
var InstallFountainInstances = Lib.InstallFountainInstances

Truy cập thẳng tới bộ quản lý thư viện

go
var Lib = lib_3rd.NewLib(NewCryptor, lib_3rd.WithDefaultConfigFunc[Config, cryptor](DefaultConfig))

go
var WithConfigKey = Lib.WithConfigKey

func AddLenData

go
func AddLenData(customNotifyJSON []byte) []byte

func BytesToPrivateKey

go
func BytesToPrivateKey(b []byte) (crypto.PublicKey, jose.SignatureAlgorithm, error)

func CRC32Hash

go
func CRC32Hash(data string) uint32

func CalcMd5File

go
func CalcMd5File(filename string) (string, error)

func CalculateAESKeyAndAESIV

go
func CalculateAESKeyAndAESIV(msgKey, secret []byte) ([]byte, []byte)

func CalculateMsgKey

go
func CalculateMsgKey(customNotifyJSON, bytesCheck []byte, secret []byte) []byte

func CalculatePaddingSize

go
func CalculatePaddingSize(lenData int32) int32

func CalculateSha1ForNotify

go
func CalculateSha1ForNotify(lenData, additionalSize int32, secret []byte) []byte

func ComputeFingerprint

go
func ComputeFingerprint(publicKey *rsa.PublicKey) (string, error)

func ComputeFingerprintMD5

go
func ComputeFingerprintMD5(publicKey *rsa.PublicKey) (string, error)

func ComputePrivateFingerprintNum

go
func ComputePrivateFingerprintNum(key *rsa.PrivateKey) uint64

func GenMd5

go
func GenMd5(src any) string

GenMd5 Generate a 32-bit md5 string

func GenerateNonce

go
func GenerateNonce(size int) []byte

func GenerateStringNonce

go
func GenerateStringNonce(size int) string

func Hash

go
func Hash(hash hash.Hash, s string, firstHalf bool) []byte

func HashRawURLString

go
func HashRawURLString(hash hash.Hash, s string, firstHalf bool) string

using base64 raw url encoding

func HashString

go
func HashString(hash hash.Hash, s string, firstHalf bool) string

using base64 std encoding

func HashURLString

go
func HashURLString(hash hash.Hash, s string, firstHalf bool) string

using base64 raw url encoding

func HashedData

go
func HashedData(data any, hIdx ...crypto.Hash) (crypto.Hash, []byte)

func HashedDataString

go
func HashedDataString(data any, hIdx ...crypto.Hash) (crypto.Hash, string)

func HmacMD5

go
func HmacMD5(key, data string) []byte

func HmacSha1

go
func HmacSha1(key, data string) []byte

func HmacSha256

go
func HmacSha256(key, data string) []byte

func HmacSha512

go
func HmacSha512(key, data string) []byte

func MD5

go
func MD5(src any) string

MD5 Generate a 32-bit md5 string

func MD5Bytes

go
func MD5Bytes(src any) []byte

MD5Bytes Generate a 32-bit md5 bytes

func OVCGenerateToken

go
func OVCGenerateToken(roomID int64, userID int32) (string, error)

OVCGenerateToken func

func PasswordHash

go
func PasswordHash(pwd string) string

PasswordHash for quick hash an input password string

func PasswordVerify

go
func PasswordVerify(bcryptHash, plainPwd string) bool

PasswordVerify for quick verify input password is valid

- bcryptHash from db or config, generated by PasswordEncrypt()

func Sha1Digest

go
func Sha1Digest(data []byte) []byte

func Sha1DigestString

go
func Sha1DigestString(data string) string

func Sha256Digest

go
func Sha256Digest(data []byte) []byte

func Sha256DigestString

go
func Sha256DigestString(data string) string

func SignPayloadWithJose

go
func SignPayloadWithJose(payload []byte, signer jose.Signer) (string, error)

func SignWithJose

go
func SignWithJose(object any, signer jose.Signer) (string, error)

func WithAlgorithm

go
func WithAlgorithm(algorithm string) lib_3rd.Option[Config]

func WithConfig

go
func WithConfig(conf *Config) lib_3rd.Option[Config]

WithConfig Required. Set Config

func WithEnvironment

go
func WithEnvironment(env string) lib_3rd.Option[Config]

func WithKey

go
func WithKey(key string) lib_3rd.Option[Config]

func WithName

go
func WithName(name string) lib_3rd.Option[Config]

func WithNonce

go
func WithNonce(nonce string) lib_3rd.Option[Config]

func WithPrivateKey

go
func WithPrivateKey(pri string) lib_3rd.Option[Config]

func WithPublicKey

go
func WithPublicKey(pub string) lib_3rd.Option[Config]

type Config

go
type Config struct {
    lib_3rd.BaseConfig  `conf:",squash"`
    Algorithm           string `conf:"algorithm" json:"algorithm"` // to be UPPER format: AES-CBC, AES-CBC, AES-CTR, AES-CTR, RSA, RSA
    ConfigSymmetricKey  `conf:",squash"`
    ConfigAsymmetricKey `conf:",squash"`
    ConfigStreamKey     `conf:",squash"`
}

func DefaultConfig

go
func DefaultConfig() *Config

DefaultConfig returns the default configuration

func (*Config) Validate

go
func (conf *Config) Validate() error

type ConfigAsymmetricKey

go
type ConfigAsymmetricKey struct {
    PrivateKey     string `conf:"private_key" json:"private_key"`
    PublicKey      string `conf:"public_key" json:"public_key"`
    FingerPrintNum uint64 `conf:"fingerprint_num" json:"fingerprint_num"`
}

func DefaultConfigAsymmetricKey

go
func DefaultConfigAsymmetricKey() ConfigAsymmetricKey

type ConfigStreamKey

go
type ConfigStreamKey struct {
    Nonce string `conf:"nonce" json:"nonce"`
}

func DefaultConfigStreamKey

go
func DefaultConfigStreamKey() ConfigStreamKey

type ConfigSymmetricKey

go
type ConfigSymmetricKey struct {
    Key string `conf:"key" json:"secret_key"`
}

func DefaultConfigSymmetricKey

go
func DefaultConfigSymmetricKey() ConfigSymmetricKey

type CryptorInf

go
type CryptorInf interface {
    GetName() string                                          // RSA-256, AES-CBC,..
    Encrypt(data []byte) ([]byte, error)                      // data -> encrypted
    Decrypt(dataEncrypted []byte) ([]byte, error)             // data encrypted -> decrypted
    EncryptBase64(data []byte) (string, error)                // data -> encrypted -> base64
    DecryptBase64(dataEncryptedBase64 string) (string, error) // base64 -> data encrypted -> decrypted
}

func NewAESCryptor

go
func NewAESCryptor(conf *Config) CryptorInf

type DESCryptor

key size 8 bytes

go
type DESCryptor struct {
    // contains filtered or unexported fields
}

func NewDESCryptor

go
func NewDESCryptor(key string) *DESCryptor

Thuật toán DES được sử dụng để mã hóa và giải mã các block (khối) dữ liệu 64 bit dựa trên một key (khóa mã) 64 bit. Chú ý, các block được đánh số thứ tự bit từ trái sang phải và bắt đầu từ 1, bit đầu tiên bên trái là bit số 1 và bit cuối cùng bên phải là bit số 64. Quá trình giải mã và mã hóa sử dụng cùng một key nhưng thứ tự phân phối các giá trị các bit key của quá trình giải mã ngược với quá trình mã hóa. DES sử dụng khóa 64-bit, trong đó chỉ có 56 bit là khóa thực sự (các bit còn lại dùng để kiểm tra chẵn lẻ). DES hiện không còn được coi là an toàn cho các ứng dụng hiện đại do kích thước khóa nhỏ. Tuy nhiên, thuật toán này vẫn được sử dụng trong một số hệ thống cũ và cho mục đích học tập.

func (*DESCryptor) Decrypt

go
func (cr *DESCryptor) Decrypt(dataEncrypted []byte) ([]byte, error)

func (*DESCryptor) DecryptBase64

go
func (cr *DESCryptor) DecryptBase64(dataEncryptedBase64 string) (string, error)

func (*DESCryptor) Encrypt

go
func (cr *DESCryptor) Encrypt(data []byte) ([]byte, error)

func (*DESCryptor) EncryptBase64

go
func (cr *DESCryptor) EncryptBase64(data []byte) (string, error)

func (*DESCryptor) GetName

go
func (cr *DESCryptor) GetName() string

type DecodeString

base64: std, url, raw url hex

go
type DecodeString func(string) string

type EncodeToStringFunc

base64: std, url, raw url hex

go
type EncodeToStringFunc func([]byte) string

type SalSa20Cryptor

32 bytes

go
type SalSa20Cryptor struct {
    // contains filtered or unexported fields
}

func NewSalSa20Cryptor

go
func NewSalSa20Cryptor(key string) *SalSa20Cryptor

SalSa20Cryptor là một struct quản lý việc mã hóa và giải mã bằng thuật toán Salsa20, một thuật toán mã hóa dòng (stream cipher) hiệu quả và nhanh chóng. Salsa20 sử dụng một khóa đối xứng duy nhất để mã hóa và giải mã dữ liệu, với cùng một khóa được sử dụng cho cả hai quá trình. Mã hóa bằng Salsa20 hoạt động theo nguyên tắc XOR dữ liệu gốc với một chuỗi bit tạo ra từ khóa và một nonce duy nhất cho mỗi lần mã hóa. Quá trình mã hóa tạo ra ciphertext bằng cách áp dụng chuỗi bit này lên dữ liệu gốc \(C = M \oplus \text{keyStream}\), với M là dữ liệu gốc. Để giải mã, chuỗi bit được tạo ra lại và XOR với ciphertext để lấy lại dữ liệu gốc \(M = C \oplus \text{keyStream}\). `SalSa20Cryptor` cung cấp một phương thức mã hóa và giải mã đơn giản, lưu trữ khóa dưới dạng chuỗi và sử dụng chuỗi này để tạo ra một mảng byte khi cần thiết. Nonce được tạo ngẫu nhiên cho mỗi lần mã hóa để đảm bảo rằng ngay cả khi mã hóa cùng một dữ liệu với cùng một khóa, ciphertext sẽ khác nhau. Mặc dù Salsa20 có hiệu năng rất cao và an toàn, việc quản lý và bảo vệ khóa vẫn là yếu tố quan trọng để đảm bảo tính bảo mật. Constructor `NewSalSa20Cryptor` nhận vào một khóa dưới dạng chuỗi, đảm bảo rằng khóa có độ dài chính xác là 32 byte, sau đó lưu trữ khóa này trong struct. Hiệu năng và khả năng của Salsa20 kém hơn so với ChaCha20

func (*SalSa20Cryptor) Decrypt

go
func (cr *SalSa20Cryptor) Decrypt(dataEncrypted []byte) ([]byte, error)

func (*SalSa20Cryptor) DecryptBase64

go
func (cr *SalSa20Cryptor) DecryptBase64(dataEncryptedBase64 string) (string, error)

func (*SalSa20Cryptor) Encrypt

go
func (cr *SalSa20Cryptor) Encrypt(data []byte) ([]byte, error)

Encrypt encrypts the data using the SALSA20 algorithm. Luôn tự động cắt/bù đủ 32 bytes

func (*SalSa20Cryptor) EncryptBase64

go
func (cr *SalSa20Cryptor) EncryptBase64(data []byte) (string, error)

func (*SalSa20Cryptor) GetName

go
func (cr *SalSa20Cryptor) GetName() string

type SingerInf

go
type SingerInf interface {
    GetName() string                                         // RSA-256, ECC
    Sign(data any, her ...crypto.Hash) (string, error)       // Return hex encoded string
    SignBase64(data any, her ...crypto.Hash) (string, error) // Return base64 encoded string
    Verify(data any, signDataHex string, her ...crypto.Hash) error
    VerifyBase64(data any, signDataBase64 string, her ...crypto.Hash) error
}

Generated by gomarkdoc