2016-02-28 7 views
1

Я сделал частные и публичные ключи файлы как(Erlang) Got ошибка при разборе ECSDA открытого ключа PEM файл

openssl ecparam -name secp256k1 -genkey -out gen.pem 

openssl ec -in gen.pem -pubout -out gen.pub 

Затем я проверил .pub файл

openssl pkey -in gen.pub -pubin -text -noout 

Public-Key: (256 bit) 
pub: 
    04:fc:de:4f:2a:77:bd:c4:f2:74:2b:ba:b5:fc:85: 
    e4:aa:96:a7:8e:86:14:bc:0d:fa:8e:d2:dd:50:3c: 
    5d:fa:f4:07:f4:17:80:49:06:19:0c:72:03:63:4e: 
    07:37:e9:10:64:c8:33:a4:a3:7e:26:d8:df:79:21: 
    d7:2d:a6:01:80 
ASN1 OID: secp256k1 

После этого старта Эрл

erl 
Erlang/OTP 18 [erts-7.2] [source-e6dd627] [64-bit] [smp:3:3] [async-threads:10] [hipe] [kernel-poll:false] 

После выполнения команд

1>rr(public_key), 
    {ok,RawData} = file:read_file("gen.pub"), 
    Decoded = public_key:pem_decode(RawData), 
    [public_key:pem_entry_decode(X) || X <- Decoded ]. 

я получил исключение

** exception error: no match of right hand side value 
        {error,{asn1,{invalid_length,1}}} 
    in function public_key:der_decode/2 (public_key.erl, line 229) 

Я знаю, что существуют обходные пути, но мне интересно, если я делаю что-то неправильно или есть ошибки в открытых ключей модулей?

UPD 1.

Когда мы смотрим на результат

{ok,#'SubjectPublicKeyInfo'{algorithm = #'AlgorithmIdentifier'{algorithm = {1,2,840,10045,2,1}, 
                  parameters = <<6,5,43,129,4,0,10>>}, 
         subjectPublicKey = <<4,241,200,19,168,25,25,81,43,216, 
              89,201,37,62,66,39,166,231,161,98, 
              223,133,119,12,...>>}} 

мы можем увидеть в следующем:

{1,2,840,10045,2,1} является подъязычная из ecPublicKey http://oid-info.com/get/1.2.840.10045.2.1

parameters = < < 6,5,43,129,4,0,10 >>

'OTP-PUB-KEY':decode('EcpkParameters',<<6,5,43,129,4,0,10>>). 

дает нам

{ok,{namedCurve,{1,3,132,0,10}}} 

и

pubkey_cert_records:namedCurves({1,3,132,0,10}). 

дает нам источник кривой - secp256k1 и

subjectPublicKey = <<4,241,200,19,168,25,25,81,43,216, 
        89,201,37,62,66,39,166,231,161,98, 
        223,133,119,12,...>> 

сам открытый ключ. Но это обходное решение, как я уже говорил.

ответ

1

Я попробовал свои шаги, и он работал на меня сразу:

[email protected]:~/test % openssl ecparam -name secp256k1 -genkey -out gen.pem 

[email protected]:~/test % openssl ec -in gen.pem -pubout -out gen.pub 
read EC key 
writing EC key 

[email protected]:~/test % openssl pkey -in gen.pub -pubin -text -noout 
Public-Key: (256 bit) 
pub: 
    04:f1:c8:13:a8:19:19:51:2b:d8:59:c9:25:3e:42: 
    27:a6:e7:a1:62:df:85:77:0c:ef:f7:0e:0e:19:93: 
    df:e6:f5:42:66:7e:ee:02:07:76:85:19:a4:a8:2d: 
    03:11:73:0c:b2:d4:4c:c7:0e:42:d3:30:b5:51:e3: 
    97:45:f8:b5:6a 
ASN1 OID: secp256k1 

[email protected]:~/test % erl 
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V7.2.1 (abort with ^G) 

1> rr(public_key). 
['AAControls','ACClearAttrs','AccessDescription', 
'Algorithm','AlgorithmIdentifier', 
'AlgorithmIdentifierPKCS-10','AlgorithmIdentifierPKCS-8', 
'AlgorithmIdentifierPKCS5v2-0','AlgorithmIdentifierPKSC-7', 
'AlgorithmNull','AnotherName','AttCertValidityPeriod', 
'Attribute','AttributeCertificate', 
'AttributeCertificateInfo','AttributePKCS-10', 
'AttributePKCS-7','AttributeTypeAndValue', 
'Attributes_SETOF', 
'Attributes_SETOF_valuesWithContext_SETOF', 
'AuthorityKeyIdentifier','BasicConstraints', 
'BuiltInDomainDefinedAttribute','BuiltInStandardAttributes', 
'Certificate','CertificateList','CertificationRequest', 
'CertificationRequestInfo', 
'CertificationRequestInfo_attributes_SETOF'|...] 

2> {ok,Data}=file:read_file("gen.pub"). 
{ok,<<"-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8cgTqBkZUSvYWcklPkInpuehYt+Fdwzv\n9w4OGZPf5vVCZn7u"...>>} 

3> Dec=public_key:pem_decode(Data). 
[#'SubjectPublicKeyInfo'{algorithm = <<48,86,48,16,6,7,42, 
             134,72,206,61,2,1, 
             6,5,43,129,4,0,10, 
             3,66,0,4,241,200, 
             ...>>, 
         subjectPublicKey = not_encrypted}] 

Моя версия OpenSSL:

[email protected]:~/test % openssl version 
OpenSSL 1.0.1p-freebsd 9 Jul 2015 

система является FreeBSD 10.2-RELEASE. Версия Erlang находится в выводе оболочки выше. gen.pub ключ, который он произвел для меня (если вы хотите, чтобы попытаться загрузить его) является:

[email protected]:~/test % cat gen.pub 
-----BEGIN PUBLIC KEY----- 
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8cgTqBkZUSvYWcklPkInpuehYt+Fdwzv 
9w4OGZPf5vVCZn7uAgd2hRmkqC0DEXMMstRMxw5C0zC1UeOXRfi1ag== 
-----END PUBLIC KEY----- 

Вы, возможно, хотите, чтобы вставить ключ, так что я могу попытаться загрузить его?

Edit:

К сожалению, я пропустил последний шаг. Кажется, это ошибка в OTP-коде.Функция der_decode/2 вызывается с KeyType, установленным на ECPoint, см. pem_entry_decode/1 function. Но der_decode/2 expects Asn1Type. Вызов 'OTP-PUB-KEY' модуля непосредственно, кажется, работают:

8> Bin = hd(Dec)#'SubjectPublicKeyInfo'.algorithm. 
32> 'OTP-PUB-KEY':decode('SubjectPublicKeyInfo', Bin). 
{ok,#'SubjectPublicKeyInfo'{algorithm = #'AlgorithmIdentifier'{algorithm = {1, 
                      2,840,10045,2,1}, 
                   parameters = <<6,5,43,129,4,0,10>>}, 
          subjectPublicKey = <<4,241,200,19,168,25,25,81,43,216, 
               89,201,37,62,66,39,166,231,161,98, 
               223,133,119,12,...>>}} 

Однако я не уверен, если она возвращает ничего толкового. Возможно, стоит поднять ошибку в OTP с кодом, который вы разместили в этом вопросе в качестве шагов для воспроизведения. Тогда, по крайней мере, кто-то компетентный будет проверять, почему он не работает. Я уверен, что шаги, которые вы выполнили, прекрасны, и типы, возвращенные и переданные в дополнительные функции, в порядке до the documentation.

+0

Вы пропустили последний шаг, показанный на OP, который для случая вы можете запускать через 'public_key: pem_entry_decode (hd (Dec)).' Если вы запустите это в своем gen.pub, вы получите ту же ошибку, что и OP. –

+0

Правильно, спасибо, что указали это. Я добавлю изменения. – Amiramix

+0

Так как я думал, что это не особенность, это ошибка – DimaSUN

0

Я обнаружил, что линии в public_key.erl (строки 136-137)

'ECPoint' -> 
    der_decode(KeyType, Key0) 

должны быть заменены

'ECPoint' -> 
    {{KeyType,Key0},der_decode('EcpkParameters', Params)}