secp256k1 패키지

  • secp256k1 타원 곡선 및 곡선 상의 점에 대한 연산을 수행하는 함수를 제공합니다.

curve.go

  • 코블리츠 타원 곡선과 곡선 상의 점에 대한 연산(덧셈, 2배, 스칼라 곱)을 수행하는 함수를 정의합니다.
  • 자코비안 좌표계를 사용합니다.

BitCurve 구조체

  • secp256k1 y²=x³+7 방정식을 사용합니다.
  • 싱글톤 패턴을 사용합니다.
// BitCurve는 a=0인 코블리츠 타원곡선을 나타냅니다. (y²=x³+B)
// http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html 참조
type BitCurve struct {
	P       *big.Int // 체의 위수
	N       *big.Int // 생성점의 위수
	B       *big.Int // BitCurve 방정식의 상수 (y²=x³+B)
	Gx, Gy  *big.Int // 생성점의 (x,y)
	BitSize int      // 유한체의 비트 수
}

var theCurve = new(BitCurve)

func init() {
	// See SEC 2 section 2.7.1
	// curve parameters taken from:
	// http://www.secg.org/sec2-v2.pdf
	theCurve.P, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 0)  // 유한체의 위수
	theCurve.N, _ = new(big.Int).SetString("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 0)  // 생성점의 위수
	theCurve.B, _ = new(big.Int).SetString("0x0000000000000000000000000000000000000000000000000000000000000007", 0)  // BitCurve 방정식의 상수 7 (y²=x³+7)
	theCurve.Gx, _ = new(big.Int).SetString("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 0) // 생성점의 x좌표
	theCurve.Gy, _ = new(big.Int).SetString("0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 0) // 생성점의 y좌표
	theCurve.BitSize = 256                                                                                           // 유한체의 비트 수
}

scalar_mult_cgo.go

  • C 라이브러리를 임포트하여 스칼라 곱셈을 수행합니다.
//go:build !gofuzz && cgo
// +build !gofuzz,cgo

사이드 채널 공격에 대해 언급.

scalar_mult_nocgo.go

  • 미구현.
//go:build gofuzz || !cgo
// +build gofuzz !cgo

secp256.go

  • C 라이브러리를 임포트하여 secp256k1 타원 곡선 상의 점에 대한 서명 및 검증 함수를 정의합니다.

그 외

  • libsecp256k1 C 라이브러리를 불러와 사용하기 위한 파일들로 보입니다.