Stephan, On Sun, Jan 06, 2019 at 07:11:50PM +0100, Stephan Müller wrote: > Am Sonntag, 6. Januar 2019, 14:36:08 CET schrieb Vitaly Chikunov: > > > Add Elliptic Curve Russian Digital Signature Algorithm (GOST R > > 34.10-2012, RFC 7091, ISO/IEC 14888-3) is one of the Russian (and since > > 2018 the CIS countries) cryptographic standard algorithms (called GOST > > algorithms). Only signature verification is supported, with intent to be > > used in the IMA. > > Do you happen to have test vectors for the testmgr? Yes, I will add this. > > +/* Parse DER encoded subjectPublicKey. */ > > +static int ecrdsa_set_pub_key(struct crypto_akcipher *tfm, const void *ber, > > + unsigned int len) > > +{ > > + struct ecrdsa_ctx *ctx = akcipher_tfm_ctx(tfm); > > + unsigned int ndigits; > > + const u8 *k = ber; > > + unsigned int offset; > > + > > + /* First chance to zero ctx */ > > + memset(ctx, 0, sizeof(*ctx)); > > + > > + if (len < 3 || > > + k[0] != 0x04 || /* OCTET STRING */ > > + (k[1] < 0x80 && len != k[1] + 2) || > > + (k[1] == 0x81 && len != k[2] + 3) || > > + k[1] > 0x81) > > + return -EBADMSG; > > + offset = (k[1] < 0x80)? 2 : 3; > > + k += offset; > > + len -= offset; > > Why do you manually parse the ASN.1 structure instead of using the ASN.1 > parser? I am not sure this worth effort and will not be most degenerate use of asn1_ber_decoder, since 1) I only need to parse one type in each case: OCTET STRING string above code, and OIDs in below code; 2) this data is said to be in DER format, which asn1_ber_decoder can not enforce. Surely this will also produce more code and files. > > +/* Parse DER encoded SubjectPublicKeyInfo.AlgorithmIdentifier.parameters. > > */ +static int ecrdsa_set_params(struct crypto_akcipher *tfm, enum OID > > algo, + const void *params, unsigned int paramlen) > > +{ > > + struct ecrdsa_ctx *ctx = akcipher_tfm_ctx(tfm); > > + const u8 *p = params; > > + int i; > > + > > + if (algo == OID_gost2012PublicKey256) { > > + ctx->digest = "streebog256"; > > + ctx->digest_oid = OID_gost2012Digest256; > > + ctx->digest_len = 256 / 8; > > + } else if (algo == OID_gost2012PublicKey512) { > > + ctx->digest = "streebog512"; > > + ctx->digest_oid = OID_gost2012Digest512; > > + ctx->digest_len = 512 / 8; > > + } else > > + return -ENOPKG; > > + ctx->curve = NULL; > > + ctx->curve_oid = 0; > > + ctx->algo_oid = algo; > > + > > + for (i = 0; i < paramlen; i += p[i + 1] + 2) { > > + const struct ecc_curve *curve; > > + enum OID oid; > > + > > + if (paramlen - i < 2 || > > + p[i] != 0x06 || /* OBJECT IDENTIFIER */ > > Same here and in the following > > > + p[i + 1] > paramlen - i - 2) > > + return -EBADMSG; > > + oid = look_up_OID(p + i + 2, p[i + 1]); > > +MODULE_ALIAS_CRYPTO("ecrdsa"); > > I do not think you need that alias as the module name already will be named > this way. I guess you rather should add ecrdsa-generic as module alias. Thanks!