2021SC@SDUSC
本篇博客是上一篇的延續,也是介紹一些libsecp256k1位元幣密碼演算法中定義的資料結構和函式,我認為,在分析核心代碼之前,應當了解一下演算法用到的一些基礎資料結構和演算法,以便于后續的理解,
1、以壓縮格式序列化ECDSA簽名,

回傳:1
Args:ctx:secp256k1背景關系物件
Out:output64:指向存盤壓縮序列化的64位元組陣列的指標
In:sig:指向已初始化簽名物件的指標
2、驗證ECDSA簽名,

回傳:
1:正確的簽名
0:簽名不正確或不可決議
Args:ctx:secp256k1背景關系物件,已初始化以進行驗證,
In:sig:正在驗證的簽名,
msghash32:正在驗證的32位元組訊息哈希,驗證器必須確保應用加密,散列函式本身會將訊息轉換為散列函式,而不直接接受msghash32值,否則,就很容易做到在不知道密鑰的情況下創建“有效”簽名
pubkey:指向要驗證的初始化公鑰的指標,為避免接受可塑性簽名,僅接受lower-S形式的ECDSA簽名,
3、將簽名轉換為規范化的lower-S格式,

回傳:
如果sigin未規范化,則回傳1;
如果已規范化,則回傳0,
Args:ctx:secp256k1背景關系物件
Out:sigout:指向簽名的指標,用于填充規范化表單,或者在輸入已經規范化的情況下進行復制,(如果您只關心輸入是否已規范化,則可以為NULL),
In:sigin:指向要檢查/規范化的簽名的指標(可以與sigout相同)使用ECDSA,第三方可以偽造第二個不同的簽名訊息,提供單個初始簽名,但不知道密鑰,這是通過將S值與曲線的順序求反來實作的,“翻轉”不包含在簽名中的隨機點R的符號,偽造同一訊息并不是普遍存在的問題,但在訊息可塑性或簽名唯一性很重要的系統中,這可能會導致問題,所有驗證者都可以阻止這種偽造,迫使簽名者使用規范化形式,當使用可變長度編碼(如DER)時,lower-S形式平均略微減小簽名的大小,并且驗證成本較低,讓它成為一個好的選擇,始終使用lower-S的安全性得到了保證,因為任何人都可以在事后修改簽名以強制執行此屬性,
4、定義一種生成函式

RFC6979的一種實作(使用HMAC-SHA256)作為nonce生成函式,如果傳遞資料指標,則假定它是指向32位元組額外熵的指標,
5、安全臨時值生成函式

默認的安全臨時值生成函式(當前等于secp256k1臨時值函式\U rfc6979)
6、創建ECDSA簽名,

回傳:
1:已創建簽名
0:nonce生成函式失敗,或密鑰無效,
Args:ctx:指向背景關系物件的指標,已初始化用于簽名,
Out:sig:指向將放置簽名的陣列的指標,
In:msghash32:正在簽名的32位元組訊息哈希,
seckey:指向32位元組密鑰的指標,
noncefp:指向nonce生成函式的指標,如果為空,則使用secp256k1_nonce_function_default,
ndata:指向nonce生成函式使用的任意資料的指標(可以為空),如果它是非NULL且如果使用secp256k1_nonce_function_default,則ndata必須是指向32位元組附加資料的指標,創建的簽名始終為小寫形式,
7、驗證ECDSA密鑰,

當密鑰被解釋為整數時,如果該密鑰不為0且小于secp256k1曲線順序,則該密鑰有效(最高有效位元組優先),隨機均勻選擇32位元組字串的概率,該字串是無效的密鑰可以忽略不計,
回傳:
1:密鑰有效
0:密鑰無效
Args:ctx:指向背景關系物件的指標,
In:seckey:指向32位元組密鑰的指標
8、計算密鑰的公鑰,

回傳:
1:機密有效,公鑰存盤,
0:機密無效,請重試,
Args:ctx:指向背景關系物件的指標,已初始化用于簽名,
Out:pubkey:指向已創建公鑰的指標,
In:seckey:指向32位元組密鑰的指標,
9、在適當的位置否定密鑰,

回傳:
如果給定的密鑰無效,則為0
secp256k1_ec_seckey_驗證,正確為1
Args:ctx:指向背景關系物件的指標
In/Out:seckey:指向要求反的32位元組密鑰的指標,
密鑰無效:secp256k1_ec_seckey_verify,此函式回傳0和seckey將被設定為某個未指定的值,
10、在適當的位置否定公鑰,

回傳:1始終
Args:ctx:指向背景關系物件的指標
In/Out:pubkey:指向要求反的公鑰的指標
11、通過向密鑰添加調整來調整密鑰,

如果引數無效或生成的密鑰無效(僅當調整是密鑰的否定時),則回傳0,否則回傳1,
Args:ctx:指向背景關系物件的指標,
輸入/輸出:seckey:指向32位元組密鑰的指標,如果根據secp256k1_ec_seckey_verify,密鑰無效,則函式回傳0,如果此函式回傳0,則seckey將設定為某個未指定的值,
In:tweak32:指向32位元組調整的指標,如果根據secp256k1_ec_seckey_verify,調整無效,則此函式回傳0,對于均勻隨機的32位元組陣列,無效的可能性可以忽略不計(大約1/2^128),
12、通過向公鑰添加調整次數生成器來調整公鑰,

如果引數無效或生成的公鑰無效,則回傳0(僅當調整是對應密鑰的否定時),否則回傳1,
Args:ctx:指向為驗證而初始化的背景關系物件的指標,
In/Out:pubkey:指向公鑰物件的指標,如果此函式回傳0,則pubkey將設定為無效值,
In:tweak32:指向32位元組調整的指標,如果根據secp256k1_ec_seckey_verify,調整無效,則此函式回傳0,對于均勻隨機的32位元組陣列,無效的可能性可以忽略不計(約為1/2^128),
13、通過將密鑰數乘調整來調整密鑰,

如果引數無效,則回傳0,否則回傳1,
Args:ctx:指向背景關系物件的指標,
輸入/輸出:seckey:指向32位元組密鑰的指標,如果根據secp256k1_ec_seckey_verify,密鑰無效,則函式回傳0,如果此函式回傳0,則seckey將設定為某個未指定的值,
In:tweak32:指向32位元組調整的指標,如果根據secp256k1_ec_seckey_verify,調整無效,則此函式回傳0,對于均勻隨機的32位元組陣列,無效的可能性可以忽略不計(約為1/2^128),
14、通過將公鑰數乘調整值來調整公鑰,

如果引數無效,則回傳0,否則回傳1,
Args:ctx:指向為驗證而初始化的背景關系物件的指標,
In/Out:pubkey:指向公鑰物件的指標,如果此函式回傳0,則pubkey將設定為無效值,
In:tweak32:指向32位元組調整的指標,如果根據secp256k1_ec_seckey_verify,調整無效,則此函式回傳0,對于均勻隨機的32位元組陣列,無效的可能性可以忽略不計(約為1/2^128),
15、更新背景關系隨機化以防止側通道泄漏,

回傳:
1:隨機化已成功更新或沒有要隨機化的內容
0:錯誤
Args:ctx:指向背景關系物件的指標,
In:seed32:指向32位元組隨機種子的指標(NULL重置為初始狀態),而secp256k1代碼被寫入為常量時間,無論秘密值是什么,未來的編譯器可能會輸出否,而且CPU可能不會發射相同的無線電頻率或為所有值提取相同的功率,此函式提供一個種子,該種子被組合到盲值中:該盲值在每次乘法之前被添加(之后被洗掉),因此不會影響函式結果,但可以抵御依賴于任何輸入依賴行為的攻擊,此函式當前僅對初始化用于簽名的背景關系有效,因為隨機化當前僅用于簽名,但是,這并不能保證,將來可能會發生變化,在未初始化簽名的背景關系上呼叫此函式是安全的;然后它將無效并回傳1,
16、將多個公鑰添加到一起,

回傳:
1:公鑰的總和是有效的,
0:公鑰的總和無效,
Args:ctx:指向背景關系物件的指標,
Out:Out:指向用于放置結果公鑰的公鑰物件的指標,
In:ins:指向公鑰指標陣列的指標,
n:要加在一起的公鑰數(必須至少為1),
17、計算BIP-340中定義的標記哈希,

這對于創建訊息散列和通過特定于應用程式的標記實作域分離非常有用,此函式回傳SHA256(SHA256(標記)| | SHA256(標記)| | msg),因此,針對特定標記優化的標記哈希實作可以在對標記哈希進行哈希處理后預計算SHA256狀態,如果引數無效,則回傳0,否則回傳1,
Args:ctx:指向背景關系物件的指標
Out:hash32:指向32位元組陣列的指標,用于存盤結果哈希
In:tag:指向包含標記的陣列的指標
taglen:標記陣列的長度
msg:指向包含訊息的陣列的指標
msglen:訊息陣列的長度
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306040.html
標籤:區塊鏈
