/*
函数名:    rsaSign
        rsa 签名算法实现对文件的签名
参 数:
        filePathIn ,     待签名文件
        priKey ,        签名私钥文件
返回值:
        签名后文件名
        错误信息
创立工夫及创建者:
        2021-06-15    Yuan_sr
*/
func rsaSign (filePathIn, priKey string) (string, error){

    //1.关上磁盘的私钥文件
    file, err := os.Open(priKey)
    if err != nil {
        return "", err
    }
    defer file.Close()
    //2.将私钥文件中的内容读出
    fileInfo, err := file.Stat()
    if err != nil {
        return "", err
    }
    buf := make([]byte, fileInfo.Size())
    _, err = file.Read(buf)
    if err != nil {
        return "", err
    }
    //3.应用pem对数据解码,失去pem.Block构造体变量
    block, _ := pem.Decode(buf)
    //4.x509将数据解析成私钥构造体失去私钥
    privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return "", err
    }
    //5.创立一个哈希对象
    hash := sha256.New()

    inFile, err := os.Open(filePathIn)
    if err != nil {
        return "", err
    }
    defer inFile.Close()

    for {
        n, err := inFile.Read(buf)
        if err == io.EOF{
            break
        }
        if err != nil && err != io.EOF {
            return "", err
        }
        _, err = hash.Write(buf[:n])
        if err != nil {
            return "", err
        }
    }
    hashed := hash.Sum(nil)
    signText, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
    if err != nil {
        return "", err
    }

    outFile, err := os.Create(signFileName)
    if err != nil {
        return "", err
    }
    defer outFile.Close()
    outFile.Write(signText)

    return signFileName, nil
}

/*
函数名:    rsaVerify
        rsa 验签算法实现对文件的验签
参 数:
        encFile ,         密文文件
        signFile ,        签名文件
        pubKey ,        验签公钥
返回值:
        验签后果
        错误信息
创立工夫及创建者:
        2021-06-15    Yuan_sr
*/
func rsaVerify(encFile, signFile, pubKey string) (bool, error) {

    //1.关上磁盘公钥文件
    file, err := os.Open(pubKey)
    if err != nil {
        return false, err
    }
    defer file.Close()
    fileInfo, err := file.Stat()
    if err != nil {
        return false, err
    }
    buf := make([]byte, fileInfo.Size())
    _, err = file.Read(buf)
    if err != nil {
        return false, err
    }
    //2.应用pem解码失去pem.block构造体变量
    block, _ := pem.Decode(buf)
    //3.应用x509对pem.block中的变量进行解析失去一个公钥接口
    pubKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return false, err
    }
    //4.进行类型断言失去公钥构造体
    publicKey := pubKeyInterface.(*rsa.PublicKey)
    //5.进行哈西运算
    hash := sha256.New()

    inFile, err := os.Open(dvOutPath + encFile)
    if err != nil {
        return false, err
    }
    defer inFile.Close()

    for {
        n, err := inFile.Read(buf)
        if err == io.EOF{
            break
        }
        if err != nil && err != io.EOF {
            return false, err
        }
        _, err = hash.Write(buf[:n])
        if err != nil {
            return false, err
        }
    }
    hashed := hash.Sum(nil)
    //6.读取承受到的签名值
    sr, err := os.Open(dvOutPath + signFile)
    if err != nil {
        return false, err
    }
    defer sr.Close()
    srInfo, err := sr.Stat()
    if err != nil {
        return false, err
    }
    srBuf := make([]byte, srInfo.Size())
    _, err = sr.Read(srBuf)
    if err != nil {
        return false, err
    }

    //7.签名认证
    err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed, srBuf)
    if err != nil {
        return false, err
    }
    return true, nil
}