Documentation
¶
Overview ¶
Package crypt 提供 GM/T 0099-2020 OFD 检查、加密和视图功能。
Index ¶
- Constants
- Variables
- type CredentialRequest
- type CredentialResolver
- type Credentials
- type DecryptOptions
- type DecryptReport
- type Diagnostic
- type EncryptOptions
- type EncryptRecipient
- type EncryptReport
- type Entry
- type Info
- type InspectOptions
- type Limits
- type LockedError
- type Mapping
- type Mode
- type OpenOptions
- type Operation
- type OperationResult
- type PageSelection
- type Provider
- type Recipient
- type SeedInfo
- type SeedResult
- type View
Examples ¶
Constants ¶
View Source
const ( ModeStrict = protocol.ModeStrict ModeCompat = protocol.ModeCompat PasswordScheme = protocol.PasswordScheme CertificateScheme = protocol.CertificateScheme )
Variables ¶
View Source
var ( ErrClosed = container.ErrPackageClosed ErrLocked = protocol.ErrLocked ErrInvalidMetadata = protocol.ErrInvalidMetadata ErrLimitExceeded = protocol.ErrLimitExceeded ErrNotEncrypted = protocol.ErrNotEncrypted ErrAlreadyEncrypted = protocol.ErrAlreadyEncrypted ErrUnsupported = protocol.ErrUnsupported ErrCredentialsRequired = protocol.ErrCredentialsRequired ErrDecryptFailed = protocol.ErrDecryptFailed ErrProtectedContent = protocol.ErrProtectedContent )
Functions ¶
This section is empty.
Types ¶
type CredentialRequest ¶
type CredentialRequest = protocol.CredentialRequest
type CredentialResolver ¶
type CredentialResolver = protocol.CredentialResolver
type Credentials ¶
type Credentials = protocol.Credentials
type DecryptOptions ¶
type DecryptOptions = protocol.DecryptOptions
type DecryptReport ¶
type DecryptReport = protocol.DecryptReport
func Decrypt ¶
func Decrypt(ctx context.Context, input any, w io.Writer, opt DecryptOptions) (*DecryptReport, error)
Decrypt 将单个加密操作恢复为明文 OFD ZIP,支持口令和证书接收者以及明文和加密映射表。 输入类型及资源所有权与 Inspect 一致;不会关闭 w,也不会创建明文临时文件。发生错误时, 输出可能不完整,必须丢弃;写文件的调用方应先写入临时文件,成功后再重命名。 只有完整写出结果后才会返回非 nil 的报告。
type Diagnostic ¶
type Diagnostic = protocol.Diagnostic
type EncryptOptions ¶
type EncryptOptions = protocol.EncryptOptions
type EncryptRecipient ¶
type EncryptRecipient = protocol.EncryptRecipient
type EncryptReport ¶
type EncryptReport = protocol.EncryptReport
func Encrypt ¶
func Encrypt(ctx context.Context, input any, w io.Writer, opt EncryptOptions) (*EncryptReport, error)
Encrypt 按 GM/T 0099-2020 写入新操作,支持独立条目密钥及页面范围。 Append 非 nil 时先用旧凭据预检,再在现有线性加密链外追加一层。 输入/输出所有权及失败处理与 Decrypt 一致,文档条目不重新序列化。
Example ¶
package main
import (
"bytes"
"context"
"fmt"
"github.com/klauspost/compress/zip"
"github.com/zc310/ofd/pkg/crypt"
)
func main() {
var input bytes.Buffer
archive := zip.NewWriter(&input)
entry, err := archive.Create("OFD.xml")
if err != nil {
panic(err)
}
if _, err := entry.Write([]byte(`<OFD xmlns="http://www.ofdspec.org/2016" Version="1.0" DocType="OFD"/>`)); err != nil {
panic(err)
}
if err := archive.Close(); err != nil {
panic(err)
}
ctx := context.Background()
var encrypted, plaintext bytes.Buffer
report, err := crypt.Encrypt(ctx, input.Bytes(), &encrypted, crypt.EncryptOptions{
Recipients: []crypt.EncryptRecipient{{UserName: "reader", Password: []byte("示例口令")}},
IndependentKeys: true,
})
if err != nil {
panic(err)
}
fmt.Println(report.State, report.EncryptedEntries)
result, err := crypt.Decrypt(ctx, encrypted.Bytes(), &plaintext, crypt.DecryptOptions{Password: []byte("示例口令")})
if err != nil {
panic(err)
}
fmt.Println(result.State, result.DecryptedEntries)
info, err := crypt.Inspect(ctx, plaintext.Bytes(), crypt.InspectOptions{})
if err != nil {
panic(err)
}
fmt.Println(info.Encrypted)
}
Output: locked 1 unlocked 1 false
Example (Append) ¶
package main
import (
"bytes"
"context"
"fmt"
"github.com/klauspost/compress/zip"
"github.com/zc310/ofd/pkg/crypt"
)
func main() {
var input, inner, outer bytes.Buffer
z := zip.NewWriter(&input)
w, err := z.Create("OFD.xml")
if err != nil {
panic(err)
}
if _, err := w.Write([]byte(`<OFD xmlns="http://www.ofdspec.org/2016"/>`)); err != nil {
panic(err)
}
if err := z.Close(); err != nil {
panic(err)
}
ctx := context.Background()
if _, err := crypt.Encrypt(ctx, input.Bytes(), &inner, crypt.EncryptOptions{
Recipients: []crypt.EncryptRecipient{{UserName: "reader", Password: []byte("inner")}},
}); err != nil {
panic(err)
}
report, err := crypt.Encrypt(ctx, inner.Bytes(), &outer, crypt.EncryptOptions{
Recipients: []crypt.EncryptRecipient{{UserName: "reader", Password: []byte("outer")}},
Append: &crypt.DecryptOptions{Password: []byte("inner")},
})
if err != nil {
panic(err)
}
fmt.Println(report.OperationID, report.Relative)
}
Output: enc2 enc1
type InspectOptions ¶
type InspectOptions = protocol.InspectOptions
type LockedError ¶
type LockedError = protocol.LockedError
type OpenOptions ¶
type OpenOptions = protocol.OpenOptions
type OperationResult ¶
type OperationResult = protocol.OperationResult
type PageSelection ¶
type PageSelection = protocol.PageSelection
type SeedResult ¶
type SeedResult = protocol.SeedResult
Click to show internal directories.
Click to hide internal directories.