package
0.0.0-20241120162251-6ab394e6f884
Repository: https://github.com/taewook427/project_gen5.git
Documentation: pkg.go.dev

# README

stdlib5.legsup [win & linux] : gen1~4 구세대 데이터 형식 호환 계층.

common: func G3mold() -> byte[] # gen3kpic에 사용되는 기본 주형 사진. (png binary) func G3zip() -> byte[] # gen3kzip에 사용되는 아이콘 사진. (png binary) func G3kf() -> byte[] # gen3kaes의 기본키파일. func G3pic() -> byte[] # gen3kaes에 사용되는 아이콘 사진. (png binary) func G4kf() -> byte[] # gen4kaes의 기본키파일. func G4pic() -> byte[] # gen4kaes에 사용되는 아이콘 사진. (png binary) func Genkf(str path) -> byte[] # 경로의 파일을 모두 읽어 반환, 오류 시 nil 반환.

gen1: struct G1enc func Init() # 구조체 내부 필드를 초기화. func Encrypt() -> error # 구조체 내부 데이터를 참고하여 암호화. func Decrypt() -> error # 구조체 내부 데이터를 참고하여 복호화. func View() -> error # 구조체 내부 데이터를 참고하여 암호화된 파일 정보 해석.

    .Path str # 암호화/복호화/해석 대상 파일 경로.
    .Pw str # 비밀번호.
    .Hint str # 비밀번호 힌트.

gen2: struct G2enc func Init() # 구조체 내부 필드를 초기화. func Encrypt() -> (str, error) # 구조체 내부 데이터를 참고하여 암호화. 암호화 결과 경로 반환. func Decrypt() -> error # 구조체 내부 데이터를 참고하여 복호화. func View() -> error # 구조체 내부 데이터를 참고하여 암호화된 파일 정보 해석.

    .Path str # 암호화/복호화/해석 대상 파일 경로.
    .Pw str # 비밀번호.
    .Hint str # 비밀번호 힌트.
    .Hidename bool # 암호화 시 파일명 숨김 옵션. True일 경우 파일명 숨김.

gen3: struct G3data func Init() # gen3kdb 항목 하나를 이루는 데이터 노드를 초기화. func Append(G3data* tgt) # 데이터 노드의 가장 끝에 데이터 노드 추가. (리스트 형식 데이터 등에 사용) func Length() -> int # 현재 노드를 시작으로 끝 노드까지의 길이. func Locate(int pos) -> G3data* # 현재 노드를 기준으로 pos번째 노드 반환. func Print(bool zipstr, bool zipexp) -> str # 노드 문자열 출력. zipstr/zipexp는 문자열/표현형식 단축 여부.

    .Next *G3data # 다음 데이터 노드 포인터. 없을 경우 nil.
    .Vtype rune # 데이터 노드의 값 종류. ('i', 'f', 's', 'n')
    .IntV int # 정수 값 저장 위치.
    .FloatV float # 실수 값 저장 위치.
    .StrV str # 문자열 값 저장 위치.

struct G3node
    func Read(str[] frag, rune[] trait) -> error
    # gen3kdb의 kobj 하나에 해당하는 구문을 파싱 후 저장.
    func Write(int indent, bool zipstr, bool zipexp) -> str
    # indent만큼 공백 들여쓰기, 문자열/표현형식 압축 여부에 따라 텍스트 생성.
    func Locate(str name) -> G3node*
    # 현재 레벨에서 name 이름을 가진 하위 노드 반환. 존재하지 않으면 nil 반환.
    func Revise(G3data* tgt) -> error
    # 이 노드의 데이터를 tgt로 수정.

    .Name str # 이 kobj/node의 이름.
    .Data G3data* # 데이터 노드. 객체 역할인 경우 nil.
    .Child G3node[] # 자식 노드들. 데이터 역할인 경우 nil.

struct G3kdb
    func Read(str raw) -> error
    # gen3kdb 문자열을 입력받아 해석, 내부 데이터 저장.
    func Write() -> str
    # 내부 데이터를 gen3kdb 문자열로 출력.
    func Locate(str name) -> G3node*
    # "#"으로 구분된 주소를 가진 노드 반환. 존재하지 않으면 nil 반환.

    .Zipstr bool # 문자열 압축 여부. 압축 시 공백/줄바꿈이 #표현으로 바뀜.
    .Zipexp bool # 표현형식 압축 여부. 압축 시 들여쓰기와 텍스트 구조에 공백/줄바꿈이 사라짐.
    .Node G3node* # 내부 노드. 이 노드를 설정하여 임의 데이터 구조 생성 가능.

struct G3kzip
    func Init()
    # 패키징에 필요한 내부 데이터 설정.
    func Packf(str[] tgt, str path) -> error
    # 파일들 패키징. tgt 항목을 패키징해 path에 생성.
    func Packd(str tgt, str path) -> error
    # 폴더 패키징. tgt 폴더를 패키징해 path에 생성.
    func View(str tgt) -> error
    # 패키징된 파일 정보 해석. CRC32 값 검사.
    func Unpack(str tgt) -> error
    # 패키징된 tgt 파일 풀기. "./temp261/" 폴더에 생성됨.

    .Prehead byte[] # 사진 위장 헤더. (1024nB)
    .Header byte[] # 메인헤더 (18B)
    .Chunkpos int[] # 청크 시작 위치. subhead + data가 한 청크.
    .Subhead byte[][] # 각 청크의 subhead.
    .Winsign bool # 폴더 표시를 위해 백슬래시 사용. (윈도우 전용 구형 코드와 호환성)

struct G3kaesall
    func Init(int core, int chunk)
    # 전체모드 암호화에 필요한 내부 데이터 설정. (0, 0)으로 기본 모드(32, 128k).
    func Encrypt(str path, str pw, byte[] kf) -> error
    # path 파일을 암호화.
    func Decrypt(str path, str pw, byte[] kf) -> error
    # path 파일을 복호화.
    func View(str path) -> error
    # 암호화된 path 파일의 정보 해석.

    .Prehead byte[] # 사진 위장 헤더. (1024nB)
    .Metadata byte[] # 메타데이터 (18B)
    .Mainhead byte[] # 메인헤더
    .Subhead byte[] # 보조헤더 (현재 사용하지 않음)
    .Hidename bool # 이름 숨기기 여부. True일 경우 무작위 숫자 파일명으로 생성됨.
    .Hint str # 비밀번호 힌트.
    .Respath str # 암호화/복호화 결과 파일 경로.

struct G3kaesfunc
    func Encrypt(str before, str after, byte[] akey) -> error
    # 32B akey로 파일 암호화. (32, 128k) 모드 고정.
    func Decrypt(str before, str after, byte[] akey) -> error
    # 32B akey로 파일 복호화. (core, chunk)는 암호화 파일에 따름.

    .Metadata byte[] # 메타데이터 (18B), 사진위장과 보조헤더는 사용하지 않음.
    .Mainhead byte[] # 메인헤더

struct G3kv3
    func Encrypt(str pw, byte[] kf, str path) -> error
    # path 폴더를 func+kv3 모드로 암호화.
    func Decrypt(str pw, byte[] kf, str path) -> error
    # path 폴더를 func+kv3 모드로 복호화.
    func View(str path) -> error
    # 암호화된 폴더의 정보 해석.

    .Hint str # kv3 암호화의 비밀번호 힌트.

struct G3kpic
    func Init(str path, int row, int col) -> error
    # 주형 사진 설정. 빈 문자열로 기본주형사진 사용.
    # 가로세로 크기는 모두 4의 배수 혹은 -1로 사진크기 그대로 설정. png만 사용 가능.
    func Detect(str path) -> (str, int, error)
    # 폴더 안에 gen3kpic 파일을 감지, 이름과 개수 반환. png 모드만 사용함.
    func Pack(str tgt, str exdir) -> (str, int)
    # tgt 파일을 패키징해 exdir 폴더 내부에 사진들 생성. 사진 이름과 개수 반환.
    func Unpack(str path, str tgtdir, str name, int num)
    # tgtdir 폴더에서 name, num 데이터로 gen3kpic 사진들을 path 파일로 복구.

    .Pcover bool # 사진 위장 사용 여부. True면 2배수 모드, False면 1배수 모드.

func G3picre(byte[] pic, str[] files, str path) -> error
# files 파일들을 pic 위장사진헤더를 가진 zip으로 path 경로에 압축시킴.

gen4: struct G4enc func Encrypt(str[] files, byte[] pw) -> (str, error) # 파일들 암호화, 첫 번째 암호화 대상 파일과 같은 폴더에 암호화된 파일 생성, 해당 경로 반환됨. func Decrypt(str path, byte[] pw) -> error # 암호파일과 같은 폴더에 원본 파일 복구. func View(str path) -> error # 암호화된 파일의 정보 해석.

    .Hint str # gen4enc (KAESL-OTE1) 비밀번호 힌트.

func G4DBread(str raw) -> (G4data content)[str name]
# gen4kdb 텍스트를 읽고 이름-데이터 쌍의 해시맵을 반환.
func G4DBwrite((G4data content)[str name] data) -> str
# 이름-데이터 쌍의 해시맵에서 gen4kdb 텍스트 생성.
struct G4data
    func Set(interface data) -> error
    # 바이트열/문자열/정수/실수 값으로 데이터 설정.

    .ByteV byte[] # 바이트 값 저장 위치
    .StrV str # 문자열 값 저장 위치
    .IntV int # 정수 값 저장 위치
    .FloatV float # 실수 값 저장 위치
    .Dtype rune # 데이터 값 종류. ('b', 's', 'i', 'f', 'n')

struct G4io
    func OpenB(byte[] raw, bool isreader)
    # raw를 내부 버퍼로 하는 B모드 읽기/쓰기 구조체 설정.
    func OpenF(str path, bool isreader) -> error
    # path 경로로 F모드 읽기/쓰기 구조체 설정.
    func CloseB() -> byte[]
    # B모드 읽기/쓰기를 종료하고 내부 버퍼 반환.
    func CloseF()
    # F모드 내부 파일 포인터를 닫음.
    func Size() -> int
    # 버퍼/파일의 크기 반환.
    func Seek(int pos)
    # 버퍼/파일의 읽기 기준위치 설정.
    func Read(int size) -> byte[]
    # size 크기만큼 읽고 바이트열 반환.
    # 만약 읽기 데이터가 부족하다면 size보다 작은 크기로 반환.
    # 읽기 기준위치는 같은 크기만큼 뒤로 이동.
    func Write(byte[] chunk)
    # 바이트열을 버퍼에 이어붙임/파일에 쓰기.

    .IsBin bool # 바이너리 모드 여부. True면 binary, False면 file 모드.
    .IsReader # 읽기 용도인지 여부. True면 읽기만 가능, False면 쓰기만 가능.

struct G4kaesall
    func EnBin(byte[] pw, byte[] kf, byte[] data) -> (byte[], error)
    # 바이트열 암호화. 암호화 결과물 반환. (사진 위장헤더 포함)
    func EnFile(byte[] pw, byte[] kf, str path) -> (str, error)
    # 파일 암호화. 암호화 대상 파일과 같은 위치에 새 파일 생성. 암호파일 경로 반환.
    func DeBin(byte[] pw, byte[] kf, byte[] data) -> (byte[], error)
    # 바이트열 복호화. 복호화 결과물 반환. (원본이름 복구기능 없음)
    func DeFile(byte[] pw, byte[] kf, str path) -> (str, error)
    # 파일 복호화. 복호화 대상 파일과 같은 위치에 새 파일 생성. 원본파일 경로 반환.
    func ViewBin(byte[] data) -> error
    # 암호화 바이트열의 정보 해석.
    func ViewFile(str path) -> error
    # 암호화 파일의 정보 해석.

    .Hint byte[] # 비밀번호 힌트.

struct G4kaesfunc
    func Encrypt(byte[] mkey) -> error
    # 48B mkey로 암호화.
    func Decrypt(byte[] mkey) -> error
    # 48B mkey로 복호화.

    .Inbuf G4io # 입력버퍼 (읽기전용), Open/Close 작업은 모듈 사용자가 처리해야 함.
    .Exbuf G4io # 출력버퍼 (쓰기전용), Open/Close 작업은 모듈 사용자가 처리해야 함.

func InitKV4(str path) -> g4kv4*
# 클러스터 경로로 path를 설정하고 내부 필드를 초기화한 구조체 반환.
struct g4kv4
    func View() -> error
    # 암호화된 클러스터 정보 해석.
    func Read(byte[] pw, byte[] kf, str newpath) -> error
    # 암호화된 클러스터를 newpath 폴더 아래에 복호화. bin/main 폴더가 생성됨.
    func Write(byte[] pw, byte[] kf, str tgtpath) -> error
    # 일반 폴더 tgtpath에서 암호화 클러스터 생성. 클러스터 main 안에 tgtpath가 있는 구조로 생성됨.

    .Path str # 클러스터 경로. (클러스터 읽기/쓰기 모두)
    .Hint byte[] # 클러스터 비밀번호 힌트.

이 라이브러리는 오래된 데이터 형식의 읽고쓰기를 지원하기 위해 만들어졌으며, 시험 버전이기에 충분한 테스트를 거치지 않았습니다. 사용 시 원본 python 코드를 기준으로 하십시오. (원본 py코드가 잘못 짜인 오류까지도 따라서 구현함)

!!! 폴더 자동초기화 주의. G3kzip.Unpack: "./temp261/", G3picre: "./temp365/" !!!

!! G2enc 패딩, G3kaes 보조 키 생성 과정의 원본 python 코드가 잘못 구현되어 있음. !!

G1ENC { magicnum : 4B; .kos // 버전 식별자. salt : 40B // salt 바이트. pwhash : 32B // 비밀번호 해시. hint : 324B // 최대 324B 길이 비밀번호 힌트.

data : nB // 암호화 데이터의 길이는 원본과 같음.

}

G2ENC { magicnum : 4B; kos2 // 버전 식별자. salt : 80B // salt 바이트. pwhash : 64B // 비밀번호 해시. hint : 600B // 최대 600B 길이 비밀번호 힌트. encname : 256B // 암호화된 파일명. 0x00으로 패딩됨. namelen : 2B // 원본파일명 길이. namemode : 2B // 이름숨김 모드에 따라 hi 또는 op. header md5 : 16B // 앞 7개 항목의 md5 해시값.

data : 16nB // 암호화 데이터는 16배수로 패딩됨.
// 파이썬 버전은 원본길이가 16배수인 경우 0x16이 아닌 0x00을 16개 패딩하는 오류가 존재.

}

G3KDB { 유니코드 기반 구조적 데이터 형식. [이름] {값}. 중괄호 안에 다른 구조체가 포함될 수 있음. 값으로는 정수, 실수, 문자열, 리스트가 가능. 이름에 # 포함 시 주석. 문자열 포메팅은 ## : #, #" : ", #s : 공백, #n : 줄바꿈 [x0]{[x1]{123}[x2]{45.6000}[x3]{"가나다abc"}[y0]{[y1]{128,"###"#s#n"}}} }

G3KZIP { prehead : 1024nB // 위장용 사진 헤더. mainhead : 18B { magicnum : 4B; KTS2 // 버전 식별자. reserved : 2B // 예약됨. (현재 사용하지 않음) chunknum : 3B // 청크 개수. typelen : 1B // type 길이. sizelen : 1B // size 길이. namelen : 3B // name 길이. crc32data : 4B // 모든 subheader을 이어붙인 것의 CRC32 값. }

chunk *N {
    subheader : (type + size + name)B // S (폴더 구조 정보), F (파일 바이너리).
    data : nB // F 모드는 파일 데이터.
    // S 모드는 내부 폴더를 리스트로 나열함. [folders]{[data]{"x0","x0/x1"}}
}
trash : nB // 모든 청크 종료 후에 오는 값은 쓰레기값.

}

G3KAES { prehead : 1024nB // 위장용 사진 헤더. metadata : 18B { magicnum : 4B; KES3 // 버전 식별자. reserved : 2B // 예약됨. (현재 사용하지 않음) mhsize : 4B // mainhead 크기. shsize : 4B // subhead 크기. crc32data : 4B // mainhead + subhead의 CRC32 값. } mainhead : nB // 병렬처리와 파일이름에 대한 데이터가 존재. // all-mode : (core, chunksize, ckeydt, salt, pwhash, hint, tkeydt, enctitle) // func-mode : (core, chunksize, iv, ckeydt) subhead : nB // 현재 사용하지 않는 보조헤더.

data : 16nB // 데이터는 chunksize 크기로 분할되며, 한번에 core개 만큼 병렬처리됨.
// chunksize는 16의 배수로 설정되기에, padding은 마지막 청크에 한해 계산됨.

}

G3KPIC { 사진 바이너리에 데이터를 분할하여 숨김. 1x 모드는 원본 사진과 무관하게 사진 1 바이트당 데이터 1 바이트 할당. 2x 모드는 원본 사진의 하위 4비트를 이용해 사진 2 바이트당 데이터 1 바이트 할당. RGB 256 값 중 16으로 나눈 몫은 유지하고 나머지를 이용해 인코딩. 데이터를 16으로 나눈 몫과 나머지를 순서대로 (빅엔디안) 사진과 결합.

사진 파일은 가로세로가 모두 4의 배수여야 하며, 색이 24비트여야 함.
이때 2x 모드는 사진 한 장당 row * col * 3 / 2 만큼 저장 가능.
데이터가 사진 저장 크기와 맞지 않는 경우에는 뒤에 0 패딩을 하기에 kzip같은 방식과 조합하여야 함.

}

G3PICRE { 앞에 일반 사진 파일이 오게 하고, 뒤에 zip 파일을 위치시킴. zip 헤더를 적절히 조절하여 사진과 압축파일 모두로 작동할 수 있게 함.

zip {
    chunk *N {
        local file head
        compressed file data
    }
    central head *N // 각 local file head의 시작 오프셋이 존재.
    zip mainhead *1 // central head의 시작 오프셋이 존재.
}
앞에 사진파일을 추가하며 zip mainhead, central head의 오프셋을 수정하는 원리.

}

G4ENC { magicnum : 4B; OTE1 // 버전 식별자. hintlen : 2B // 힌트 길이. hint : nB // 힌트 바이트열. salt : 32B // 비밀번호 salt. pwhash : 32B // 비밀번호 hash. cketdata : 128B // encrypted content key. iv : 16B // plain iv 바이트열.

data : 16nB // G3KAES와 비슷하게 병렬처리됨. (core, chunk)는 (32, 128k)로 고정.

}

G4KDB { 바이트열, 문자열, 정수, 실수의 간단한 텍스트 형식 기록. 모두 대문자로 기록되며, 식별자가 모두 대문자. 각 항목 사이 구분은 줄바꿈 문자. 바이트열/문자열은 hex 출력값을, 정수/실수는 그대로 문자열화한 값을 적음. 형식 : name(type)data\n DATA0(BYTES)16C3\nDATA1(STR)414243\nDATA2(INT)42\nDATA3(FLOAT)0.123 }

G4KAES { prehead : 128nB // 위장용 사진 헤더. magicnum : 5B; KAES4 // 버전 식별자. mhsize : 3B // mainhead 길이. mainhead : nB // bin/file 여부, all/func 모드에 따라 포함된 필드가 다름. // all-mode-bin : (MODE, SALT, PWH, CKDT, HINT), all-mode-file : (TKDT, NMDT) 추가됨. // func-mode : (MODE, CKDT)

data : 16nB // G3KAES와 비슷하게 병렬처리됨. (core, chunk)는 (32, 128k)로 고정.

}

G4KV4 { header { magicnum : 4B; KV4H // 버전 식별자. mhsize : 8B // mainhead 크기. mainhead : nB // 6개 필드를 가진 mainhead. fssize : 8B // filesys 크기. filesys : 16nB // filesys 크기. fksize : 8B // filekey 크기. filekey : 16nB // filekey 크기. }

mainhead {
    MODE, SALT, PWH, AKDT, TKDT, HINT 필드를 가짐.
    akey로 filekey가 암호화되고, tkey로 filesys가 암호화됨.
}

filesys {
    가상 파일 시스템은 휴지통 역할의 bin과 저장소 역할의 main으로 나눠 구현됨.
    각 폴더는 하위 폴더와 파일을 가질 수 있으며, 더 하위일수록 "깊이"가 깊어짐.
    이 관계는 파일과 폴더 각 항목을 줄바꿈 문자로 구분하는 이진 파일 형태로 저장됨.
    형식 : 깊이 + 식별자 + 이름 + 추가데이터
    식별자는 폴더는 #, 일반파일은 $, G3KZIP 처리된 폴더파일은 &.
    폴더는 추가데이터가 없으며, 파일형의 경우 슬래시 + fptr이 붙음.

    0#bin
    1#trashdir
    1&trashfile/............
    0#main
    1#upfolder
    2#midfolder
    3#downfolder
    3$data/............
    2$data/............
}

filekey {
    모든 파일은 고유한 fptr : 12B과 fkey : 48B를 가짐.
    fptr을 오름차순 정렬되는 순서로 fptr + fkey : 60B씩 이어붙여
    filekey 바이너리를 생성함. (즉 filekey의 길이는 60 * 파일 수)
}

클러스터란 헤더, 청크(암호화된 파일들이 모여있는 폴더)가 모여있는 폴더를 말함.
각 청크 안의 파일 개수는 maxnum에 의해 결정됨.
모든 클러스터 안의 파일은 대응되는 fptr을 가지며,
폴더는 filesys에 적힌 가상의 관계도에 의해 생성됨.

}

# Functions

gen3 kaes basic keyfile.
gen3 kpic basic mold picture (png).
gen3 kaes icon picture (png).
gen3 picre, zip pic + files.
gen3 kzip icon picture (png).
gen4 kdb read db, returns nil if error.
gen4 kdb write db.
gen4 kaes basic keyfile.
gen4 kaes icon picture (png).
read file (keyfile).
gen4 kv4 init g4kv4 struct, cluster path.

# Structs

gen1 enc.
gen2 enc.
gen3 kdb data node.
gen3 kaes all-mode.
gen3 kaes func-mode.
gen3 kdb database.
gen3 kpic.
gen3 kaes kv3 (simple vault).
gen3 kzip.
gen3 kdb obj/data node.
gen4 kdb data node.
gen4 enc.
gen4 kaes universal reader/writer.
gen4 kaes all-mode.
gen4 kaes func-mode.